diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java
index e5abebb..e25093f 100644
--- a/src/com/android/browser/FetchUrlMimeType.java
+++ b/src/com/android/browser/FetchUrlMimeType.java
@@ -23,6 +23,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.webkit.MimeTypeMap;
+import android.webkit.URLUtil;
 
 import com.android.browser.reflect.ReflectHelper;
 
@@ -38,6 +39,9 @@
 
 import org.codeaurora.swe.CookieManager;
 
+import android.widget.Toast;
+import com.android.browser.R;
+
 /**
  * This class is used to pull down the http headers of a given URL so that
  * we can analyse the mimetype and make any correction needed before we give
@@ -62,6 +66,8 @@
     private boolean mPrivateBrowsing;
     private long mContentLength;
 
+    private String mContentDisposition;
+
     public FetchUrlMimeType(Activity activity, String url, String userAgent,
             String referer, String auth, boolean privateBrowsing, String filename) {
         mActivity = activity;
@@ -74,8 +80,7 @@
         mAuth = auth;
     }
 
-    @Override
-    public void run() {
+    private String getMimeType(String url) {
         // User agent is likely to be null, though the AndroidHttpClient
         // seems ok with that.
         AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
@@ -91,17 +96,21 @@
         } catch (IllegalArgumentException ex) {
             Log.e(LOGTAG,"Download failed: " + ex);
             client.close();
-            return;
+            mFilename = null;
+            mUri = null;
+            return null;
         }
 
         HttpHead request;
         try {
-            URI uriObj = new URI(mUri);
+            URI uriObj = new URI(url);
             request = new HttpHead(uriObj.toString());
         } catch (URISyntaxException e) {
             Log.e(LOGTAG,"Encode URI failed: " + e);
             client.close();
-            return;
+            mFilename = null;
+            mUri = null;
+            return null;
         }
 
         String cookies = CookieManager.getInstance().getCookie(mUri, mPrivateBrowsing);
@@ -112,7 +121,6 @@
         HttpResponse response;
         String filename = mFilename;
         String mimeType = null;
-        String contentDisposition = null;
         String contentLength = null;
         try {
             response = client.execute(request);
@@ -132,21 +140,59 @@
                 if (contentLengthHeader != null) {
                     contentLength = contentLengthHeader.getValue();
                 }
+
+                if (contentLength != null) {
+                    mContentLength = Long.parseLong(contentLength);
+                } else {
+                    mContentLength = 0;
+                }
+
                 Header contentDispositionHeader = response.getFirstHeader("Content-Disposition");
                 if (contentDispositionHeader != null) {
-                    contentDisposition = contentDispositionHeader.getValue();
+                    mContentDisposition = contentDispositionHeader.getValue();
                 }
+
+                mFilename = URLUtil.guessFileName(url, mContentDisposition, mimeType);
+                mUri = url;
+            } else if (response.getStatusLine().getStatusCode() == 302) {
+                return getMimeType(response.getLastHeader("Location").getValue());
             }
         } catch (IllegalArgumentException ex) {
             if (request != null)
                 request.abort();
+            Log.e(LOGTAG, "Download failed: " + ex);
+            mFilename = null;
+            mUri = null;
         } catch (IOException ex) {
             if (request != null)
                 request.abort();
+            Log.e(LOGTAG, "Download failed: " + ex);
+            mFilename = null;
+            mUri = null;
         } finally {
             client.close();
         }
 
+        return mimeType;
+    }
+
+    @Override
+    public void run() {
+        String url = mUri;
+        String mimeType = getMimeType(mUri);
+        String filename = mFilename;
+
+        if (mUri == null) {
+            mUri = url; // Restore the intial value
+            mActivity.runOnUiThread(new Runnable() {
+                    public void run() {
+                        Toast.makeText(mActivity, R.string.cannot_download_generic,
+                                       Toast.LENGTH_SHORT).show();
+                    }
+                });
+            return;
+        }
+
         if (mimeType != null) {
             Log.e(LOGTAG, "-----------the mimeType from http header is ------------->" + mimeType);
             if (mimeType.equalsIgnoreCase("text/plain") ||
@@ -176,17 +222,11 @@
             if (newMimeType != null) {
                 mimeType = newMimeType;
             }
-            filename = guessFileNameEx(mUri, contentDisposition, mimeType);
+            filename = guessFileNameEx(mUri, mContentDisposition, mimeType);
 
         }
 
-        if (contentLength != null) {
-            mContentLength = Long.parseLong(contentLength);
-        } else {
-            mContentLength = 0;
-        }
-
-        DownloadHandler.startDownloadSettings(mActivity, mUri, mUserAgent, contentDisposition,
+        DownloadHandler.startDownloadSettings(mActivity, mUri, mUserAgent, mContentDisposition,
                 mimeType, mReferer, mAuth, mPrivateBrowsing, mContentLength, filename);
     }
 
