diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index d724b74..aefbbd8 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -52,12 +52,6 @@
                 android:persistent="false"
                 android:fragment="com.android.settings.DeviceAdminSettings"/>
 
-        <com.android.settingslib.RestrictedSwitchPreference android:key="toggle_install_applications"
-                android:title="@string/install_applications"
-                android:summaryOff="@string/install_unknown_applications"
-                android:summaryOn="@string/install_unknown_applications"
-                settings:useAdditionalSummary="true" />
-
     </PreferenceCategory>
 
     <PreferenceCategory android:key="credentials_management"
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 436745f..5db2ed8 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -86,7 +86,7 @@
  * Gesture lock pattern settings.
  */
 public class SecuritySettings extends SettingsPreferenceFragment
-        implements OnPreferenceChangeListener, DialogInterface.OnClickListener, Indexable,
+        implements OnPreferenceChangeListener, Indexable,
         GearPreference.OnGearClickListener {
 
     private static final String TAG = "SecuritySettings";
@@ -120,7 +120,6 @@
     private static final String KEY_USER_CREDENTIALS = "user_credentials";
     private static final String KEY_RESET_CREDENTIALS = "credentials_reset";
     private static final String KEY_CREDENTIALS_INSTALL = "credentials_install";
-    private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
     private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";
     private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
     private static final String KEY_TRUST_AGENT = "trust_agent";
@@ -137,8 +136,7 @@
 
     // These switch preferences need special handling since they're not all stored in Settings.
     private static final String SWITCH_PREFERENCE_KEYS[] = {
-            KEY_SHOW_PASSWORD, KEY_TOGGLE_INSTALL_APPLICATIONS, KEY_UNIFICATION,
-            KEY_VISIBLE_PATTERN_PROFILE
+            KEY_SHOW_PASSWORD, KEY_UNIFICATION, KEY_VISIBLE_PATTERN_PROFILE
     };
 
     // Only allow one trust agent on the platform.
@@ -165,9 +163,6 @@
     private KeyStore mKeyStore;
     private RestrictedPreference mResetCredentials;
 
-    private RestrictedSwitchPreference mToggleAppInstallation;
-    private DialogInterface mWarnInstallApps;
-
     private boolean mIsAdmin;
 
     private Intent mTrustAgentClickIntent;
@@ -397,26 +392,6 @@
         // Application install
         PreferenceGroup deviceAdminCategory = (PreferenceGroup)
                 root.findPreference(KEY_DEVICE_ADMIN_CATEGORY);
-        mToggleAppInstallation = (RestrictedSwitchPreference) findPreference(
-                KEY_TOGGLE_INSTALL_APPLICATIONS);
-        mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
-        // Side loading of apps.
-        // Disable for restricted profiles. For others, check if policy disallows it.
-        mToggleAppInstallation.setEnabled(!um.getUserInfo(MY_USER_ID).isRestricted());
-        if (RestrictedLockUtils.hasBaseUserRestriction(getActivity(),
-                UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, MY_USER_ID)
-                || RestrictedLockUtils.hasBaseUserRestriction(getActivity(),
-                        UserManager.DISALLOW_INSTALL_APPS, MY_USER_ID)) {
-            mToggleAppInstallation.setEnabled(false);
-        }
-        if (mToggleAppInstallation.isEnabled()) {
-            mToggleAppInstallation.checkRestrictionAndSetDisabled(
-                    UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
-            if (!mToggleAppInstallation.isDisabledByAdmin()) {
-                mToggleAppInstallation.checkRestrictionAndSetDisabled(
-                        UserManager.DISALLOW_INSTALL_APPS);
-            }
-        }
 
         // Advanced Security features
         PreferenceGroup advancedCategory =
@@ -600,43 +575,6 @@
         return result;
     }
 
-    private boolean isNonMarketAppsAllowed() {
-        return Settings.Global.getInt(getContentResolver(),
-                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
-    }
-
-    private void setNonMarketAppsAllowed(boolean enabled) {
-        final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
-        if (um.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)) {
-            return;
-        }
-        // Change the system setting
-        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,
-                                enabled ? 1 : 0);
-    }
-
-    private void warnAppInstallation() {
-        // TODO: DialogFragment?
-        mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle(
-                getResources().getString(R.string.error_title))
-                .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
-                .setMessage(getResources().getString(R.string.install_all_warning))
-                .setPositiveButton(android.R.string.yes, this)
-                .setNegativeButton(android.R.string.no, this)
-                .show();
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (dialog == mWarnInstallApps) {
-            boolean turnOn = which == DialogInterface.BUTTON_POSITIVE;
-            setNonMarketAppsAllowed(turnOn);
-            if (mToggleAppInstallation != null) {
-                mToggleAppInstallation.setChecked(turnOn);
-            }
-        }
-    }
-
     @Override
     public void onGearClick(GearPreference p) {
         if (KEY_UNLOCK_SET_OR_CHANGE.equals(p.getKey())) {
@@ -645,14 +583,6 @@
     }
 
     @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if (mWarnInstallApps != null) {
-            mWarnInstallApps.dismiss();
-        }
-    }
-
-    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         if (mTrustAgentClickIntent != null) {
@@ -857,15 +787,6 @@
             Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
                     ((Boolean) value) ? 1 : 0);
             lockPatternUtils.setVisiblePasswordEnabled((Boolean) value, MY_USER_ID);
-        } else if (KEY_TOGGLE_INSTALL_APPLICATIONS.equals(key)) {
-            if ((Boolean) value) {
-                mToggleAppInstallation.setChecked(false);
-                warnAppInstallation();
-                // Don't change Switch status until user makes choice in dialog, so return false.
-                result = false;
-            } else {
-                setNonMarketAppsAllowed(false);
-            }
         }
         return result;
     }
