diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index da9ad63..4c17b8b 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -428,14 +428,9 @@
         // container to the content view.
         FrameLayout wrapper =
                 (FrameLayout) container.findViewById(R.id.webview_wrapper);
-        ViewGroup parent = (ViewGroup) mainView.getParent();
-        if (parent != wrapper) {
-            if (parent != null) {
-                parent.removeView(mainView);
-            }
-            wrapper.addView(mainView);
-        }
-        parent = (ViewGroup) container.getParent();
+        if (wrapper != mainView.getView().getParent())
+            wrapper.addView(mainView.getView());
+        ViewGroup parent = (ViewGroup) container.getParent();
         if (parent != mContentView) {
             if (parent != null) {
                 parent.removeView(container);
@@ -458,7 +453,7 @@
         // needed by WebView.
         FrameLayout wrapper =
                 (FrameLayout) container.findViewById(R.id.webview_wrapper);
-        wrapper.removeView(mainView);
+        wrapper.removeView(mainView.getView());
         mContentView.removeView(container);
         mUiController.endActionMode();
         mUiController.removeSubWindow(tab);
diff --git a/src/com/android/browser/Browser.java b/src/com/android/browser/Browser.java
index 4c1d9f2..bd2ac06 100644
--- a/src/com/android/browser/Browser.java
+++ b/src/com/android/browser/Browser.java
@@ -25,9 +25,12 @@
 import android.util.Log;
 import android.os.Process;
 
+import org.chromium.chrome.browser.ChromiumApplication;
+import org.chromium.chrome.browser.PKCS11AuthenticationManager;
+
 import org.codeaurora.swe.Engine;
 
-public class Browser extends Application {
+public class Browser extends ChromiumApplication {
 
     private final static String LOGTAG = "browser";
 
@@ -112,5 +115,28 @@
         }
 
     }
+
+    @Override
+    protected PKCS11AuthenticationManager getPKCS11AuthenticationManager() {
+        return null;
+    }
+
+    @Override
+    protected void openProtectedContentSettings() {
+    }
+
+    @Override
+    protected boolean areParentalControlsEnabled() {
+        return false;
+    }
+
+    @Override
+    public String getSettingsActivityName() {
+        return null;
+    }
+
+    @Override
+    public void initCommandLine() {
+    }
 }
 
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 670849b..220566a 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -37,7 +37,7 @@
 import android.view.ViewTreeObserver;
 import android.view.Window;
 
-import com.google.common.annotations.VisibleForTesting;
+import org.chromium.base.VisibleForTesting;
 import com.android.browser.R;
 import com.android.browser.search.DefaultSearchEngine;
 import com.android.browser.search.SearchEngine;
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 3fea1ed..ca6c0dc 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -62,7 +62,7 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import org.codeaurora.net.NetworkServices;
+//import org.codeaurora.net.NetworkServices;
 
 interface BookmarksPageCallbacks {
     // Return true if handled
@@ -435,7 +435,7 @@
         lm.restartLoader(LOADER_ACCOUNTS, null, this);
 
         //Notify about anticipated network activity
-        NetworkServices.HintUpcomingUserActivity();
+        //NetworkServices.HintUpcomingUserActivity();
 
         return mRoot;
     }
diff --git a/src/com/android/browser/BrowserConfigBase.java b/src/com/android/browser/BrowserConfigBase.java
index a96e6ad..99b6456 100644
--- a/src/com/android/browser/BrowserConfigBase.java
+++ b/src/com/android/browser/BrowserConfigBase.java
@@ -43,6 +43,12 @@
 abstract class BrowserConfigBase {
 
     private static final String OVERRIDE_USER_AGENT = "user-agent";
+    private static final String OVERRIDE_MEDIA_DOWNLOAD = "media-download";
+    private static final String HTTP_HEADERS = "http-headers";
+    private static final String ENABLE_SWE = "enabled-swe";
+    private static final String ENABLE_TOP_CONTROLS = "enable-top-controls-position-calculation";
+    private static final String TOP_CONTROLS_HIDE_THRESHOLD = "top-controls-hide-threshold";
+    private static final String TOP_CONTROLS_SHOW_THRESHOLD = "top-controls-show-threshold";
     private Context mContext;
 
     public BrowserConfigBase(Context context) {
@@ -67,15 +73,31 @@
         }
     }
 
+    public void overrideMediaDownload() {
+        boolean defaultAllowMediaDownloadsValue = mContext.getResources().getBoolean(
+            R.bool.def_allow_media_downloads);
+        if (defaultAllowMediaDownloadsValue)
+            BrowserCommandLine.appendSwitchWithValue(OVERRIDE_MEDIA_DOWNLOAD, "1");
+    }
+
+    public void setExtraHTTPRequestHeaders() {
+        String headers = mContext.getResources().getString(
+            R.string.def_extra_http_headers);
+        if (!TextUtils.isEmpty(headers))
+            BrowserCommandLine.appendSwitchWithValue(HTTP_HEADERS, headers);
+    }
+
     public void initCommandLineSwitches() {
         //SWE-hide-title-bar - enable following flags
-        BrowserCommandLine.appendSwitch("enable-top-controls-position-calculation");
-        BrowserCommandLine.appendSwitchWithValue("top-controls-height", "52");
-        BrowserCommandLine.appendSwitchWithValue("top-controls-show-threshold", "0.5");
-        BrowserCommandLine.appendSwitchWithValue("top-controls-hide-threshold", "0.5");
+        BrowserCommandLine.appendSwitch(ENABLE_TOP_CONTROLS);
+        BrowserCommandLine.appendSwitchWithValue(TOP_CONTROLS_SHOW_THRESHOLD, "0.5");
+        BrowserCommandLine.appendSwitchWithValue(TOP_CONTROLS_HIDE_THRESHOLD, "0.5");
+        BrowserCommandLine.appendSwitch(ENABLE_SWE);
 
         // Allow to override UserAgent
         overrideUserAgent();
+        overrideMediaDownload();
+        setExtraHTTPRequestHeaders();
     }
 
     private String constructUserAgent(String userAgent) {
@@ -98,7 +120,6 @@
         EXIT_DIALOG, /* Add 'Exit' menu item and show 'Minimize or quit' dialog */
         TITLE_IN_URL_BAR, /* Display page title instead of url in URL bar */
         CUSTOM_DOWNLOAD_PATH, /* Allow users to provide custom download path */
-        ALLOW_MEDIA_DOWNLOADS, /* Add 'Allow media downloads' menu item */
         DISABLE_HISTORY /* Allow disabling saving history for non-incognito tabs */
     }
 
@@ -116,8 +137,6 @@
                 return mContext.getResources().getBoolean(R.bool.feature_title_in_URL_bar);
             case CUSTOM_DOWNLOAD_PATH:
                 return mContext.getResources().getBoolean(R.bool.feature_custom_download_path);
-            case ALLOW_MEDIA_DOWNLOADS:
-                return mContext.getResources().getBoolean(R.bool.feature_allow_media_downloads);
             case DISABLE_HISTORY:
                 return mContext.getResources().getBoolean(R.bool.feature_disable_history);
             default:
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 9ba3c31..5bb085c 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -258,8 +258,6 @@
         settings.setUseWideViewPort(isWideViewport());
         settings.setDoNotTrack(doNotTrack());
         settings.setMediaPlaybackRequiresUserGesture(false);
-        settings.setAllowMediaDownloads(allowMediaDownloads());
-        setExtraHTTPRequestHeaders(settings);
 
         WebSettings settingsClassic = (WebSettings) settings;
         settingsClassic.setHardwareAccelSkiaEnabled(isSkiaHardwareAccelerated());
@@ -284,12 +282,6 @@
         settingsClassic.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
     }
 
-    private void setExtraHTTPRequestHeaders(WebSettings settings){
-        String headers = mContext.getResources().getString(R.string.def_extra_http_headers);
-        if (!TextUtils.isEmpty(headers)){
-            settings.setHTTPRequestHeaders(headers);
-        }
-    }
 
     /**
      * Syncs all the settings that have no UI
@@ -343,6 +335,7 @@
     private void syncSharedSettings() {
         mNeedsSharedSync = false;
         CookieManager.getInstance().setAcceptCookie(acceptCookies());
+
     }
 
     private void syncManagedSettings() {
@@ -731,25 +724,6 @@
         return mPrefs.getBoolean(PREF_ENABLE_MEMORY_MONITOR, true);
     }
 
-    public boolean allowMediaDownloads() {
-        // Return false if preference is not exposed to user
-        if (!BrowserConfig.getInstance(mContext)
-                .hasFeature(BrowserConfig.Feature.ALLOW_MEDIA_DOWNLOADS))
-            return false;
-
-        // Otherwise, look at default value
-        boolean defaultAllowMediaDownloadsValue = mController.getContext()
-                .getResources().getBoolean(R.bool.def_allow_media_downloads);
-
-        // If preference is not saved, save default value
-        if (!mPrefs.contains(PREF_ALLOW_MEDIA_DOWNLOADS)){
-            Editor edit = mPrefs.edit();
-            edit.putBoolean(PREF_ALLOW_MEDIA_DOWNLOADS, defaultAllowMediaDownloadsValue);
-            edit.apply();
-        }
-
-        return mPrefs.getBoolean(PREF_ALLOW_MEDIA_DOWNLOADS, defaultAllowMediaDownloadsValue);
-    }
 
     public boolean loadPageInOverviewMode() {
         return mPrefs.getBoolean(PREF_LOAD_PAGE, true);
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 9215fe5..5255994 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -111,6 +111,8 @@
 
     public void setTitleBar(TitleBar title) {
         mTitleBar = title;
+        if (!mTitleBar.isFixed())
+            setTopControlsHeight(52);
     }
 
     // From TitleBarDelegate
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index dd3d76c..747b779 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -132,7 +132,7 @@
     private static final String LOGTAG = "Controller";
     private static final String SEND_APP_ID_EXTRA =
         "android.speech.extras.SEND_APPLICATION_ID_EXTRA";
-    private static final String INCOGNITO_URI = "browser:incognito";
+    private static final String INCOGNITO_URI = "chrome://incognito";
 
     // Remind switch to data connection if wifi is unavailable
     private static final int NETWORK_SWITCH_TYPE_OK = 1;
@@ -1406,6 +1406,7 @@
                 break;
         }
         getCurrentTopWebView().requestFocus();
+        getCurrentTopWebView().onActivityResult(requestCode, resultCode, intent);
     }
 
     /**
diff --git a/src/com/android/browser/EngineInitializer.java b/src/com/android/browser/EngineInitializer.java
index 6556abb..ef88458 100644
--- a/src/com/android/browser/EngineInitializer.java
+++ b/src/com/android/browser/EngineInitializer.java
@@ -45,7 +45,7 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 
-import com.google.common.annotations.VisibleForTesting;
+import org.chromium.base.VisibleForTesting;
 
 public class EngineInitializer {
     private final static String LOGTAG = "EngineInitializer";
@@ -247,6 +247,66 @@
 
     }
 
+    private void completeInitializationAsynOnUiThread(final Context ctx) {
+        assert runningOnUiThread() : "Tried to initialize the engine on the wrong thread.";
+
+        if (!mInitializationCompleted) {
+            // TODO: Evaluate the benefit of async Engine.initialize()
+            Engine.StartupCallback callback =
+                new Engine.StartupCallback() {
+                    @Override
+                    public void onSuccess(boolean alreadyStarted) {
+                        if (Looper.myLooper() == Looper.getMainLooper()) {
+                            Log.e(LOGTAG, "SWE engine initialization success");
+                             // Add the browser commandline options
+                            BrowserConfig.getInstance(ctx).initCommandLineSwitches();
+
+                            //Note: Only enable this for debugging.
+                            if (BrowserCommandLine.hasSwitch(STRICT_MODE)) {
+                                Log.v(LOGTAG, "StrictMode enabled");
+                                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+                                        .detectDiskReads()
+                                        .detectDiskWrites()
+                                        .detectNetwork()
+                                        .penaltyLog()
+                                        .build());
+                                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+                                        .detectLeakedSqlLiteObjects()
+                                        .detectLeakedClosableObjects()
+                                        .penaltyLog()
+                                        .penaltyDeath()
+                                        .build());
+                            }
+
+                            //Enable remote debugging by default
+                            Engine.setWebContentsDebuggingEnabled(true);
+                            mInitializationCompleted = true;
+                            mLibraryLoaded = true;
+                            BrowserSettings.getInstance().onEngineInitializationComplete();
+
+                            if (mActivity != null && mNotifyActivity) {
+                                mNotifyActivity = false;
+                                postOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mActivity.onEngineInitializationComplete();
+                                        mActivityReady = true;
+                                        processPendingEvents();
+                                    }
+                                });
+                            }
+                        }
+                    }
+
+                    @Override
+                    public void onFailure() {
+                        Log.e(LOGTAG, "SWE engine initialization failed");
+                    }
+            };
+            Engine.initialize(ctx, callback);
+        }
+    }
+
     private void processPendingEvents() {
         assert runningOnUiThread() : "Tried to initialize the engine on the wrong thread.";
 
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index eb9fe53..f6b37f5 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -40,7 +40,6 @@
     static final String PREF_DEFAULT_TEXT_ENCODING = "default_text_encoding";
     static final String PREF_ENABLE_JAVASCRIPT = "enable_javascript";
     static final String PREF_ENABLE_MEMORY_MONITOR = "enable_memory_monitor";
-    static final String PREF_ALLOW_MEDIA_DOWNLOADS = "allow_media_downloads";
     static final String PREF_LOAD_PAGE = "load_page";
     static final String PREF_OPEN_IN_BACKGROUND = "open_in_background";
     static final String PREF_RESET_DEFAULT_PREFERENCES = "reset_default_preferences";
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index c7b8ea7..0a23205 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -219,7 +219,7 @@
         PageState(Context c, boolean incognito) {
             mIncognito = incognito;
             if (mIncognito) {
-                mOriginalUrl = mUrl = "browser:incognito";
+                mOriginalUrl = mUrl = "chrome://incognito";
                 mTitle = c.getString(R.string.new_incognito_tab);
             } else {
                 mOriginalUrl = mUrl = "";
@@ -670,7 +670,7 @@
         public WebResourceResponse shouldInterceptRequest(WebView view,
                 String url) {
             //intercept if opening a new incognito tab - show the incognito welcome page
-            if (url.startsWith("browser:incognito")) {
+            if (url.startsWith("chrome://incognito")) {
                 Resources resourceHandle = mContext.getResources();
                 InputStream inStream = resourceHandle.openRawResource(
                         com.android.browser.R.raw.incognito_mode_start_page);
@@ -702,6 +702,24 @@
                 super.onUnhandledKeyEvent(view, event);
             }
         }
+        //SWE-download-file
+        @Override
+        public void onDownloadStart(String url,
+                                 String userAgent,
+                                 String contentDisposition,
+                                 String mimeType,
+                                 long contentLength) {
+          if (mDownloadListener != null) {
+             if (mDownloadListener instanceof BrowserDownloadListener) {
+                 ((BrowserDownloadListener) mDownloadListener).onDownloadStart(url,
+                     userAgent, contentDisposition, mimeType, contentLength);
+             } else {
+                 mDownloadListener.onDownloadStart(url, userAgent,
+                     contentDisposition, mimeType, contentLength);
+             }
+          }
+        }
+        //SWE-download-file
     };
 
     private void syncCurrentState(WebView view, String url) {
@@ -1578,7 +1596,7 @@
             if (mMainView.hasCrashed()) {
                 // Reload if render process has crashed. This is done here so that
                 // setFocus call sends wasShown message to correct render process.
-                mMainView.reload();
+                mMainView.setNeedsReload(true);
             }
             setupHwAcceleration(mMainView);
             mMainView.onResume();
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
index c327fdc..4d3dee4 100755
--- a/src/com/android/browser/UrlUtils.java
+++ b/src/com/android/browser/UrlUtils.java
@@ -47,7 +47,7 @@
     static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile(
             "(?i)" + // switch on case insensitive matching
             "(" +    // begin group for schema
-            "(?:http|https|file):\\/\\/" +
+            "(?:http|https|file|chrome):\\/\\/" +
             "|(?:inline|data|about|javascript):" +
             ")" +
             "(.*)" );
diff --git a/src/com/android/browser/appmenu/AppMenuHandler.java b/src/com/android/browser/appmenu/AppMenuHandler.java
index 94a429a..dd1c1af 100644
--- a/src/com/android/browser/appmenu/AppMenuHandler.java
+++ b/src/com/android/browser/appmenu/AppMenuHandler.java
@@ -15,7 +15,7 @@
 import android.view.View;
 import android.widget.PopupMenu;
 
-import com.google.common.annotations.VisibleForTesting;
+import org.chromium.base.VisibleForTesting;
 
 import java.util.ArrayList;
 
diff --git a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
index 5edf8e6..4c715ce 100644
--- a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
@@ -83,10 +83,6 @@
         // Below are preferences for carrier specific features
         PreferenceScreen contentSettingsPrefScreen =
                 (PreferenceScreen) mFragment.findPreference("content_settings");
-        if (!BrowserConfig.getInstance(mFragment.getActivity().getApplicationContext())
-                .hasFeature(BrowserConfig.Feature.ALLOW_MEDIA_DOWNLOADS))
-            contentSettingsPrefScreen.removePreference(contentSettingsPrefScreen
-                    .findPreference(PreferenceKeys.PREF_ALLOW_MEDIA_DOWNLOADS));
 
         if (!BrowserConfig.getInstance(mFragment.getActivity().getApplicationContext())
                 .hasFeature(BrowserConfig.Feature.CUSTOM_DOWNLOAD_PATH)) {
diff --git a/src/com/android/browser/preferences/WebsiteSettingsFragment.java b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
index 9fe18c5..fb96645 100644
--- a/src/com/android/browser/preferences/WebsiteSettingsFragment.java
+++ b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
@@ -278,6 +278,13 @@
                     askForGeolocation(sites);
                 }
             });
+
+
+            //SWETODO: REMOVE code below be after WebStorage getOrigins Method is Functional
+            Map<String, Site> sites = new HashMap<String, Site>();
+            askForGeolocation(sites);
+
+
         }
 
         public void askForGeolocation(final Map<String, Site> sites) {
@@ -737,7 +744,7 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.website_settings, container, false);
+        View view = inflater.inflate(R.layout.swe_website_settings, container, false);
         Bundle args = getArguments();
         if (args != null) {
             mSite = (Site) args.getParcelable(EXTRA_SITE);
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 0a30853..58aa1a7 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -58,7 +58,7 @@
 import com.android.browser.platformsupport.BrowserContract.SyncState;
 import com.android.browser.platformsupport.SyncStateContentProviderHelper;
 import com.android.browser.widget.BookmarkThumbnailWidgetProvider;
-import com.google.common.annotations.VisibleForTesting;
+import org.chromium.base.VisibleForTesting;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
