diff --git a/src/com/android/browser/Browser.java b/src/com/android/browser/Browser.java
index 01b9706..5a30fad 100644
--- a/src/com/android/browser/Browser.java
+++ b/src/com/android/browser/Browser.java
@@ -22,6 +22,9 @@
 import android.util.Log;
 import android.os.Process;
 
+import org.chromium.content.browser.ResourceExtractor;
+import org.chromium.base.PathUtils;
+
 import org.codeaurora.swe.Engine;
 
 import com.android.browser.BrowserConfig;
@@ -36,10 +39,15 @@
     // Set to true to enable extra debug logging.
     final static boolean LOGD_ENABLED = true;
 
+    private static final String[] MP_MANDATORY_PAKS = new String[] {
+        "webviewchromium.pak",
+        "icudtl.dat"
+    };
+
     @Override
     public void onCreate() {
         super.onCreate();
-
+        initializeApplicationParameters();
         if (LOGV_ENABLED)
             Log.v(LOGTAG, "Browser.onCreate: this=" + this);
 
@@ -55,7 +63,13 @@
             Engine.initialize(context);
             BrowserSettings.initialize(context);
             Preloader.initialize(context);
-        }
+       }
+
+    }
+
+    public static void initializeApplicationParameters() {
+        ResourceExtractor.setMandatoryPaksToExtract(MP_MANDATORY_PAKS);
+        PathUtils.setPrivateDataDirectorySuffix("android_browser");
     }
 }
 
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 82109e9..01cd964 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -61,7 +61,6 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import org.codeaurora.net.NetworkServices;
 
 interface BookmarksPageCallbacks {
     // Return true if handled
@@ -436,9 +435,6 @@
         LoaderManager lm = getLoaderManager();
         lm.restartLoader(LOADER_ACCOUNTS, null, this);
 
-        //Notify about anticipated network activity
-        NetworkServices.HintUpcomingUserActivity();
-
         return mRoot;
     }
 
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index 9e19d11..fb291c9 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -109,7 +109,8 @@
         "com.android.browser.preferences.AdvancedPreferencesFragment",
         "com.android.browser.preferences.BandwidthPreferencesFragment",
         "com.android.browser.preferences.LabPreferencesFragment",
-        "com.android.browser.preferences.AboutPreferencesFragment"));
+        "com.android.browser.preferences.AboutPreferencesFragment",
+        "com.android.browser.AutoFillSettingsFragment"));
 
     @Override
     protected boolean isValidFragment(String fragmentName) {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 14a0793..ea1a60c 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -601,13 +601,29 @@
     }
 
     private void shareCurrentPage(Tab tab) {
-        if (tab != null) {
-            sharePage(mActivity, tab.getTitle(),
-                    tab.getUrl(), tab.getFavicon(),
-                    createScreenshot(tab.getWebView(),
-                            getDesiredThumbnailWidth(mActivity),
-                            getDesiredThumbnailHeight(mActivity)));
-        }
+        if (tab == null || tab.getWebView() == null)
+            return;
+
+        final Tab mytab = tab;
+        final ValueCallback<Bitmap> onScreenshot =  new ValueCallback<Bitmap>() {
+            @Override
+            public void onReceiveValue(Bitmap bitmap) {
+                sharePage(mActivity, mytab.getTitle(), mytab.getUrl(),
+                          mytab.getFavicon(), bitmap);
+            }
+        };
+
+        createScreenshotAsync(
+            tab.getWebView(),
+            getDesiredThumbnailWidth(mActivity),
+            getDesiredThumbnailHeight(mActivity),
+            new ValueCallback<Bitmap>() {
+                @Override
+                public void onReceiveValue(Bitmap bitmap) {
+                    sharePage(mActivity, mytab.getTitle(), mytab.getUrl(),
+                          mytab.getFavicon(), bitmap);
+                }
+            });
     }
 
     /**
@@ -2145,10 +2161,21 @@
 
     @Override
     public void bookmarkCurrentPage() {
-        Intent bookmarkIntent = createBookmarkCurrentPageIntent(false);
-        if (bookmarkIntent != null) {
-            mActivity.startActivity(bookmarkIntent);
-        }
+        WebView w = getCurrentTopWebView();
+        if (w == null)
+            return;
+
+        final Intent i = createBookmarkCurrentPageIntent(false);
+        createScreenshotAsync(
+            w, getDesiredThumbnailWidth(mActivity),
+            getDesiredThumbnailHeight(mActivity),
+            new ValueCallback<Bitmap>() {
+                @Override
+                    public void onReceiveValue(Bitmap bitmap) {
+                    i.putExtra(BrowserContract.Bookmarks.THUMBNAIL, bitmap);
+                    mActivity.startActivity(i);
+                }
+            });
     }
 
     private void goLive() {
@@ -2378,9 +2405,7 @@
                         settings.getUserAgentString());
             }
         }
-        i.putExtra(BrowserContract.Bookmarks.THUMBNAIL,
-                createScreenshot(w, getDesiredThumbnailWidth(mActivity),
-                getDesiredThumbnailHeight(mActivity)));
+        //SWE: Thumbnail will need to be set asynchronously
         i.putExtra(BrowserContract.Bookmarks.FAVICON, w.getFavicon());
         if (editExisting) {
             i.putExtra(AddBookmarkPage.CHECK_FOR_DUPE, true);
@@ -2472,6 +2497,27 @@
         return sThumbnailBitmap;
     }
 
+    static void createScreenshotAsync(WebView view, int width, int height,
+                                        final ValueCallback<Bitmap> cb) {
+        if (view == null || width == 0 || height == 0) {
+            return;
+        }
+
+        view.getContentBitmapAsync(
+            (float) width / view.getWidth(),
+            new Rect(),
+            new ValueCallback<Bitmap>() {
+                @Override
+                public void onReceiveValue(Bitmap bitmap) {
+                    Log.e("sudheer", "screensot bitmap: w: " + bitmap.getWidth()
+                          + " h: " + bitmap.getHeight());
+                    if (bitmap != null)
+                        bitmap = bitmap.copy(Bitmap.Config.RGB_565, false);
+                    cb.onReceiveValue(bitmap);
+                }});
+    }
+
+
     private void updateScreenshot(Tab tab) {
         // If this is a bookmarked site, add a screenshot to the database.
         // FIXME: Would like to make sure there is actually something to
diff --git a/src/com/android/browser/LocationButton.java b/src/com/android/browser/LocationButton.java
index e805e43..15371ef 100644
--- a/src/com/android/browser/LocationButton.java
+++ b/src/com/android/browser/LocationButton.java
@@ -71,7 +71,8 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        init();
+        //SWE-FIXME : Enable once SWE geolocation api works.
+        //init();
     }
 
     private void init() {
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 100e8d7..a8f52fe 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -75,7 +75,8 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
         mLockIcon = (ImageView) findViewById(R.id.lock);
-        mLocationButton = (LocationButton) findViewById(R.id.location_button);
+        //SWE-FIXME
+        //mLocationButton = (LocationButton) findViewById(R.id.location_button);
         mFavicon = (ImageView) findViewById(R.id.favicon);
         mUrlInput = (UrlInputView) findViewById(R.id.url);
         mUrlInput.setUrlInputListener(this);
@@ -397,7 +398,8 @@
     }
 
     public void onTabDataChanged(Tab tab) {
-        mLocationButton.onTabDataChanged(tab);
+        //SWE-FIXME
+        //mLocationButton.onTabDataChanged(tab);
     }
 
     public void onVoiceResult(String s) {
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 78b3cc8..c789eba 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -25,6 +25,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
+import android.graphics.Rect;
 import android.os.Message;
 import android.util.Log;
 import android.util.TypedValue;
@@ -35,6 +36,7 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
+import android.webkit.ValueCallback;
 import org.codeaurora.swe.WebView;
 import android.widget.ImageView;
 
@@ -122,7 +124,7 @@
             if (mAnimScreen == null) {
                 mAnimScreen = new AnimScreen(mActivity);
                 // initialize bitmaps
-                mAnimScreen.set(getTitleBar(), getWebView());
+                //mAnimScreen.set(getTitleBar(), getWebView());
             }
         }
     }
@@ -271,6 +273,19 @@
         mShowNav = true;
         dismissIME();
         mUiController.setBlockEvents(true);
+
+        getWebView()
+            .getContentBitmapAsync(1.0f,
+                new Rect(),
+                new ValueCallback<Bitmap>() {
+                    @Override
+                    public void onReceiveValue(Bitmap bitmap) {
+                        onShowNavScreenContinue(bitmap);
+                    }});
+    }
+
+    void onShowNavScreenContinue(Bitmap viewportBitmap) {
+
         if (mNavScreen == null) {
             mNavScreen = new NavScreen(mActivity, mUiController, this);
             mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
@@ -287,7 +302,7 @@
             mAnimScreen.mTitle.setAlpha(1f);
             mAnimScreen.setScaleFactor(1f);
         }
-        mAnimScreen.set(getTitleBar(), getWebView());
+        mAnimScreen.set(getTitleBar(), viewportBitmap);
         if (mAnimScreen.mMain.getParent() == null) {
             mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
         }
@@ -383,7 +398,7 @@
         }
         int width = mContentView.getWidth();
         int height = mContentView.getHeight();
-        Bitmap bm = tab.getFullScreenshot();
+        Bitmap bm = tab.getScreenshot();
         if (bm == null)
             bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
         mAnimScreen.set(bm);
@@ -503,6 +518,7 @@
         mNavScreen.setVisibility(View.GONE);
         mCustomViewContainer.setAlpha(1f);
         mCustomViewContainer.setVisibility(View.GONE);
+        mAnimScreen.set(null);
     }
 
     @Override
@@ -543,8 +559,8 @@
             setScaleFactor(getScaleFactor());
         }
 
-        public void set(TitleBar tbar, WebView web) {
-            if (tbar == null || web == null) {
+        public void set(TitleBar tbar, Bitmap viewportBitmap) {
+            if (tbar == null) {
                 return;
             }
             int embTbarHeight = tbar.getEmbeddedHeight();
@@ -566,29 +582,8 @@
             }
             mTitle.setImageBitmap(mTitleBarBitmap);
             mTitle.setVisibility(View.VISIBLE);
-            // SWE: WebView.draw() wouldn't draw anything if SurfaceView is enabled.
-            if (mContentBitmap != null) {
-                mContentBitmap.recycle();
-                mContentBitmap = null;
-            }
-            mContentBitmap = web.getViewportBitmap();
-            if (mContentBitmap == null) {
-                int h = web.getHeight() - embTbarHeight;
-                if (mContentBitmap == null
-                        || mContentBitmap.getWidth() != web.getWidth()
-                        || mContentBitmap.getHeight() != h) {
-                    mContentBitmap = safeCreateBitmap(web.getWidth(), h);
-                }
-                if (mContentBitmap != null) {
-                        Canvas c = new Canvas(mContentBitmap);
-                        int tx = web.getScrollX();
-                        int ty = web.getScrollY();
-                        c.translate(-tx, -ty - embTbarHeight);
-                        web.draw(c);
-                        c.setBitmap(null);
-                }
-            }
-            mContent.setImageBitmap(mContentBitmap);
+
+            mContent.setImageBitmap(viewportBitmap);
         }
 
         private Bitmap safeCreateBitmap(int width, int height) {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 4f183fe..5e71aca 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -33,6 +33,7 @@
 import android.graphics.Picture;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
 import android.net.Uri;
 import android.net.http.SslError;
 import android.os.Bundle;
@@ -1965,8 +1966,9 @@
         values.put(Snapshots.BACKGROUND, web.getPageBackgroundColor());
         values.put(Snapshots.DATE_CREATED, System.currentTimeMillis());
         values.put(Snapshots.FAVICON, compressBitmap(getFavicon()));
-        Bitmap screenshot = web.getViewportBitmap();
-        values.put(Snapshots.THUMBNAIL, compressBitmap(screenshot));
+        Bitmap screenshot = getScreenshot();
+        if (screenshot != null)
+            values.put(Snapshots.THUMBNAIL, compressBitmap(screenshot));
         return values;
     }
 
@@ -2046,44 +2048,26 @@
         if (mMainView.getContentWidth() <= 0 || mMainView.getContentHeight() <= 0) {
             return;
         }
+
+        mMainView
+            .getContentBitmapAsync(
+                 (float) mCaptureWidth / mMainView.getWidth(),
+                 new Rect(),
+                 new ValueCallback<Bitmap>() {
+                     @Override
+                     public void onReceiveValue(Bitmap bitmap) {
+                         onCaptureCallback(bitmap);
+                     }});
+    }
+
+    private void onCaptureCallback(Bitmap bitmap) {
+        if (mCapture == null || bitmap == null)
+            return;
+
         Canvas c = new Canvas(mCapture);
-        int state = c.save();
-        float scale = 0;
-        Bitmap screenShot = mMainView.getViewportBitmap();
-        if (mScreenShot != null) {
-            mScreenShot.recycle();
-            mScreenShot = null;
-        }
-        mScreenShot = screenShot;
-        if (screenShot != null) {
-            //scale based on device orientation
-            if (screenShot.getHeight() > screenShot.getWidth()){
-                scale = (float) mCaptureWidth / screenShot.getWidth();
-            } else {
-                scale = (float) mCaptureHeight / screenShot.getHeight();
-            }
-            mCapture.eraseColor(Color.WHITE);
-            c.scale(scale, scale);
-            c.drawBitmap(screenShot, 0, 0, null);
-        } else {
-            final int left = mMainView.getViewScrollX();
-            final int top = mMainView.getViewScrollY() +  mMainView.getVisibleTitleHeight();
+        mCapture.eraseColor(Color.WHITE);
+        c.drawBitmap(bitmap, 0, 0, null);
 
-            if (mMainView.getHeight() > mMainView.getWidth()){
-                scale = mCaptureWidth / (float) mMainView.getWidth();
-            } else {
-                scale = mCaptureHeight / (float) mMainView.getHeight();
-            }
-
-            c.translate(-left, -top);
-            c.scale(scale, scale, left, top);
-            if (mMainView instanceof BrowserWebView) {
-                ((BrowserWebView)mMainView).drawContent(c);
-             } else {
-                mMainView.draw(c);
-             }
-        }
-        c.restoreToCount(state);
         // manually anti-alias the edges for the tilt
         c.drawRect(0, 0, 1, mCapture.getHeight(), sAlphaPaint);
         c.drawRect(mCapture.getWidth() - 1, 0, mCapture.getWidth(),
diff --git a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
index e693297..9c96768 100644
--- a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
@@ -160,14 +160,15 @@
                 }
             }
         });
-        GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
+        //SWE-FIXME : Uncomment when geolocation is working.
+        /*GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
             @Override
             public void onReceiveValue(Set<String> geolocationOrigins) {
                 if ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()) {
                     websiteSettings.setEnabled(true);
                 }
             }
-        });
+        });*/
     }
 
     @Override
