diff --git a/src/com/android/browser/BrowserConfigBase.java b/src/com/android/browser/BrowserConfigBase.java
index 99b6456..495e735 100644
--- a/src/com/android/browser/BrowserConfigBase.java
+++ b/src/com/android/browser/BrowserConfigBase.java
@@ -42,13 +42,7 @@
 
 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) {
@@ -57,7 +51,7 @@
 
     public void overrideUserAgent() {
         // Check if the UA is already present using command line file
-        if (BrowserCommandLine.hasSwitch(OVERRIDE_USER_AGENT)) {
+        if (BrowserCommandLine.hasSwitch(BrowserSwitches.OVERRIDE_USER_AGENT)) {
             return;
         }
 
@@ -69,7 +63,7 @@
         ua = constructUserAgent(ua);
 
         if (!TextUtils.isEmpty(ua)){
-            BrowserCommandLine.appendSwitchWithValue(OVERRIDE_USER_AGENT, ua);
+            BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.OVERRIDE_USER_AGENT, ua);
         }
     }
 
@@ -77,22 +71,22 @@
         boolean defaultAllowMediaDownloadsValue = mContext.getResources().getBoolean(
             R.bool.def_allow_media_downloads);
         if (defaultAllowMediaDownloadsValue)
-            BrowserCommandLine.appendSwitchWithValue(OVERRIDE_MEDIA_DOWNLOAD, "1");
+            BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.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);
+            BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.HTTP_HEADERS, headers);
     }
 
     public void initCommandLineSwitches() {
         //SWE-hide-title-bar - enable following flags
-        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);
+        BrowserCommandLine.appendSwitch(BrowserSwitches.ENABLE_TOP_CONTROLS);
+        BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.TOP_CONTROLS_SHOW_THRESHOLD, "0.5");
+        BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.TOP_CONTROLS_HIDE_THRESHOLD, "0.5");
+        BrowserCommandLine.appendSwitch(BrowserSwitches.ENABLE_SWE);
 
         // Allow to override UserAgent
         overrideUserAgent();
diff --git a/src/com/android/browser/BrowserSwitches.java b/src/com/android/browser/BrowserSwitches.java
new file mode 100644
index 0000000..77b6f05
--- /dev/null
+++ b/src/com/android/browser/BrowserSwitches.java
@@ -0,0 +1,68 @@
+/*
+ *  Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *      * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser;
+
+// Contains all of the command line switches that are specific to the SWE Browser
+
+public class BrowserSwitches {
+    //Command line flag for strict mode
+    public final static String STRICT_MODE = "enable-strict-mode";
+
+    // Command line flag for single-process mode.
+    // Must match the value of kSingleProcess in content_switches.cc
+    public static final String SINGLE_PROCESS = "single-process";
+
+    //SWE TODO : Add description for each switch.
+
+    public static final String OVERRIDE_USER_AGENT = "user-agent";
+
+    public static final String OVERRIDE_MEDIA_DOWNLOAD = "media-download";
+
+    public static final String HTTP_HEADERS = "http-headers";
+
+    public static final String ENABLE_SWE = "enabled-swe";
+
+    public static final String ENABLE_TOP_CONTROLS = "enable-top-controls-position-calculation";
+
+    public static final String TOP_CONTROLS_HIDE_THRESHOLD = "top-controls-hide-threshold";
+
+    public static final String TOP_CONTROLS_SHOW_THRESHOLD = "top-controls-show-threshold";
+
+    public static final String CRASH_LOG_SERVER_CMD = "crash-log-server";
+
+    public static final String CMD_LINE_SWITCH_FEEDBACK = "mail-feedback-to";
+
+    public static final String CMD_LINE_SWITCH_HELPURL  = "help-url";
+
+    public static final String CMD_LINE_SWITCH_EULA_URL = "legal-eula-url";
+
+    public static final String CMD_LINE_SWITCH_PRIVACY_POLICY_URL = "legal-privacy-policy-url";
+}
diff --git a/src/com/android/browser/CrashLogExceptionHandler.java b/src/com/android/browser/CrashLogExceptionHandler.java
index 09f64e8..367a409 100644
--- a/src/com/android/browser/CrashLogExceptionHandler.java
+++ b/src/com/android/browser/CrashLogExceptionHandler.java
@@ -71,7 +71,6 @@
 public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler {
 
     private static final String CRASH_LOG_FILE = "crash.log";
-    private static final String CRASH_LOG_SERVER_CMD = "crash-log-server";
     private static final String CRASH_LOG_MAX_FILE_SIZE_CMD = "crash-log-max-file-size";
     private static final String CRASH_REPORT_DIR = "Crash Reports";
 
@@ -95,9 +94,9 @@
 
     public CrashLogExceptionHandler(Context ctx) {
         mAppContext = ctx;
-        if (BrowserCommandLine.hasSwitch(CRASH_LOG_SERVER_CMD)) {
+        if (BrowserCommandLine.hasSwitch(BrowserSwitches.CRASH_LOG_SERVER_CMD)) {
             initNativeReporter(ctx);
-            mLogServer = BrowserCommandLine.getSwitchValue(CRASH_LOG_SERVER_CMD);
+            mLogServer = BrowserCommandLine.getSwitchValue(BrowserSwitches.CRASH_LOG_SERVER_CMD);
             if (mLogServer != null) {
                 uploadPastCrashLog();
                 mOverrideHandler = true;
@@ -338,7 +337,7 @@
     private void uploadNativeCrashReport(final File report) {
         Log.w(LOGTAG, "Preparing Crash Report for upload " + report.getName());
         // get server url from commandline
-        String server = BrowserCommandLine.getSwitchValue(CRASH_LOG_SERVER_CMD);
+        String server = BrowserCommandLine.getSwitchValue(BrowserSwitches.CRASH_LOG_SERVER_CMD);
         try {
             HttpClient httpClient = new DefaultHttpClient();
             HttpPost httpPost = new HttpPost(server);
diff --git a/src/com/android/browser/EngineInitializer.java b/src/com/android/browser/EngineInitializer.java
index 27ffbe0..037e658 100644
--- a/src/com/android/browser/EngineInitializer.java
+++ b/src/com/android/browser/EngineInitializer.java
@@ -53,12 +53,6 @@
 public class EngineInitializer {
 
     private final static String LOGTAG = "EngineInitializer";
-    //Command line flag for strict mode
-    private final static String STRICT_MODE = "enable-strict-mode";
-
-    // Command line flag for single-process mode.
-    // Must match the value of kSingleProcess in content_switches.cc
-    private static final String SINGLE_PROCESS = "single-process";
 
     private static boolean mInitializationStarted = false;
     private static boolean mSynchronousInitialization = false;
@@ -281,7 +275,7 @@
                 }
 
                 Engine.loadNativeLibraries(mApplicationContext);
-                if (!BrowserCommandLine.hasSwitch(SINGLE_PROCESS)) {
+                if (!BrowserCommandLine.hasSwitch(BrowserSwitches.SINGLE_PROCESS)) {
                     Engine.warmUpChildProcess(mApplicationContext);
                 }
                 return true;
@@ -366,7 +360,7 @@
             BrowserConfig.getInstance(ctx).initCommandLineSwitches();
 
             //Note: Only enable this for debugging.
-            if (BrowserCommandLine.hasSwitch(STRICT_MODE)) {
+            if (BrowserCommandLine.hasSwitch(BrowserSwitches.STRICT_MODE)) {
                 Log.v(LOGTAG, "StrictMode enabled");
                 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                         .detectDiskReads()
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index 99e5f1c..951a658 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -132,6 +132,13 @@
     static final String PREF_USER_AGENT = "user_agent";
     static final String PREF_HELP = "help_about";
     static final String PREF_FEEDBACK = "feedback";
-
     static final String PREF_EDGE_SWIPE = "edge_swiping_action";
+    static final String PREF_LEGAL = "legal";
+
+    // ----------------------
+    // Keys for legal_preferences.xml
+    // ----------------------
+    static final String PREF_LEGAL_CREDITS = "legal_credits";
+    static final String PREF_LEGAL_EULA = "legal_eula";
+    static final String PREF_LEGAL_PRIVACY_POLICY = "legal_privacy_policy";
 }
diff --git a/src/com/android/browser/preferences/AboutPreferencesFragment.java b/src/com/android/browser/preferences/AboutPreferencesFragment.java
index 8f261e6..2a0edac 100644
--- a/src/com/android/browser/preferences/AboutPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AboutPreferencesFragment.java
@@ -40,6 +40,8 @@
 import android.preference.PreferenceScreen;
 
 import com.android.browser.BrowserActivity;
+import com.android.browser.BrowserPreferencesPage;
+import com.android.browser.BrowserSwitches;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.R;
 
@@ -48,9 +50,6 @@
 public class AboutPreferencesFragment extends PreferenceFragment
                             implements OnPreferenceClickListener {
 
-    final String CMD_LINE_SWITCH_FEEDBACK = "mail-feedback-to";
-    final String CMD_LINE_SWITCH_HELPURL  = "help-url";
-
     final String ABOUT_TEXT_VERSION_KEY = "Version:";
     final String ABOUT_TEXT_BUILT_KEY = "Built:";
     final String ABOUT_TEXT_HASH_KEY = "Hash:";
@@ -139,17 +138,21 @@
 
         setPreference(PreferenceKeys.PREF_USER_AGENT, user_agent);
 
-        if (BrowserCommandLine.hasSwitch(CMD_LINE_SWITCH_HELPURL)) {
-            mHelpURL = BrowserCommandLine.getSwitchValue(CMD_LINE_SWITCH_HELPURL);
+        if (BrowserCommandLine.hasSwitch(BrowserSwitches.CMD_LINE_SWITCH_HELPURL)) {
+            mHelpURL = BrowserCommandLine.getSwitchValue(
+                    BrowserSwitches.CMD_LINE_SWITCH_HELPURL);
         }
 
         setOnClickListener(PreferenceKeys.PREF_HELP, !mHelpURL.isEmpty());
 
-        if (BrowserCommandLine.hasSwitch(CMD_LINE_SWITCH_FEEDBACK)) {
-            mFeedbackRecipient = BrowserCommandLine.getSwitchValue(CMD_LINE_SWITCH_FEEDBACK);
+        if (BrowserCommandLine.hasSwitch(BrowserSwitches.CMD_LINE_SWITCH_FEEDBACK)) {
+            mFeedbackRecipient = BrowserCommandLine.getSwitchValue(
+                    BrowserSwitches.CMD_LINE_SWITCH_FEEDBACK);
         }
 
         setOnClickListener(PreferenceKeys.PREF_FEEDBACK, !mFeedbackRecipient.isEmpty());
+
+        setOnClickListener(PreferenceKeys.PREF_LEGAL, true);
     }
 
     @Override
@@ -160,6 +163,11 @@
             intent.setData(Uri.parse(mHelpURL));
             getActivity().startActivity(intent);
             return true;
+        } else if(preference.getKey().equals(PreferenceKeys.PREF_LEGAL)) {
+            Bundle bundle = new Bundle();
+            BrowserPreferencesPage.startPreferenceFragmentExtraForResult(getActivity(),
+                    LegalPreferencesFragment.class.getName(), bundle, 0);
+            return true;
         } else if (preference.getKey().equals(PreferenceKeys.PREF_FEEDBACK)) {
             Intent intent = new Intent(Intent.ACTION_SEND);
             intent.setType("message/rfc822");
diff --git a/src/com/android/browser/preferences/LegalPreferencesFragment.java b/src/com/android/browser/preferences/LegalPreferencesFragment.java
new file mode 100644
index 0000000..ce75630
--- /dev/null
+++ b/src/com/android/browser/preferences/LegalPreferencesFragment.java
@@ -0,0 +1,121 @@
+/*
+ *  Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *      * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser.preferences;
+
+import android.app.ActionBar;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+
+import com.android.browser.BrowserSwitches;
+import com.android.browser.PreferenceKeys;
+import com.android.browser.R;
+
+import org.codeaurora.swe.BrowserCommandLine;
+
+public class LegalPreferencesFragment extends PreferenceFragment
+                            implements OnPreferenceClickListener {
+
+    PreferenceScreen mHeadPref = null;
+    String mEulaUrl = "";
+    String mPrivacyPolicyUrl = "";
+
+    private void setOnClickListener(String prefKey, boolean set) {
+        Preference pref = findPreference(prefKey);
+        if (pref == null) {
+            return;
+        }
+
+        if (set) {
+            pref.setOnPreferenceClickListener(this);
+        } else {
+            if (mHeadPref != null)
+                mHeadPref.removePreference(pref);
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ActionBar bar = getActivity().getActionBar();
+        if (bar != null) {
+            bar.setTitle(R.string.swe_legal);
+        }
+        addPreferencesFromResource(R.xml.legal_preferences);
+        mHeadPref = (PreferenceScreen) findPreference(PreferenceKeys.PREF_LEGAL);
+
+
+        setOnClickListener(PreferenceKeys.PREF_LEGAL_CREDITS, true);
+
+        if(BrowserCommandLine.hasSwitch(BrowserSwitches.CMD_LINE_SWITCH_EULA_URL)) {
+            mEulaUrl = BrowserCommandLine.getSwitchValue(BrowserSwitches.CMD_LINE_SWITCH_EULA_URL);
+        } else {
+            mEulaUrl = getResources().getString(R.string.swe_eula_url);
+        }
+        setOnClickListener(PreferenceKeys.PREF_LEGAL_EULA, !mEulaUrl.isEmpty());
+
+
+        if(BrowserCommandLine.hasSwitch(BrowserSwitches.CMD_LINE_SWITCH_PRIVACY_POLICY_URL)) {
+            mPrivacyPolicyUrl = BrowserCommandLine.getSwitchValue(
+                    BrowserSwitches.CMD_LINE_SWITCH_PRIVACY_POLICY_URL);
+        } else {
+            mPrivacyPolicyUrl = getResources().getString(R.string.swe_privacy_policy_url);
+        }
+        setOnClickListener(PreferenceKeys.PREF_LEGAL_PRIVACY_POLICY, !mPrivacyPolicyUrl.isEmpty());
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        Bundle b = new Bundle();
+        if(preference.getKey().equals(PreferenceKeys.PREF_LEGAL_CREDITS)) {
+            Intent i = new Intent(getActivity(), LegalPreviewActivity.class);
+            i.putExtra(LegalPreviewActivity.URL_INTENT_EXTRA, getResources()
+                    .getString(R.string.swe_open_source_license_url));
+            startActivity(i);
+            return true;
+        } else if(preference.getKey().equals(PreferenceKeys.PREF_LEGAL_EULA)) {
+            Intent i = new Intent(getActivity(), LegalPreviewActivity.class);
+            i.putExtra(LegalPreviewActivity.URL_INTENT_EXTRA, mEulaUrl);
+            startActivity(i);
+            return true;
+        } else if(preference.getKey().equals(PreferenceKeys.PREF_LEGAL_PRIVACY_POLICY)) {
+            Intent i = new Intent(getActivity(), LegalPreviewActivity.class);
+            i.putExtra(LegalPreviewActivity.URL_INTENT_EXTRA, mPrivacyPolicyUrl);
+            startActivity(i);
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/browser/preferences/LegalPreviewActivity.java b/src/com/android/browser/preferences/LegalPreviewActivity.java
new file mode 100644
index 0000000..8987e98
--- /dev/null
+++ b/src/com/android/browser/preferences/LegalPreviewActivity.java
@@ -0,0 +1,79 @@
+/*
+ *  Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *      * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser.preferences;
+
+import android.app.ActionBar;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.view.KeyEvent;
+
+import com.android.browser.R;
+
+public class LegalPreviewActivity extends FragmentActivity {
+    LegalPreviewFragment mLegalPreviewFragment;
+    protected static final String URL_INTENT_EXTRA = "url";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.credits_tab);
+        ActionBar bar = getActionBar();
+        if (bar != null) {
+            bar.setTitle(R.string.swe_open_source_licenses);
+        }
+        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
+        mLegalPreviewFragment = new LegalPreviewFragment();
+        Bundle args = new Bundle();
+        args.putString(URL_INTENT_EXTRA, getIntent().getExtras()
+                            .getString(URL_INTENT_EXTRA));
+        mLegalPreviewFragment.setArguments(args);
+        fragmentTransaction.add(R.id.license_layout, mLegalPreviewFragment,
+                "LegalPreviewFragmentTag");
+        fragmentTransaction.addToBackStack(null);
+        fragmentTransaction.commit();
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        switch(keyCode) {
+            case KeyEvent.KEYCODE_BACK:
+                if (event.isTracking() && !event.isCanceled()) {
+                    if(!mLegalPreviewFragment.onBackPressed()) {
+                        finish();
+                    }
+                }
+                break;
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/browser/preferences/LegalPreviewFragment.java b/src/com/android/browser/preferences/LegalPreviewFragment.java
new file mode 100644
index 0000000..ec60e10
--- /dev/null
+++ b/src/com/android/browser/preferences/LegalPreviewFragment.java
@@ -0,0 +1,83 @@
+/*
+ *  Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *      * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser.preferences;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.android.browser.R;
+
+import org.codeaurora.swe.WebView;
+
+public class LegalPreviewFragment extends Fragment {
+
+    private WebView mWebView;
+    private String mUrl;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Bundle args = getArguments();
+        mUrl = args.getString(LegalPreviewActivity.URL_INTENT_EXTRA);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        ViewGroup contentContainer = (ViewGroup) inflater.inflate(
+                R.layout.webview_wrapper, container, false);
+        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
+                FrameLayout.LayoutParams.MATCH_PARENT,
+                FrameLayout.LayoutParams.MATCH_PARENT);
+        mWebView = new WebView(getActivity());
+        contentContainer.addView(mWebView.getView(), params);
+        return contentContainer;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle b) {
+        super.onActivityCreated(b);
+        if (mWebView == null) return;
+            mWebView.loadUrl(mUrl);
+    }
+
+    public boolean onBackPressed() {
+        if(mWebView != null && mWebView.canGoBack()) {
+            mWebView.goBack();
+            return true;
+        }
+        return false;
+    }
+}
