diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 12b8b29..99a40fe 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -98,6 +98,7 @@
 import com.android.browser.R;
 import com.android.browser.IntentHandler.UrlData;
 import com.android.browser.UI.ComboViews;
+import com.android.browser.mdm.IncognitoRestriction;
 import com.android.browser.mdm.URLFilterRestriction;
 import com.android.browser.mynavigation.AddMyNavigationPage;
 import com.android.browser.mynavigation.MyNavigationUtil;
@@ -1930,6 +1931,10 @@
         }
         mCurrentMenuState = mMenuState;
         mUi.onPrepareOptionsMenu(menu);
+
+        IncognitoRestriction.getInstance()
+                            .registerControl(menu.findItem(R.id.incognito_menu_id)
+                                                 .getIcon());
     }
 
     private void setMenuItemVisibility(Menu menu, int id,
@@ -3063,20 +3068,24 @@
     private Tab createNewTab(boolean incognito, boolean setActive,
             boolean useCurrent) {
         Tab tab = null;
-        if (mTabControl.canCreateNewTab()) {
-            tab = mTabControl.createNewTab(incognito, !setActive);
-            addTab(tab);
-            if (setActive) {
-                setActiveTab(tab);
-            } else {
-                tab.pause();
-            }
+        if (IncognitoRestriction.getInstance().isEnabled() && incognito) {
+            Toast.makeText(getContext(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
         } else {
-            if (useCurrent) {
-                tab = mTabControl.getCurrentTab();
-                reuseTab(tab, null);
+            if (mTabControl.canCreateNewTab()) {
+                tab = mTabControl.createNewTab(incognito, !setActive);
+                addTab(tab);
+                if (setActive) {
+                    setActiveTab(tab);
+                } else {
+                    tab.pause();
+                }
             } else {
-                mUi.showMaxTabsWarning();
+                if (useCurrent) {
+                    tab = mTabControl.getCurrentTab();
+                    reuseTab(tab, null);
+                } else {
+                    mUi.showMaxTabsWarning();
+                }
             }
         }
         return tab;
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 76d0703..d8bfd56 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -33,7 +33,6 @@
 import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.RelativeLayout;
-import android.widget.Toast;
 
 import com.android.browser.NavTabScroller.OnRemoveListener;
 import com.android.browser.mdm.IncognitoRestriction;
@@ -117,7 +116,7 @@
                 R.string.accessibility_transition_navscreen));
         mToolbarLayout = findViewById(R.id.nav_toolbar_animate);
         mNewIncognitoTab = (ImageButton) findViewById(R.id.newincognitotab);
-        IncognitoRestriction.getInstance().registerButton(mNewIncognitoTab);
+        IncognitoRestriction.getInstance().registerControl(mNewIncognitoTab);
         mNewTab = (ImageButton) findViewById(R.id.newtab);
         mMore = (ImageButton) findViewById(R.id.more);
         mNewIncognitoTab.setOnClickListener(this);
@@ -149,11 +148,7 @@
         if (mNewTab == v) {
             openNewTab();
         } else if (mNewIncognitoTab == v) {
-            if (IncognitoRestriction.getInstance().isEnabled()) {
-                Toast.makeText(getContext(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
-            } else {
-                openNewIncognitoTab();
-            }
+            openNewIncognitoTab();
         } else if (mMore == v) {
             showPopupMenu();
         }
diff --git a/src/com/android/browser/mdm/IncognitoRestriction.java b/src/com/android/browser/mdm/IncognitoRestriction.java
index eb62cd3..3ea1fe4 100644
--- a/src/com/android/browser/mdm/IncognitoRestriction.java
+++ b/src/com/android/browser/mdm/IncognitoRestriction.java
@@ -30,8 +30,11 @@
 
 package com.android.browser.mdm;
 
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.widget.ImageButton;
+import android.view.View;
+
+import java.util.ArrayList;
 
 public class IncognitoRestriction extends Restriction {
 
@@ -40,10 +43,14 @@
     public static final String INCOGNITO_RESTRICTION_ENABLED = "IncognitoRestrictionEnabled"; // boolean
 
     private static IncognitoRestriction sInstance;
-    private ImageButton mIncogButton = null;
+
+    private ArrayList<View> registeredViews;
+    private ArrayList<Drawable> registeredDrawables;
 
     private IncognitoRestriction() {
         super();
+        registeredViews = new ArrayList<>();
+        registeredDrawables = new ArrayList<>();
     }
 
     public static IncognitoRestriction getInstance() {
@@ -61,19 +68,40 @@
         updateButton();
     }
 
-    public void registerButton (ImageButton ib) {
-        mIncogButton = ib;
+    public void registerControl(View v) {
+        if (!registeredViews.contains(v)) {
+            registeredViews.add(v);
+        }
+        updateButton();
+    }
+
+    public void registerControl(Drawable d) {
+        if (!registeredDrawables.contains(d)) {
+            registeredDrawables.add(d);
+        }
         updateButton();
     }
 
     private void updateButton() {
-        if (null != mIncogButton) {
-            mIncogButton.setAlpha((float) (isEnabled() ? 0.5 : 1.0));
+        if (null != registeredViews) {
+            for (View v : registeredViews) {
+                if (null != v) {
+                    v.setAlpha((float) (isEnabled() ? 0.5 : 1.0));
+                }
+            }
+        }
+        if (null != registeredDrawables) {
+            for (Drawable d : registeredDrawables) {
+                if (null != d) {
+                    d.setAlpha((isEnabled() ? 0x80 : 0xff));
+                }
+            }
         }
     }
 
     // For testing
     public float getButtonAlpha() {
-        return mIncogButton != null ? mIncogButton.getAlpha() : (float) 1.0;
+        View v = registeredViews.get(0);
+        return v != null ? v.getAlpha() : (float) 1.0;
     }
 }
