diff --git a/AndroidManifest.xml.jinja2 b/AndroidManifest.xml.jinja2
index a9fccd4..c605287 100644
--- a/AndroidManifest.xml.jinja2
+++ b/AndroidManifest.xml.jinja2
@@ -47,9 +47,7 @@
     <uses-permission android:name="{{ app_package_name }}.permission.WRITE_HOMEPAGE" />
     <uses-permission android:name="android.permission.VIBRATE"/>
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-
     <!-- Templatize taskAffinity otherwise it will default to 'package'
         defined in manifest -->
     <application   android:name="com.android.browser.Browser"
@@ -430,7 +428,8 @@
 
     </application>
 
-    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
+    <!-- CM 12.1+ -->
+    <uses-sdk android:minSdkVersion="22" android:targetSdkVersion="23" />
 
     {{ extra_supports_gl_texture }}
 
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7032029..f6b25f5 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -169,6 +169,18 @@
     }
 
     @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                                           int[] grantResults) {
+        if (getController().getCurrentWebView() != null) {
+            if (getController().getCurrentWebView().onRequestPermissionsResult(
+                    requestCode, permissions, grantResults)) {
+                return;
+            }
+        }
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    @Override
     protected void onNewIntent(Intent intent) {
         if (shouldIgnoreIntents()) return;
         EngineInitializer.onNewIntent(BrowserActivity.this, intent);
diff --git a/src/com/android/browser/DownloadSettings.java b/src/com/android/browser/DownloadSettings.java
index 32803de..05e7fe6 100644
--- a/src/com/android/browser/DownloadSettings.java
+++ b/src/com/android/browser/DownloadSettings.java
@@ -52,6 +52,8 @@
 import android.widget.Toast;
 import android.webkit.MimeTypeMap;
 import android.text.TextUtils;
+import android.content.pm.PackageManager;
+import android.Manifest.permission;
 
 import com.android.browser.reflect.ReflectHelper;
 
@@ -86,6 +88,8 @@
     private static final String APK_TYPE="apk";
     private static final String OCTET_STREAM = "application/octet-stream";
 
+    private int nextRequestCode = 2000;
+
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // initial the DownloadSettings view
@@ -242,15 +246,44 @@
                 return;
             }
 
-            // staring downloading
-            DownloadHandler.startingDownload(DownloadSettings.this,
-                    url, userAgent, contentDisposition,
-                    mimetype, referer, authorization, privateBrowsing, contentLength,
-                    Uri.encode(filename), downloadPath);
-            isDownloadStarted = true;
+            // check for permission
+            if (!hasPermission(permission.WRITE_EXTERNAL_STORAGE)) {
+                requestPermissions(new String[] {permission.WRITE_EXTERNAL_STORAGE},
+                    ++nextRequestCode);
+            } else {
+                download();
+            }
         }
     };
 
+    @Override
+    public void onRequestPermissionsResult(int requestCode,
+        String[] permissions, int[] grantResults) {
+        if (nextRequestCode == requestCode) {
+            if (grantResults.length > 0
+                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                download();
+            } else {
+                finish();
+            }
+        }
+    }
+
+    private void download() {
+        // staring downloading
+        DownloadHandler.startingDownload(DownloadSettings.this,
+                url, userAgent, contentDisposition,
+                mimetype, referer, authorization,
+                privateBrowsing, contentLength,
+                Uri.encode(filename), downloadPath);
+        isDownloadStarted = true;
+    }
+
+    private boolean hasPermission(String permission) {
+        return (checkCallingOrSelfPermission(permission)
+            == PackageManager.PERMISSION_GRANTED);
+    }
+
     private OnClickListener downloadCancelListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
@@ -271,6 +304,9 @@
 
     protected void onResume() {
         super.onResume();
+        if (isDownloadStarted) {
+            finish();
+        }
     }
 
     @Override
