diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index df71e9e..451b3b2 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -123,6 +123,7 @@
 import java.text.ParseException;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -408,10 +409,6 @@
                     waitForCredentials();
                 }
             } else {
-                if (extra != null) {
-                    urlData.setPostData(extra
-                            .getByteArray(Browser.EXTRA_POST_DATA));
-                }
                 urlData.loadIn(webView);
             }
         } else {
@@ -464,8 +461,6 @@
             if (urlData.isEmpty()) {
                 urlData = new UrlData(mSettings.getHomePage());
             }
-            urlData.setPostData(intent
-                    .getByteArrayExtra(Browser.EXTRA_POST_DATA));
 
             final String appId = intent
                     .getStringExtra(Browser.EXTRA_APPLICATION_ID);
@@ -627,6 +622,7 @@
 
     private UrlData getUrlDataFromIntent(Intent intent) {
         String url = null;
+        Map<String, String> headers = null;
         if (intent != null) {
             final String action = intent.getAction();
             if (Intent.ACTION_VIEW.equals(action)) {
@@ -638,12 +634,18 @@
                         url += "?" + mimeType;
                     }
                 }
-                if ("inline:".equals(url)) {
-                    return new InlinedUrlData(
-                            intent.getStringExtra(Browser.EXTRA_INLINE_CONTENT),
-                            intent.getType(),
-                            intent.getStringExtra(Browser.EXTRA_INLINE_ENCODING),
-                            intent.getStringExtra(Browser.EXTRA_INLINE_FAILURL));
+                if (url != null && url.startsWith("http")) {
+                    String[] keys = intent
+                            .getStringArrayExtra(Browser.EXTRA_HEADERS_KEY);
+                    String[] values = intent
+                            .getStringArrayExtra(Browser.EXTRA_HEADERS_VALUE);
+                    if (keys != null && values != null && keys.length > 0
+                            && keys.length == values.length) {
+                        headers = new HashMap<String, String>();
+                        for (int i = 0; i < keys.length; i++) {
+                            headers.put(keys[i], values[i]);
+                        }
+                    }
                 }
             } else if (Intent.ACTION_SEARCH.equals(action)
                     || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
@@ -671,7 +673,7 @@
                 }
             }
         }
-        return new UrlData(url);
+        return new UrlData(url, headers);
     }
 
     /* package */ static String fixUrl(String inUrl) {
@@ -3887,15 +3889,17 @@
      * This base class uses loadUrl to show the content.
      */
     private static class UrlData {
-        String mUrl;
-        byte[] mPostData;
+        final String mUrl;
+        final Map<String, String> mHeaders;
 
         UrlData(String url) {
             this.mUrl = url;
+            this.mHeaders = null;
         }
 
-        void setPostData(byte[] postData) {
-            mPostData = postData;
+        UrlData(String url, Map<String, String> headers) {
+            this.mUrl = url;
+            this.mHeaders = headers;
         }
 
         boolean isEmpty() {
@@ -3903,38 +3907,9 @@
         }
 
         public void loadIn(WebView webView) {
-            if (mPostData != null) {
-                webView.postUrl(mUrl, mPostData);
-            } else {
-                webView.loadUrl(mUrl);
-            }
+            webView.loadUrl(mUrl, mHeaders);
         }
     };
 
-    /**
-     * A subclass of UrlData class that can display inlined content using
-     * {@link WebView#loadDataWithBaseURL(String, String, String, String, String)}.
-     */
-    private static class InlinedUrlData extends UrlData {
-        InlinedUrlData(String inlined, String mimeType, String encoding, String failUrl) {
-            super(failUrl);
-            mInlined = inlined;
-            mMimeType = mimeType;
-            mEncoding = encoding;
-        }
-        String mMimeType;
-        String mInlined;
-        String mEncoding;
-        @Override
-        boolean isEmpty() {
-            return mInlined == null || mInlined.length() == 0 || super.isEmpty();
-        }
-
-        @Override
-        public void loadIn(WebView webView) {
-            webView.loadDataWithBaseURL(null, mInlined, mMimeType, mEncoding, mUrl);
-        }
-    }
-
     /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null);
 }
