diff --git a/src/com/android/settings/deviceinfo/StorageWizardInit.java b/src/com/android/settings/deviceinfo/StorageWizardInit.java
index ffc07e5..05c7b15 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardInit.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardInit.java
@@ -16,18 +16,26 @@
 
 package com.android.settings.deviceinfo;
 
+import static com.android.settings.deviceinfo.StorageSettings.TAG;
+
 import android.app.ActivityManager;
 import android.content.Intent;
+import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.UserManager;
 import android.os.storage.DiskInfo;
 import android.os.storage.VolumeInfo;
+import android.util.DebugUtils;
+import android.util.Log;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.RadioButton;
 
 import com.android.settings.R;
 
+import java.io.File;
+
 public class StorageWizardInit extends StorageWizardBase {
     private RadioButton mRadioExternal;
     private RadioButton mRadioInternal;
@@ -69,12 +77,15 @@
             mRadioExternal.setChecked(true);
             onNavigateNext();
             finish();
-        }
-
-        // TODO: Show a message about why this is disabled for guest and that only an admin user
-        // can adopt an sd card.
-        if (!mIsPermittedToAdopt) {
+        } else if (!mIsPermittedToAdopt) {
+            // TODO: Show a message about why this is disabled for guest and
+            // that only an admin user can adopt an sd card.
             mRadioInternal.setEnabled(false);
+        } else if (mVolume != null && mVolume.getType() == VolumeInfo.TYPE_PUBLIC
+                && mVolume.isMountedReadable()) {
+            // Device is mounted, so classify contents to possibly pick a
+            // recommended default operation.
+            new ClassifyTask().execute(mVolume.getPath());
         }
     }
 
@@ -121,4 +132,29 @@
             startActivity(intent);
         }
     }
+
+    /**
+     * Task that classifies the contents of a mounted storage device, and sets a
+     * recommended default operation based on result.
+     */
+    public class ClassifyTask extends AsyncTask<File, Void, Integer> {
+        @Override
+        protected Integer doInBackground(File... params) {
+            int classes = Environment.classifyExternalStorageDirectory(params[0]);
+            Log.v(TAG, "Classified " + params[0] + " as "
+                    + DebugUtils.flagsToString(Environment.class, "HAS_", classes));
+            return classes;
+        }
+
+        @Override
+        protected void onPostExecute(Integer classes) {
+            if (classes == 0) {
+                // Empty is strong signal for adopt
+                mRadioInternal.setChecked(true);
+            } else if ((classes & (Environment.HAS_PICTURES | Environment.HAS_DCIM)) != 0) {
+                // Photos is strong signal for portable
+                mRadioExternal.setChecked(true);
+            }
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
index 1b10e85..20f9e62 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
@@ -82,7 +82,7 @@
                 mock(Lifecycle.class));
 
         ReflectionHelpers.setField(mController, "mBackend", mBackend);
-        ReflectionHelpers.setField(mController, "DEFAULT_RULE_IDS", mDefaultIds);
+        ReflectionHelpers.setField(mController, "mDefaultRuleIds", mDefaultIds);
 
         when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
                 mockPref);
@@ -188,4 +188,4 @@
 
         return ruleMap;
     }
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeScheduleRuleSettingsTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeScheduleRuleSettingsTest.java
index f8cc767..070aa38 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeScheduleRuleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeScheduleRuleSettingsTest.java
@@ -17,10 +17,10 @@
 package com.android.settings.notification;
 
 import android.app.Activity;
+import android.app.NotificationManager;
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.Intent;
-import android.os.UserManager;
 
 import com.android.settings.R;
 import com.android.settings.TestConfig;
@@ -34,6 +34,8 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowToast;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.RuntimeEnvironment;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.doReturn;
@@ -58,14 +60,19 @@
     private Intent mIntent;
 
     @Mock
-    private UserManager mUserManager;
+    private NotificationManager mNotificationManager;
 
     private TestFragment mFragment;
+    private Context mContext;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        ShadowApplication shadowApplication = ShadowApplication.getInstance();
+        shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
+        mContext = shadowApplication.getApplicationContext();
+
         mFragment = spy(new TestFragment());
         mFragment.onAttach(application);
 
@@ -77,13 +84,13 @@
         when(mActivity.getTheme()).thenReturn(res.newTheme());
         when(mActivity.getIntent()).thenReturn(mIntent);
         when(mActivity.getResources()).thenReturn(res);
-        when(mFragment.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mFragment.getContext()).thenReturn(mContext);
     }
 
     @Test
     public void onCreate_noRuleId_shouldToastAndFinishAndNoCrash() {
-        final Context ctx = application.getApplicationContext();
-        final String expected = ctx.getResources().getString(R.string.zen_mode_rule_not_found_text);
+        final String expected = mContext.getResources().getString(
+                R.string.zen_mode_rule_not_found_text);
 
         mFragment.onCreate(null);
 
@@ -93,7 +100,7 @@
         // verify the finish
         verify(mActivity).finish();
 
-        //shoud not crash
+        //should not crash
     }
 
     public static class TestFragment extends ZenModeScheduleRuleSettings {
