diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c006ce3..2bba142 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1786,6 +1786,13 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".deviceinfo.UsbModeChooserActivity"
+                  android:excludeFromRecents="true"
+                  android:exported="true"
+                  android:permission="android.permission.MANAGE_USB"
+                  android:theme="@style/Transparent">
+        </activity>
+
         <activity android:name=".bluetooth.RequestPermissionHelperActivity"
                   android:label="@string/bluetooth_pairing_request"
                   android:excludeFromRecents="true"
diff --git a/res/menu/storage.xml b/res/menu/storage.xml
deleted file mode 100644
index 2e4c660..0000000
--- a/res/menu/storage.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/storage_usb"
-        android:title="@string/storage_menu_usb" />
-</menu>
diff --git a/res/menu/storage_volume.xml b/res/menu/storage_volume.xml
index b461f46..efa468c 100644
--- a/res/menu/storage_volume.xml
+++ b/res/menu/storage_volume.xml
@@ -30,7 +30,4 @@
     <item
         android:id="@+id/storage_migrate"
         android:title="@string/storage_menu_migrate" />
-    <item
-        android:id="@+id/storage_usb"
-        android:title="@string/storage_menu_usb" />
 </menu>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index d556b1b..1af15f9 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1365,4 +1365,12 @@
         <item>0</item>
     </string-array>
 
+    <!-- These values must match up with the code in UsbModeChooserActivity.java. -->
+    <string-array name="usb_available_functions">
+        <item>@string/usb_use_charging_only</item>
+        <item>@string/usb_use_file_transfers</item>
+        <item>@string/usb_use_photo_transfers</item>
+        <item>@string/usb_use_MIDI</item>
+    </string-array>
+
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 53df0ef..08e6c23 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2293,8 +2293,6 @@
     <string name="storage_menu_migrate">Migrate data</string>
     <!-- Storage setting.  Menu option for forgetting a storage device [CHAR LIMIT=30]-->
     <string name="storage_menu_forget">Forget</string>
-    <!-- Storage setting.  Menu option for USB transfer settings [CHAR LIMIT=30]-->
-    <string name="storage_menu_usb">USB computer connection</string>
 
     <!-- Storage setting.  Title for USB transfer settings [CHAR LIMIT=30]-->
     <string name="storage_title_usb">USB computer connection</string>
@@ -6601,4 +6599,25 @@
     <!-- Description of how many more permissions to view on next page [CHAR LIMIT=30] -->
     <string name="additional_permissions_more"><xliff:g id="count" example="2">%1$d</xliff:g> more</string>
 
+    <!-- One of the choices in a dialog (with title defined in usb_use) that lets the user
+         select what the USB connection for this device should be used for. This choice
+         is for charging only. -->
+    <string name="usb_use_charging_only">Charging only</string>
+    <!-- One of the choices in a dialog (with title defined in usb_use) that lets the user
+         select what the USB connection for this device should be used for. This choice
+         is for transferring files via MTP. -->
+    <string name="usb_use_file_transfers">Transfer files (MTP)</string>
+    <!-- One of the choices in a dialog (with title defined in usb_use) that lets the user
+         select what the USB connection for this device should be used for. This choice
+         is for transferring photos via PTP. -->
+    <string name="usb_use_photo_transfers">Transfer photos (PTP)</string>
+    <!-- One of the choices in a dialog (with title defined in usb_use) that lets the user
+         select what the USB connection for this device should be used for. This choice
+         is for entering MIDI mode. -->
+    <string name="usb_use_MIDI">MIDI</string>
+    <!-- The title used in a dialog which lets the user select what the USB connection
+         for this device should be used for. Choices are usb_use_charging_only,
+         usb_use_file_transfer, use_use_photo_transfer, and usb_use_MIDI -->
+    <string name="usb_use">Use USB for</string>
+
 </resources>
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 314e70a..23191ad 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -1274,7 +1274,7 @@
 
     private void writeUsbConfigurationOption(Object newValue) {
         UsbManager manager = (UsbManager)getActivity().getSystemService(Context.USB_SERVICE);
-        manager.setCurrentFunction(newValue.toString(), false);
+        manager.setCurrentFunction(newValue.toString());
     }
 
     private void updateCpuUsageOptions() {
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index aa492f3..7ce581f 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -87,7 +87,6 @@
 import com.android.settings.deviceinfo.PrivateVolumeSettings;
 import com.android.settings.deviceinfo.PublicVolumeSettings;
 import com.android.settings.deviceinfo.StorageSettings;
-import com.android.settings.deviceinfo.UsbSettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageDetail;
 import com.android.settings.fuelgauge.PowerUsageSummary;
@@ -318,7 +317,6 @@
             PrivateVolumeSettings.class.getName(),
             PublicVolumeSettings.class.getName(),
             DevelopmentSettings.class.getName(),
-            UsbSettings.class.getName(),
             AndroidBeam.class.getName(),
             WifiDisplaySettings.class.getName(),
             PowerUsageSummary.class.getName(),
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index e5f50dd..7cefe4a 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -273,7 +273,6 @@
         final MenuItem unmount = menu.findItem(R.id.storage_unmount);
         final MenuItem format = menu.findItem(R.id.storage_format);
         final MenuItem migrate = menu.findItem(R.id.storage_migrate);
-        final MenuItem usb = menu.findItem(R.id.storage_usb);
 
         // Actions live in menu for non-internal private volumes; they're shown
         // as preference items for public volumes.
@@ -293,9 +292,6 @@
         final VolumeInfo privateVol = getActivity().getPackageManager()
                 .getPrimaryStorageCurrentVolume();
         migrate.setVisible(!Objects.equals(mVolume, privateVol));
-
-        // TODO: show usb if we jumped past first screen
-        usb.setVisible(false);
     }
 
     @Override
@@ -324,10 +320,6 @@
                 intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
                 startActivity(intent);
                 return true;
-            case R.id.storage_usb:
-                startFragment(this, UsbSettings.class.getCanonicalName(),
-                        R.string.storage_title_usb, 0, null);
-                return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 4c03d8f..b5b3841 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -149,29 +149,6 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.storage, menu);
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        final MenuItem usb = menu.findItem(R.id.storage_usb);
-
-        usb.setVisible(!mUserManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER));
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.storage_usb:
-                startFragment(this, UsbSettings.class.getCanonicalName(),
-                        R.string.storage_title_usb, 0, null);
-                return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) {
         final String volId = pref.getKey();
         final VolumeInfo vol = mStorageManager.findVolumeById(volId);
diff --git a/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java b/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java
new file mode 100644
index 0000000..76b2fd1
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 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.settings.deviceinfo;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.hardware.usb.UsbManager;
+import android.os.Bundle;
+import android.util.Log;
+import com.android.settings.R;
+
+/**
+ * UI for the USB chooser dialog.
+ *
+ * TODO: Don't show some UI elements if UserManager.DISALLOW_USB_FILE_TRANSFER is disabled.
+ */
+public class UsbModeChooserActivity extends Activity {
+
+    private UsbManager mUsbManager;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
+        final AlertDialog levelDialog;
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        builder.setTitle(R.string.usb_use);
+        builder.setSingleChoiceItems(R.array.usb_available_functions, getCurrentFunction(),
+                new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        setCurrentFunction(which);
+                        dialog.dismiss();
+                        UsbModeChooserActivity.this.finish();
+                    }
+                });
+        builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
+            @Override
+            public void onDismiss(DialogInterface dialog) {
+                UsbModeChooserActivity.this.finish();
+            }
+        });
+        builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                UsbModeChooserActivity.this.finish();
+            }
+        });
+        levelDialog = builder.create();
+        levelDialog.show();
+    }
+
+    /*
+     * If you change the numbers here, you also need to change R.array.usb_available_functions
+     * so that everything matches.
+     */
+    private int getCurrentFunction() {
+        if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MTP)) {
+            return 1;
+        } else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_PTP)) {
+            return 2;
+        } else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MIDI)) {
+            return 3;
+        }
+        return 0;
+    }
+
+    /*
+     * If you change the numbers here, you also need to change R.array.usb_available_functions
+     * so that everything matches.
+     */
+    private void setCurrentFunction(int which) {
+        switch (which) {
+            case 0:
+                mUsbManager.setCurrentFunction("none");
+                break;
+            case 1:
+                mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP);
+                break;
+            case 2:
+                mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_PTP);
+                break;
+            case 3:
+                mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MIDI);
+                break;
+        }
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/UsbSettings.java b/src/com/android/settings/deviceinfo/UsbSettings.java
deleted file mode 100644
index d8a675c..0000000
--- a/src/com/android/settings/deviceinfo/UsbSettings.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2011 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.settings.deviceinfo;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.hardware.usb.UsbManager;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-
-/**
- * USB storage settings.
- */
-public class UsbSettings extends SettingsPreferenceFragment {
-
-    private static final String TAG = "UsbSettings";
-
-    private static final String KEY_MTP = "usb_mtp";
-    private static final String KEY_PTP = "usb_ptp";
-    private static final String KEY_MIDI = "usb_midi";
-
-    private UsbManager mUsbManager;
-    private CheckBoxPreference mMtp;
-    private CheckBoxPreference mPtp;
-    private CheckBoxPreference mMidi;
-    private boolean mUsbAccessoryMode;
-
-    private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
-        public void onReceive(Context content, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(UsbManager.ACTION_USB_STATE)) {
-               mUsbAccessoryMode = intent.getBooleanExtra(UsbManager.USB_FUNCTION_ACCESSORY, false);
-               Log.e(TAG, "UsbAccessoryMode " + mUsbAccessoryMode);
-            }
-            updateToggles(mUsbManager.getDefaultFunction());
-        }
-    };
-
-    private PreferenceScreen createPreferenceHierarchy() {
-        PreferenceScreen root = getPreferenceScreen();
-        if (root != null) {
-            root.removeAll();
-        }
-        addPreferencesFromResource(R.xml.usb_settings);
-        root = getPreferenceScreen();
-
-        mMtp = (CheckBoxPreference)root.findPreference(KEY_MTP);
-        mPtp = (CheckBoxPreference)root.findPreference(KEY_PTP);
-        mMidi = (CheckBoxPreference)root.findPreference(KEY_MIDI);
-
-        UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
-        if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) {
-            mMtp.setEnabled(false);
-            mPtp.setEnabled(false);
-        }
-
-        return root;
-    }
-
-    @Override
-    protected int getMetricsCategory() {
-        return MetricsLogger.DEVICEINFO_USB;
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        getActivity().unregisterReceiver(mStateReceiver);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        // Make sure we reload the preference hierarchy since some of these settings
-        // depend on others...
-        createPreferenceHierarchy();
-
-        // ACTION_USB_STATE is sticky so this will call updateToggles
-        getActivity().registerReceiver(mStateReceiver,
-                new IntentFilter(UsbManager.ACTION_USB_STATE));
-    }
-
-    private void updateToggles(String function) {
-        if (UsbManager.USB_FUNCTION_MTP.equals(function)) {
-            mMtp.setChecked(true);
-            mPtp.setChecked(false);
-            mMidi.setChecked(false);
-        } else if (UsbManager.USB_FUNCTION_PTP.equals(function)) {
-            mMtp.setChecked(false);
-            mPtp.setChecked(true);
-            mMidi.setChecked(false);
-        } else if (UsbManager.USB_FUNCTION_MIDI.equals(function)) {
-            mMtp.setChecked(false);
-            mPtp.setChecked(false);
-            mMidi.setChecked(true);
-        } else  {
-            mMtp.setChecked(false);
-            mPtp.setChecked(false);
-            mMidi.setChecked(false);
-        }
-        UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
-        if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) {
-            Log.e(TAG, "USB is locked down");
-            mMtp.setEnabled(false);
-            mPtp.setEnabled(false);
-            mMidi.setEnabled(true);
-        } else if (!mUsbAccessoryMode) {
-            //Enable MTP and PTP switch while USB is not in Accessory Mode, otherwise disable it
-            Log.e(TAG, "USB Normal Mode");
-            mMtp.setEnabled(true);
-            mPtp.setEnabled(true);
-            mMidi.setEnabled(true);
-        } else {
-            Log.e(TAG, "USB Accessory Mode");
-            mMtp.setEnabled(false);
-            mPtp.setEnabled(false);
-            mMidi.setEnabled(false);
-        }
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
-        // Don't allow any changes to take effect as the USB host will be disconnected, killing
-        // the monkeys
-        if (Utils.isMonkeyRunning()) {
-            return true;
-        }
-        // If this user is disallowed from using USB, don't handle their attempts to change the
-        // setting.
-        UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
-        if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) {
-            return true;
-        }
-
-        String function = "none";
-        if (preference == mMtp && mMtp.isChecked()) {
-            function = UsbManager.USB_FUNCTION_MTP;
-        } else if (preference == mPtp && mPtp.isChecked()) {
-            function = UsbManager.USB_FUNCTION_PTP;
-        } else if (preference == mMidi && mMidi.isChecked()) {
-            function = UsbManager.USB_FUNCTION_MIDI;
-        }
-
-        mUsbManager.setCurrentFunction(function, true);
-        updateToggles(function);
-
-        return true;
-    }
-}
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index e1eec5f..93e0948 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -34,7 +34,6 @@
 import com.android.settings.applications.ManageDefaultApps;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.StorageSettings;
-import com.android.settings.deviceinfo.UsbSettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
@@ -131,7 +130,6 @@
 
         // Storage
         sRankMap.put(StorageSettings.class.getName(), RANK_STORAGE);
-        sRankMap.put(UsbSettings.class.getName(), RANK_STORAGE);
 
         // Battery
         sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index a3d2ddc..4d28d4a 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -36,7 +36,6 @@
 import com.android.settings.applications.ManageDefaultApps;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.StorageSettings;
-import com.android.settings.deviceinfo.UsbSettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
@@ -178,13 +177,6 @@
                         StorageSettings.class.getName(),
                         R.drawable.ic_settings_storage));
 
-        sResMap.put(UsbSettings.class.getName(),
-                new SearchIndexableResource(
-                        Ranking.getRankForClassName(UsbSettings.class.getName()),
-                        R.xml.usb_settings,
-                        UsbSettings.class.getName(),
-                        R.drawable.ic_settings_storage));
-
         sResMap.put(PowerUsageSummary.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(PowerUsageSummary.class.getName()),
