diff --git a/src/com/android/browser/CommandLineManager.java b/src/com/android/browser/CommandLineManager.java
new file mode 100644
index 0000000..3ee1238
--- /dev/null
+++ b/src/com/android/browser/CommandLineManager.java
@@ -0,0 +1,142 @@
+/*
+ *  Copyright (c) 2014 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;
+
+import org.codeaurora.swe.utils.Logger;
+
+import android.content.Context;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileInputStream;
+
+public class CommandLineManager {
+
+    private final static String LOGTAG = "CommandLineManager";
+    public static final String COMMAND_LINE_FILE = "/data/local/tmp/swe-command-line";
+
+    // Read from the InputStream object
+    private static String parseCommandLine (InputStream is) {
+        BufferedReader br = null;
+        StringBuilder sb = new StringBuilder();
+        String line;
+        try {
+            br = new BufferedReader(new InputStreamReader(is));
+            while ((line = br.readLine()) != null) {
+                line = line.trim();
+
+                int commentIndex = line.indexOf('#');
+                if (commentIndex > -1) {
+                    // trim out the comments
+                    line = line.substring(0,commentIndex);
+                }
+
+                if (line.isEmpty())
+                    continue;
+
+                // Consider only the uncommented lines
+                sb.append(line);
+                sb.append(" ");
+            }
+
+            // Strip the browser name from the commandline options (First string) if options exists
+            if (sb.indexOf("--") >= 0) {
+                sb.delete(0, sb.indexOf(" "));
+            }
+        } catch (IOException e) {
+            Logger.e(LOGTAG, "Exception:", e);
+        } finally {
+            try {
+                // close the streams and reader
+                is.close();
+                if (br != null)
+                    br.close();
+            } catch (IOException e) {
+                Logger.e(LOGTAG, "Exception:", e);
+            }
+        }
+        return sb.toString();
+    }
+
+    // Set the browser options
+    private static char[] append(InputStream inStreamDefaultCmdLine,
+            InputStream inStreamUsrCmdLine) {
+        // bail out since there no file to command line to deal with
+        if (inStreamDefaultCmdLine == null && inStreamUsrCmdLine == null){
+            return null;
+        }
+
+        String userArgs = "";
+        String defaultArgs = "";
+        if (inStreamDefaultCmdLine != null) {
+            // Reading the default commandline file
+            // Refers to  the internal filename residing in "raw" directory
+            defaultArgs = parseCommandLine(inStreamDefaultCmdLine);
+        }
+
+        // Reading the user commandline file
+        if (inStreamUsrCmdLine != null) {
+            userArgs = parseCommandLine(inStreamUsrCmdLine);
+        }
+
+        // Assumption: The user commandline file can be empty or it exists
+        //             with atleast one commandline option.
+        // Insert the content of the default commandline file in the beginning of
+        // the user commandline file content. So that, the user settings will get
+        // the presidence
+        userArgs = "Browser "+defaultArgs+" "+userArgs;
+
+
+        Logger.v(LOGTAG, "(Command Line Arguments): " + userArgs);
+
+        char[] buffer = userArgs.toString().toCharArray();
+        return buffer;
+    }
+
+    public static char[] getCommandLineSwitches(Context context) {
+        InputStream sweCmdLineStream =
+                context.getResources().openRawResource(R.raw.swe_command_line);
+        InputStream  usrCmdLineStream = null;
+        File file = new File(COMMAND_LINE_FILE);
+        if(file.exists()){
+            try {
+                usrCmdLineStream = new FileInputStream(COMMAND_LINE_FILE);
+            } catch (FileNotFoundException e) {
+            }
+        }
+        // Set the browser options here
+        return append(sweCmdLineStream, usrCmdLineStream);
+    }
+}
diff --git a/src/com/android/browser/EngineInitializer.java b/src/com/android/browser/EngineInitializer.java
index b64f493..1a1b070 100644
--- a/src/com/android/browser/EngineInitializer.java
+++ b/src/com/android/browser/EngineInitializer.java
@@ -320,7 +320,7 @@
             if (!mInitializationStarted) {
                 mInitializationStarted = true;
                 mUiThreadHandler = new Handler(Looper.getMainLooper());
-                Engine.initializeCommandLine(ctx);
+                Engine.initializeCommandLine(ctx, CommandLineManager.getCommandLineSwitches(ctx));
                 mInitializeTask = new InitializeTask(ctx);
                 mInitializeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                 mActivitySchedulerMap = new HashMap<BrowserActivity, ActivityScheduler>();
@@ -356,8 +356,9 @@
         assert runningOnUiThread() : "Tried to initialize the engine on the wrong thread.";
 
         if (!mInitializationCompleted) {
+
             // TODO: Evaluate the benefit of async Engine.initialize()
-            Engine.initialize(ctx);
+            Engine.initialize(ctx, CommandLineManager.getCommandLineSwitches(ctx));
             // Add the browser commandline options
             BrowserConfig.getInstance(ctx).initCommandLineSwitches();
 
