diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index e6e9337..4d8c5a7 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -92,14 +92,11 @@
 
     protected FrameLayout mContentView;
     protected FrameLayout mCustomViewContainer;
-    private FrameLayout mFixedTitlebarContainer;
 
     private View mCustomView;
     private CustomViewCallback mCustomViewCallback;
     private int mOriginalOrientation;
 
-    private LinearLayout mErrorConsoleContainer = null;
-
     private UrlBarAutoShowManager mUrlBarAutoShowManager;
 
     private Toast mStopToast;
@@ -128,14 +125,10 @@
                 .getDecorView().findViewById(android.R.id.content);
         LayoutInflater.from(mActivity)
                 .inflate(R.layout.custom_screen, frameLayout);
-        mFixedTitlebarContainer = (FrameLayout) frameLayout.findViewById(
-                R.id.fixed_titlebar_container);
         mContentView = (FrameLayout) frameLayout.findViewById(
                 R.id.main_content);
         mCustomViewContainer = (FrameLayout) frameLayout.findViewById(
                 R.id.fullscreen_custom_content);
-        mErrorConsoleContainer = (LinearLayout) frameLayout
-                .findViewById(R.id.error_console);
         setFullscreen(BrowserSettings.getInstance().useFullscreen());
         mTitleBar = new TitleBar(mActivity, mUiController, this,
                 mContentView);
@@ -316,7 +309,6 @@
         }
         mTitleBar.bringToFront();
         tab.getTopWindow().requestFocus();
-        setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
         onTabDataChanged(tab);
         onProgressChanged(tab);
         mNavigationBar.setIncognitoMode(tab.isPrivateBrowsingEnabled());
@@ -456,10 +448,6 @@
         mContentView.removeView(container);
         mUiController.endActionMode();
         mUiController.removeSubWindow(tab);
-        ErrorConsoleView errorConsole = tab.getErrorConsole(false);
-        if (errorConsole != null) {
-            mErrorConsoleContainer.removeView(errorConsole);
-        }
     }
 
     @Override
@@ -603,7 +591,6 @@
             callback.onCustomViewHidden();
             return;
         }
-
         mOriginalOrientation = mActivity.getRequestedOrientation();
         FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
         decor.addView(view, COVER_SCREEN_PARAMS);
@@ -745,33 +732,6 @@
     public void onContextMenuClosed(Menu menu, boolean inLoad) {
     }
 
-    // error console
-
-    @Override
-    public void setShouldShowErrorConsole(Tab tab, boolean flag) {
-        if (tab == null) return;
-        ErrorConsoleView errorConsole = tab.getErrorConsole(true);
-        if (flag) {
-            // Setting the show state of the console will cause it's the layout
-            // to be inflated.
-            if (errorConsole.numberOfErrors() > 0) {
-                errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
-            } else {
-                errorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
-            }
-            if (errorConsole.getParent() != null) {
-                mErrorConsoleContainer.removeView(errorConsole);
-            }
-            // Now we can add it to the main view.
-            mErrorConsoleContainer.addView(errorConsole,
-                    new LinearLayout.LayoutParams(
-                            ViewGroup.LayoutParams.MATCH_PARENT,
-                            ViewGroup.LayoutParams.WRAP_CONTENT));
-        } else {
-            mErrorConsoleContainer.removeView(errorConsole);
-        }
-    }
-
     // -------------------------------------------------------------------------
     // Helper function for WebChromeClient
     // -------------------------------------------------------------------------
@@ -861,8 +821,6 @@
         }
     }
 
-
-
     public void translateTitleBar(float topControlsOffsetYPix) {
         if (mTitleBar != null && !mInActionMode) {
             if (topControlsOffsetYPix != 0.0) {
@@ -958,8 +916,8 @@
     }
 
     public void setContentViewMarginTop(int margin) {
-        LinearLayout.LayoutParams params =
-                (LinearLayout.LayoutParams) mContentView.getLayoutParams();
+        FrameLayout.LayoutParams params =
+                (FrameLayout.LayoutParams) mContentView.getLayoutParams();
         if (params.topMargin != margin) {
             params.topMargin = margin;
             mContentView.setLayoutParams(params);
@@ -996,7 +954,6 @@
 
         if (mTitleBar.isFixed()) {
             int fixedTbarHeight = mTitleBar.calculateEmbeddedHeight();
-            mFixedTitlebarContainer.setY(fixedTbarHeight);
             setContentViewMarginTop(fixedTbarHeight);
         } else {
             mTitleBar.setTranslationY(getActionModeHeight());
@@ -1007,7 +964,6 @@
     public void onActionModeFinished(boolean inLoad) {
         mInActionMode = false;
         if (mTitleBar.isFixed()) {
-            mFixedTitlebarContainer.setY(0);
             setContentViewMarginTop(0);
         } else {
             mTitleBar.setTranslationY(0);
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 975ae89..81af49d 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -344,10 +344,6 @@
     private void syncSharedSettings() {
         mNeedsSharedSync = false;
         CookieManager.getInstance().setAcceptCookie(acceptCookies());
-
-        if (mController != null) {
-            mController.setShouldShowErrorConsole(enableJavascriptConsole());
-        }
     }
 
     private void syncManagedSettings() {
@@ -839,13 +835,6 @@
         return mPrefs.getBoolean(PREF_ENABLE_CPU_UPLOAD_PATH, false);
     }
 
-    public boolean enableJavascriptConsole() {
-        if (!isDebugEnabled()) {
-            return false;
-        }
-        return mPrefs.getBoolean(PREF_JAVASCRIPT_CONSOLE, true);
-    }
-
     public boolean isSmallScreen() {
         if (!isDebugEnabled()) {
             return false;
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 62f3e10..33ef8ce 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -197,7 +197,6 @@
 
     private Message mAutoFillSetupMessage;
 
-    private boolean mShouldShowErrorConsole;
     private boolean mNetworkShouldNotify = true;
 
     // FIXME, temp address onPrepareMenu performance problem.
@@ -856,25 +855,6 @@
     }
 
     @Override
-    public boolean shouldShowErrorConsole() {
-        return mShouldShowErrorConsole;
-    }
-
-    protected void setShouldShowErrorConsole(boolean show) {
-        if (show == mShouldShowErrorConsole) {
-            // Nothing to do.
-            return;
-        }
-        mShouldShowErrorConsole = show;
-        Tab t = mTabControl.getCurrentTab();
-        if (t == null) {
-            // There is no current tab so we cannot toggle the error console
-            return;
-        }
-        mUi.setShouldShowErrorConsole(t, show);
-    }
-
-    @Override
     public void stopLoading() {
         mLoadStopped = true;
         Tab tab = mTabControl.getCurrentTab();
diff --git a/src/com/android/browser/ErrorConsoleView.java b/src/com/android/browser/ErrorConsoleView.java
deleted file mode 100644
index bcee7b5..0000000
--- a/src/com/android/browser/ErrorConsoleView.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.content.Context;
-import android.database.DataSetObserver;
-import android.graphics.Color;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.webkit.ConsoleMessage;
-import org.codeaurora.swe.WebView;
-
-import com.android.browser.R;
-
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.TwoLineListItem;
-
-import java.util.Vector;
-
-/* package */ class ErrorConsoleView extends LinearLayout {
-
-    /**
-     * Define some constants to describe the visibility of the error console.
-     */
-    public static final int SHOW_MINIMIZED = 0;
-    public static final int SHOW_MAXIMIZED = 1;
-    public static final int SHOW_NONE      = 2;
-
-    private TextView mConsoleHeader;
-    private ErrorConsoleListView mErrorList;
-    private LinearLayout mEvalJsViewGroup;
-    private EditText mEvalEditText;
-    private Button mEvalButton;
-    private WebView mWebView;
-    private int mCurrentShowState = SHOW_NONE;
-
-    private boolean mSetupComplete = false;
-
-    // Before we've been asked to display the console, cache any messages that should
-    // be added to the console. Then when we do display the console, add them to the view
-    // then.
-    private Vector<ConsoleMessage> mErrorMessageCache;
-
-    public ErrorConsoleView(Context context) {
-        super(context);
-    }
-
-    public ErrorConsoleView(Context context, AttributeSet attributes) {
-        super(context, attributes);
-    }
-
-    private void commonSetupIfNeeded() {
-        if (mSetupComplete) {
-            return;
-        }
-
-        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
-                Context.LAYOUT_INFLATER_SERVICE);
-        inflater.inflate(R.layout.error_console, this);
-
-        // Get references to each ui element.
-        mConsoleHeader = (TextView) findViewById(R.id.error_console_header_id);
-        mErrorList = (ErrorConsoleListView) findViewById(R.id.error_console_list_id);
-        mEvalJsViewGroup = (LinearLayout) findViewById(R.id.error_console_eval_view_group_id);
-        mEvalEditText = (EditText) findViewById(R.id.error_console_eval_text_id);
-        mEvalButton = (Button) findViewById(R.id.error_console_eval_button_id);
-
-        mEvalButton.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                // Send the javascript to be evaluated to webkit as a javascript: url
-                // TODO: Can we expose access to webkit's JS interpreter here and evaluate it that
-                // way? Note that this is called on the UI thread so we will need to post a message
-                // to the WebCore thread to implement this.
-                if (mWebView != null) {
-                    mWebView.loadUrl("javascript:" + mEvalEditText.getText());
-                }
-
-                mEvalEditText.setText("");
-            }
-        });
-
-        // Make clicking on the console title bar min/maximse it.
-        mConsoleHeader.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                if (mCurrentShowState == SHOW_MINIMIZED) {
-                    showConsole(SHOW_MAXIMIZED);
-                } else {
-                    showConsole(SHOW_MINIMIZED);
-                }
-            }
-        });
-
-        // Add any cached messages to the list now that we've assembled the view.
-        if (mErrorMessageCache != null) {
-            for (ConsoleMessage msg : mErrorMessageCache) {
-                mErrorList.addErrorMessage(msg);
-            }
-            mErrorMessageCache.clear();
-        }
-
-        mSetupComplete = true;
-    }
-
-    /**
-     * Adds a message to the set of messages the console uses.
-     */
-    public void addErrorMessage(ConsoleMessage consoleMessage) {
-        if (mSetupComplete) {
-            mErrorList.addErrorMessage(consoleMessage);
-        } else {
-            if (mErrorMessageCache == null) {
-                mErrorMessageCache = new Vector<ConsoleMessage>();
-            }
-            mErrorMessageCache.add(consoleMessage);
-        }
-    }
-
-    /**
-     * Removes all error messages from the console.
-     */
-    public void clearErrorMessages() {
-        if (mSetupComplete) {
-            mErrorList.clearErrorMessages();
-        } else if (mErrorMessageCache != null) {
-            mErrorMessageCache.clear();
-        }
-    }
-
-    /**
-     * Returns the current number of errors displayed in the console.
-     */
-    public int numberOfErrors() {
-        if (mSetupComplete) {
-            return mErrorList.getCount();
-        } else {
-            return (mErrorMessageCache == null) ? 0 : mErrorMessageCache.size();
-        }
-    }
-
-    /**
-     * Sets the webview that this console is associated with. Currently this is used so
-     * we can call into webkit to evaluate JS expressions in the console.
-     */
-    public void setWebView(WebView webview) {
-        mWebView = webview;
-    }
-
-    /**
-     * Sets the visibility state of the console.
-     */
-    public void showConsole(int show_state) {
-        commonSetupIfNeeded();
-        switch (show_state) {
-            case SHOW_MINIMIZED:
-                mConsoleHeader.setVisibility(View.VISIBLE);
-                mConsoleHeader.setText(R.string.error_console_header_text_minimized);
-                mErrorList.setVisibility(View.GONE);
-                mEvalJsViewGroup.setVisibility(View.GONE);
-                break;
-
-            case SHOW_MAXIMIZED:
-                mConsoleHeader.setVisibility(View.VISIBLE);
-                mConsoleHeader.setText(R.string.error_console_header_text_maximized);
-                mErrorList.setVisibility(View.VISIBLE);
-                mEvalJsViewGroup.setVisibility(View.VISIBLE);
-                break;
-
-            case SHOW_NONE:
-                mConsoleHeader.setVisibility(View.GONE);
-                mErrorList.setVisibility(View.GONE);
-                mEvalJsViewGroup.setVisibility(View.GONE);
-                break;
-        }
-        mCurrentShowState = show_state;
-    }
-
-    /**
-     * Returns the current visibility state of the console.
-     */
-    public int getShowState() {
-        if (mSetupComplete) {
-            return mCurrentShowState;
-        } else {
-            return SHOW_NONE;
-        }
-    }
-
-    /**
-     * This class extends ListView to implement the View that will actually display the set of
-     * errors encountered on the current page.
-     */
-    private static class ErrorConsoleListView extends ListView {
-        // An adapter for this View that contains a list of error messages.
-        private ErrorConsoleMessageList mConsoleMessages;
-
-        public ErrorConsoleListView(Context context, AttributeSet attributes) {
-            super(context, attributes);
-            mConsoleMessages = new ErrorConsoleMessageList(context);
-            setAdapter(mConsoleMessages);
-        }
-
-        public void addErrorMessage(ConsoleMessage consoleMessage) {
-            mConsoleMessages.add(consoleMessage);
-            setSelection(mConsoleMessages.getCount());
-        }
-
-        public void clearErrorMessages() {
-            mConsoleMessages.clear();
-        }
-
-        /**
-         * This class is an adapter for ErrorConsoleListView that contains the error console
-         * message data.
-         */
-        private static class ErrorConsoleMessageList extends android.widget.BaseAdapter
-                implements android.widget.ListAdapter {
-
-            private Vector<ConsoleMessage> mMessages;
-            private LayoutInflater mInflater;
-
-            public ErrorConsoleMessageList(Context context) {
-                mMessages = new Vector<ConsoleMessage>();
-                mInflater = (LayoutInflater)context.getSystemService(
-                        Context.LAYOUT_INFLATER_SERVICE);
-            }
-
-            /**
-             * Add a new message to the list and update the View.
-             */
-            public void add(ConsoleMessage consoleMessage) {
-                mMessages.add(consoleMessage);
-                notifyDataSetChanged();
-            }
-
-            /**
-             * Remove all messages from the list and update the view.
-             */
-            public void clear() {
-                mMessages.clear();
-                notifyDataSetChanged();
-            }
-
-            @Override
-            public boolean areAllItemsEnabled() {
-                return false;
-            }
-
-            @Override
-            public boolean isEnabled(int position) {
-                return false;
-            }
-
-            public long getItemId(int position) {
-                return position;
-            }
-
-            public Object getItem(int position) {
-                return mMessages.get(position);
-            }
-
-            public int getCount() {
-                return mMessages.size();
-            }
-
-            @Override
-            public boolean hasStableIds() {
-                return true;
-            }
-
-            /**
-             * Constructs a TwoLineListItem for the error at position.
-             */
-            public View getView(int position, View convertView, ViewGroup parent) {
-                View view;
-                ConsoleMessage error = mMessages.get(position);
-
-                if (error == null) {
-                    return null;
-                }
-
-                if (convertView == null) {
-                    view = mInflater.inflate(android.R.layout.two_line_list_item, parent, false);
-                } else {
-                    view = convertView;
-                }
-
-                TextView headline = (TextView) view.findViewById(android.R.id.text1);
-                TextView subText = (TextView) view.findViewById(android.R.id.text2);
-                headline.setText(error.sourceId() + ":" + error.lineNumber());
-                subText.setText(error.message());
-                switch (error.messageLevel()) {
-                    case ERROR:
-                        subText.setTextColor(Color.RED);
-                        break;
-                    case WARNING:
-                        // Orange
-                        subText.setTextColor(Color.rgb(255,192,0));
-                        break;
-                    case TIP:
-                        subText.setTextColor(Color.BLUE);
-                        break;
-                    default:
-                        subText.setTextColor(Color.LTGRAY);
-                        break;
-                }
-                return view;
-            }
-
-        }
-    }
-}
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index ea6b1d6..bb63f04 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -72,7 +72,6 @@
     static final String PREF_ENABLE_TRACING = "enable_tracing";
     static final String PREF_ENABLE_VISUAL_INDICATOR = "enable_visual_indicator";
     static final String PREF_ENABLE_CPU_UPLOAD_PATH = "enable_cpu_upload_path";
-    static final String PREF_JAVASCRIPT_CONSOLE = "javascript_console";
     static final String PREF_JS_ENGINE_FLAGS = "js_engine_flags";
     static final String PREF_NORMAL_LAYOUT = "normal_layout";
     static final String PREF_SMALL_SCREEN = "small_screen";
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index ebb3523..12dc156 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -192,12 +192,6 @@
     }
 
     @Override
-    public boolean shouldShowErrorConsole() {
-        if (LOGD_ENABLED) Log.d(LOGTAG, "shouldShowErrorConsole()");
-        return false;
-    }
-
-    @Override
     public void onUpdatedSecurityState(Tab tab) {
         if (LOGD_ENABLED) Log.d(LOGTAG, "onUpdatedSecurityState()");
     }
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 3b57d9e..b7be6a5 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -178,10 +178,6 @@
     private boolean mCloseOnBack;
     // flag to indicate if the tab was opened from an intent
     private boolean mDerivedFromIntent = false;
-    // Keep the original url around to avoid killing the old WebView if the url
-    // has not changed.
-    // Error console for the tab
-    private ErrorConsoleView mErrorConsole;
     // The listener that gets invoked when a download is started from the
     // mMainView
     private final BrowserDownloadListener mDownloadListener;
@@ -396,14 +392,6 @@
                 mTouchIconLoader = null;
             }
 
-            // reset the error console
-            if (mErrorConsole != null) {
-                mErrorConsole.clearErrorMessages();
-                if (mWebViewController.shouldShowErrorConsole()) {
-                    mErrorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
-                }
-            }
-
             // finally update the UI in the activity if it is in the foreground
             mWebViewController.onPageStarted(Tab.this, view, favicon);
 
@@ -1053,17 +1041,6 @@
          */
         @Override
         public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-            if (mInForeground) {
-                // call getErrorConsole(true) so it will create one if needed
-                ErrorConsoleView errorConsole = getErrorConsole(true);
-                errorConsole.addErrorMessage(consoleMessage);
-                if (mWebViewController.shouldShowErrorConsole()
-                        && errorConsole.getShowState() !=
-                            ErrorConsoleView.SHOW_MAXIMIZED) {
-                    errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
-                }
-            }
-
             // Don't log console messages in private browsing mode
             if (isPrivateBrowsingEnabled()) return true;
 
@@ -1833,22 +1810,6 @@
     }
 
     /**
-     * Return the tab's error console. Creates the console if createIfNEcessary
-     * is true and we haven't already created the console.
-     * @param createIfNecessary Flag to indicate if the console should be
-     *            created if it has not been already.
-     * @return The tab's error console, or null if one has not been created and
-     *         createIfNecessary is false.
-     */
-    ErrorConsoleView getErrorConsole(boolean createIfNecessary) {
-        if (createIfNecessary && mErrorConsole == null) {
-            mErrorConsole = new ErrorConsoleView(mContext);
-            mErrorConsole.setWebView(mMainView);
-        }
-        return mErrorConsole;
-    }
-
-    /**
      * Sets the security state, clears the SSL certificate error and informs
      * the controller.
      */
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 5aefd0b..e916a35 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -115,8 +115,6 @@
 
     public void onActionModeFinished(boolean inLoad);
 
-    public void setShouldShowErrorConsole(Tab tab, boolean show);
-
     // returns if the web page is clear of any overlays (not including sub windows)
     public boolean isWebShowing();
 
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 446083a..cf989e8 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -73,8 +73,6 @@
 
     void handleNewIntent(Intent intent);
 
-    boolean shouldShowErrorConsole();
-
     void hideCustomView();
 
     void attachSubWindow(Tab tab);
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 373d72c..e68f9bf 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -90,8 +90,6 @@
 
     void onUserCanceledSsl(Tab tab);
 
-    boolean shouldShowErrorConsole();
-
     void onUpdatedSecurityState(Tab tab);
 
     void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture);
diff --git a/src/com/android/browser/view/CustomScreenLinearLayout.java b/src/com/android/browser/view/CustomScreenLinearLayout.java
deleted file mode 100644
index f5341e8..0000000
--- a/src/com/android/browser/view/CustomScreenLinearLayout.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.browser.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-
-public class CustomScreenLinearLayout extends LinearLayout {
-
-    public CustomScreenLinearLayout(Context context) {
-        super(context);
-        setChildrenDrawingOrderEnabled(true);
-    }
-
-    public CustomScreenLinearLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setChildrenDrawingOrderEnabled(true);
-    }
-
-    public CustomScreenLinearLayout(Context context, AttributeSet attrs,
-            int defStyle) {
-        super(context, attrs, defStyle);
-        setChildrenDrawingOrderEnabled(true);
-    }
-
-    @Override
-    protected int getChildDrawingOrder(int childCount, int i) {
-        return childCount - i - 1;
-    }
-
-}
