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
