diff --git a/src/com/android/settings/FingerprintEnroll.java b/src/com/android/settings/FingerprintEnroll.java
index 61bebdf..e56ce08 100644
--- a/src/com/android/settings/FingerprintEnroll.java
+++ b/src/com/android/settings/FingerprintEnroll.java
@@ -254,8 +254,7 @@
 
                 case EnrollingStart:
                     mEnrollmentSteps = -1;
-                    // TODO: pass in mToken
-                    mFingerprintManager.enroll(0, mEnrollmentCancel, mEnrollmentCallback, 0);
+                    mFingerprintManager.enroll(mToken, mEnrollmentCancel, mEnrollmentCallback, 0);
                     mProgressBar.setProgress(0);
                     mEnrolling = true;
                     startFingerprintAnimator(); // XXX hack - this should follow fingerprint detection
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeFormatConfirm.java b/src/com/android/settings/deviceinfo/PrivateVolumeFormatConfirm.java
index 1203cf3..666a918 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeFormatConfirm.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeFormatConfirm.java
@@ -48,7 +48,7 @@
         final StorageManager storage = getActivity().getSystemService(StorageManager.class);
         final String volumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID);
         mVolume = storage.findVolumeById(volumeId);
-        mDisk = storage.findDiskById(mVolume.diskId);
+        mDisk = storage.findDiskById(mVolume.getDiskId());
 
         final View view = inflater.inflate(R.layout.storage_internal_format, container, false);
         final TextView body = (TextView) view.findViewById(R.id.body);
@@ -65,7 +65,7 @@
         @Override
         public void onClick(View v) {
             final Intent intent = new Intent(getActivity(), StorageWizardFormatProgress.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             intent.putExtra(StorageWizardFormatProgress.EXTRA_FORMAT_PUBLIC, true);
             startActivity(intent);
             getActivity().finish();
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index 5674f43..dec259b 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -121,13 +121,13 @@
         mVolume = mStorageManager.findVolumeById(mVolumeId);
 
         Preconditions.checkNotNull(mVolume);
-        Preconditions.checkState(mVolume.type == VolumeInfo.TYPE_PRIVATE);
+        Preconditions.checkState(mVolume.getType() == VolumeInfo.TYPE_PRIVATE);
 
         addPreferencesFromResource(R.xml.device_info_storage_volume);
 
         // Find the emulated shared storage layered above this private volume
         mSharedVolume = mStorageManager.findVolumeById(
-                mVolume.id.replace("private", "emulated"));
+                mVolume.getId().replace("private", "emulated"));
 
         mMeasure = new StorageMeasurement(context, mVolume, mSharedVolume);
         mMeasure.setReceiver(mReceiver);
@@ -168,7 +168,7 @@
 
         screen.removeAll();
 
-        if (mVolume.state != VolumeInfo.STATE_MOUNTED) {
+        if (mVolume.getState() != VolumeInfo.STATE_MOUNTED) {
             return;
         }
 
@@ -202,7 +202,7 @@
             }
         }
 
-        final File file = new File(mVolume.path);
+        final File file = mVolume.getPath();
         mTotalSize = file.getTotalSpace();
         mAvailSize = file.getFreeSpace();
 
@@ -272,15 +272,15 @@
 
         // Actions live in menu for non-internal private volumes; they're shown
         // as preference items for public volumes.
-        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(mVolume.id)) {
+        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(mVolume.getId())) {
             rename.setVisible(false);
             mount.setVisible(false);
             unmount.setVisible(false);
             format.setVisible(false);
         } else {
-            rename.setVisible(mVolume.type == VolumeInfo.TYPE_PRIVATE);
-            mount.setVisible(mVolume.state == VolumeInfo.STATE_UNMOUNTED);
-            unmount.setVisible(mVolume.state == VolumeInfo.STATE_MOUNTED);
+            rename.setVisible(mVolume.getType() == VolumeInfo.TYPE_PRIVATE);
+            mount.setVisible(mVolume.getState() == VolumeInfo.STATE_UNMOUNTED);
+            unmount.setVisible(mVolume.getState() == VolumeInfo.STATE_MOUNTED);
             format.setVisible(true);
         }
 
@@ -300,12 +300,12 @@
                 new MountTask(context, mVolume).execute();
                 return true;
             case R.id.storage_unmount:
-                args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.id);
+                args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
                 startFragment(this, PrivateVolumeUnmountConfirm.class.getCanonicalName(),
                         R.string.storage_menu_unmount, 0, args);
                 return true;
             case R.id.storage_format:
-                args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.id);
+                args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
                 startFragment(this, PrivateVolumeFormatConfirm.class.getCanonicalName(),
                         R.string.storage_menu_format, 0, args);
                 return true;
@@ -428,7 +428,15 @@
     private final StorageEventListener mStorageListener = new StorageEventListener() {
         @Override
         public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
-            if (Objects.equals(mVolume.id, vol.id)) {
+            if (Objects.equals(mVolume.getId(), vol.getId())) {
+                mVolume = vol;
+                refresh();
+            }
+        }
+
+        @Override
+        public void onVolumeMetadataChanged(VolumeInfo vol) {
+            if (Objects.equals(mVolume.getId(), vol.getId())) {
                 mVolume = vol;
                 refresh();
             }
@@ -462,8 +470,8 @@
             final View view = dialogInflater.inflate(R.layout.dialog_edittext, null, false);
             final EditText nickname = (EditText) view.findViewById(R.id.edittext);
 
-            if (!TextUtils.isEmpty(vol.nickname)) {
-                nickname.setText(vol.nickname);
+            if (!TextUtils.isEmpty(vol.getNickname())) {
+                nickname.setText(vol.getNickname());
             } else {
                 nickname.setText(storageManager.getBestVolumeDescription(vol));
             }
@@ -475,7 +483,8 @@
                     new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int which) {
-                            // TODO: persist the edited nickname!
+                            // TODO: move to background thread
+                            storageManager.setVolumeNickname(volId, nickname.getText().toString());
                         }
                     });
             builder.setNegativeButton(R.string.cancel, null);
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeUnmountConfirm.java b/src/com/android/settings/deviceinfo/PrivateVolumeUnmountConfirm.java
index c592e9d..614b737 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeUnmountConfirm.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeUnmountConfirm.java
@@ -48,7 +48,7 @@
         final StorageManager storage = getActivity().getSystemService(StorageManager.class);
         final String volumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID);
         mVolume = storage.findVolumeById(volumeId);
-        mDisk = storage.findDiskById(mVolume.id);
+        mDisk = storage.findDiskById(mVolume.getDiskId());
 
         final View view = inflater.inflate(R.layout.storage_internal_unmount, container, false);
         final TextView body = (TextView) view.findViewById(R.id.body);
diff --git a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
index 75e040f..94a505b 100644
--- a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
@@ -91,12 +91,12 @@
         }
 
         Preconditions.checkNotNull(mVolume);
-        Preconditions.checkState(mVolume.type == VolumeInfo.TYPE_PUBLIC);
+        Preconditions.checkState(mVolume.getType() == VolumeInfo.TYPE_PUBLIC);
 
-        mDisk = mStorageManager.findDiskById(mVolume.diskId);
+        mDisk = mStorageManager.findDiskById(mVolume.getDiskId());
         Preconditions.checkNotNull(mDisk);
 
-        mVolumeId = mVolume.id;
+        mVolumeId = mVolume.getId();
 
         addPreferencesFromResource(R.xml.device_info_storage_volume);
 
@@ -118,34 +118,34 @@
 
         screen.removeAll();
 
-        if (mVolume.state == VolumeInfo.STATE_MOUNTED) {
+        if (mVolume.getState() == VolumeInfo.STATE_MOUNTED) {
             screen.addPreference(mGraph);
             screen.addPreference(mTotal);
             screen.addPreference(mAvailable);
+
+            final File file = mVolume.getPath();
+            mTotalSize = file.getTotalSpace();
+            mAvailSize = file.getFreeSpace();
+
+            mTotal.setSummary(Formatter.formatFileSize(context, mTotalSize));
+            mAvailable.setSummary(Formatter.formatFileSize(context, mAvailSize));
+
+            mGraph.clear();
+            mGraph.addEntry(0, (mTotalSize - mAvailSize) / (float) mTotalSize,
+                    android.graphics.Color.GRAY);
+            mGraph.commit();
         }
 
-        if (mVolume.state == VolumeInfo.STATE_UNMOUNTED) {
+        if (mVolume.getState() == VolumeInfo.STATE_UNMOUNTED) {
             screen.addPreference(mMount);
         }
-        if (mVolume.state == VolumeInfo.STATE_MOUNTED) {
+        if (mVolume.getState() == VolumeInfo.STATE_MOUNTED) {
             screen.addPreference(mUnmount);
         }
         screen.addPreference(mFormat);
-        if ((mDisk.flags & DiskInfo.FLAG_ADOPTABLE) != 0) {
+        if (mDisk.isAdoptable()) {
             screen.addPreference(mFormatInternal);
         }
-
-        final File file = new File(mVolume.path);
-        mTotalSize = file.getTotalSpace();
-        mAvailSize = file.getFreeSpace();
-
-        mTotal.setSummary(Formatter.formatFileSize(context, mTotalSize));
-        mAvailable.setSummary(Formatter.formatFileSize(context, mAvailSize));
-
-        mGraph.clear();
-        mGraph.addEntry(0, (mTotalSize - mAvailSize) / (float) mTotalSize,
-                android.graphics.Color.GRAY);
-        mGraph.commit();
     }
 
     private UsageBarPreference buildGraph() {
@@ -200,7 +200,7 @@
             new FormatTask(context, mVolume).execute();
         } else if (pref == mFormatInternal) {
             final Intent intent = new Intent(context, StorageWizardFormatConfirm.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             startActivity(intent);
         }
 
@@ -210,7 +210,15 @@
     private final StorageEventListener mStorageListener = new StorageEventListener() {
         @Override
         public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
-            if (Objects.equals(mVolume.id, vol.id)) {
+            if (Objects.equals(mVolume.getId(), vol.getId())) {
+                mVolume = vol;
+                refresh();
+            }
+        }
+
+        @Override
+        public void onVolumeMetadataChanged(VolumeInfo vol) {
+            if (Objects.equals(mVolume.getId(), vol.getId())) {
                 mVolume = vol;
                 refresh();
             }
diff --git a/src/com/android/settings/deviceinfo/StorageMeasurement.java b/src/com/android/settings/deviceinfo/StorageMeasurement.java
index db91fdb..a3c4aec 100644
--- a/src/com/android/settings/deviceinfo/StorageMeasurement.java
+++ b/src/com/android/settings/deviceinfo/StorageMeasurement.java
@@ -345,7 +345,7 @@
         final Message finished = mMeasurementHandler.obtainMessage(MeasurementHandler.MSG_COMPLETED,
                 details);
 
-        if (mSharedVolume != null && mSharedVolume.state == VolumeInfo.STATE_MOUNTED) {
+        if (mSharedVolume != null && mSharedVolume.getState() == VolumeInfo.STATE_MOUNTED) {
             final File basePath = mSharedVolume.getPathForUser(currentUser);
 
             // Measure media types for emulated storage, or for primary physical
@@ -359,7 +359,7 @@
             // Measure misc files not counted under media
             details.miscSize = measureMisc(imcs, basePath);
 
-            if (mSharedVolume.type == VolumeInfo.TYPE_EMULATED) {
+            if (mSharedVolume.getType() == VolumeInfo.TYPE_EMULATED) {
                 // Measure total emulated storage of all users; internal apps data
                 // will be spliced in later
                 for (UserInfo user : users) {
@@ -371,14 +371,14 @@
         }
 
         // Measure all apps hosted on this volume for all users
-        if (mVolume.type == VolumeInfo.TYPE_PRIVATE) {
+        if (mVolume.getType() == VolumeInfo.TYPE_PRIVATE) {
             final List<ApplicationInfo> apps = packageManager.getInstalledApplications(
                     PackageManager.GET_UNINSTALLED_PACKAGES
                     | PackageManager.GET_DISABLED_COMPONENTS);
 
             final List<ApplicationInfo> volumeApps = new ArrayList<>();
             for (ApplicationInfo app : apps) {
-                if (Objects.equals(app.volumeUuid, mVolume.fsUuid)) {
+                if (Objects.equals(app.volumeUuid, mVolume.getFsUuid())) {
                     volumeApps.add(app);
                 }
             }
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 255788d..1e33230d 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -94,10 +94,12 @@
     private static final Comparator<VolumeInfo> sVolumeComparator = new Comparator<VolumeInfo>() {
         @Override
         public int compare(VolumeInfo lhs, VolumeInfo rhs) {
-            if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(lhs.id)) {
+            if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(lhs.getId())) {
                 return -1;
             } else if (lhs.getDescription() == null) {
                 return 1;
+            } else if (rhs.getDescription() == null) {
+                return -1;
             } else {
                 return lhs.getDescription().compareTo(rhs.getDescription());
             }
@@ -114,7 +116,13 @@
     };
 
     private static boolean isInteresting(VolumeInfo vol) {
-        return vol.type == VolumeInfo.TYPE_PRIVATE || vol.type == VolumeInfo.TYPE_PUBLIC;
+        switch(vol.getType()) {
+            case VolumeInfo.TYPE_PRIVATE:
+            case VolumeInfo.TYPE_PUBLIC:
+                return true;
+            default:
+                return false;
+        }
     }
 
     private void refresh() {
@@ -128,9 +136,9 @@
         Collections.sort(volumes, sVolumeComparator);
 
         for (VolumeInfo vol : volumes) {
-            if (vol.type == VolumeInfo.TYPE_PRIVATE) {
+            if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
                 mInternalCategory.addPreference(new StorageVolumePreference(context, vol));
-            } else if (vol.type == VolumeInfo.TYPE_PUBLIC) {
+            } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) {
                 mExternalCategory.addPreference(new StorageVolumePreference(context, vol));
             }
         }
@@ -186,15 +194,15 @@
         if (vol == null) {
             return false;
 
-        } else if (vol.type == VolumeInfo.TYPE_PRIVATE) {
+        } else if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
             final Bundle args = new Bundle();
             args.putString(VolumeInfo.EXTRA_VOLUME_ID, volId);
             startFragment(this, PrivateVolumeSettings.class.getCanonicalName(),
                     -1, 0, args);
             return true;
 
-        } else if (vol.type == VolumeInfo.TYPE_PUBLIC) {
-            if (vol.state == VolumeInfo.STATE_MOUNTED) {
+        } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) {
+            if (vol.getState() == VolumeInfo.STATE_MOUNTED) {
                 startActivity(vol.buildBrowseIntent());
                 return true;
             } else {
@@ -218,7 +226,7 @@
         public MountTask(Context context, VolumeInfo volume) {
             mContext = context.getApplicationContext();
             mStorageManager = mContext.getSystemService(StorageManager.class);
-            mVolumeId = volume.id;
+            mVolumeId = volume.getId();
             mDescription = mStorageManager.getBestVolumeDescription(volume);
         }
 
@@ -254,7 +262,7 @@
         public UnmountTask(Context context, VolumeInfo volume) {
             mContext = context.getApplicationContext();
             mStorageManager = mContext.getSystemService(StorageManager.class);
-            mVolumeId = volume.id;
+            mVolumeId = volume.getId();
             mDescription = mStorageManager.getBestVolumeDescription(volume);
         }
 
@@ -290,7 +298,7 @@
         public FormatTask(Context context, VolumeInfo volume) {
             mContext = context.getApplicationContext();
             mStorageManager = mContext.getSystemService(StorageManager.class);
-            mVolumeId = volume.id;
+            mVolumeId = volume.getId();
             mDescription = mStorageManager.getBestVolumeDescription(volume);
         }
 
diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreference.java b/src/com/android/settings/deviceinfo/StorageVolumePreference.java
index a2136bd..f127dfb 100644
--- a/src/com/android/settings/deviceinfo/StorageVolumePreference.java
+++ b/src/com/android/settings/deviceinfo/StorageVolumePreference.java
@@ -44,13 +44,13 @@
         mStorageManager = context.getSystemService(StorageManager.class);
         mVolume = volume;
 
-        setKey(volume.id);
+        setKey(volume.getId());
         setTitle(mStorageManager.getBestVolumeDescription(volume));
 
-        switch (volume.state) {
+        switch (volume.getState()) {
             case VolumeInfo.STATE_MOUNTED:
                 // TODO: move statfs() to background thread
-                final File path = new File(volume.path);
+                final File path = volume.getPath();
                 final String free = Formatter.formatFileSize(context, path.getFreeSpace());
                 final String total = Formatter.formatFileSize(context, path.getTotalSpace());
                 setSummary(context.getString(R.string.storage_volume_summary, free, total));
@@ -58,13 +58,14 @@
         }
 
         // TODO: better icons
-        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(volume.id)) {
+        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(volume.getId())) {
             setIcon(context.getDrawable(R.drawable.ic_settings_storage));
         } else {
             setIcon(context.getDrawable(R.drawable.ic_sim_sd));
         }
 
-        if (volume.type == VolumeInfo.TYPE_PUBLIC && volume.state == VolumeInfo.STATE_MOUNTED) {
+        if (volume.getType() == VolumeInfo.TYPE_PUBLIC
+                && volume.getState() == VolumeInfo.STATE_MOUNTED) {
             setWidgetLayoutResource(R.layout.preference_storage_action);
         }
     }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardBase.java b/src/com/android/settings/deviceinfo/StorageWizardBase.java
index ceacff9..4cb48c5 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardBase.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardBase.java
@@ -57,7 +57,7 @@
         if (!TextUtils.isEmpty(diskId)) {
             mDisk = mStorage.findDiskById(diskId);
         } else {
-            mDisk = mStorage.findDiskById(mVolume.diskId);
+            mDisk = mStorage.findDiskById(mVolume.getDiskId());
         }
 
         setTheme(R.style.SuwThemeMaterial_Light);
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
index b4c8426..f4f475f 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
@@ -42,7 +42,7 @@
     @Override
     public void onNavigateNext() {
         final Intent intent = new Intent(this, StorageWizardFormatProgress.class);
-        intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+        intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
         startActivity(intent);
         finishAffinity();
     }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
index 7dd347f..2996d45 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
@@ -59,9 +59,9 @@
         protected Exception doInBackground(Void... params) {
             try {
                 if (mFormatPublic) {
-                    mStorage.partitionPublic(mDisk.id);
+                    mStorage.partitionPublic(mDisk.getId());
                 } else {
-                    mStorage.partitionPrivate(mDisk.id);
+                    mStorage.partitionPrivate(mDisk.getId());
                 }
                 return null;
             } catch (Exception e) {
@@ -74,8 +74,12 @@
             final Context context = StorageWizardFormatProgress.this;
             if (e == null) {
                 if (!mFormatPublic) {
-                    final Intent intent = new Intent(context, StorageWizardMigrate.class);
-                    intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+                    // TODO: bring back migration once implemented
+//                    final Intent intent = new Intent(context, StorageWizardMigrate.class);
+//                    intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
+//                    startActivity(intent);
+                    final Intent intent = new Intent(context, StorageWizardReady.class);
+                    intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
                     startActivity(intent);
                 }
                 finishAffinity();
diff --git a/src/com/android/settings/deviceinfo/StorageWizardInit.java b/src/com/android/settings/deviceinfo/StorageWizardInit.java
index b4d1a51..9d59231 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardInit.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardInit.java
@@ -72,12 +72,15 @@
     @Override
     public void onNavigateNext() {
         if (mRadioExternal.isChecked()) {
+            // Remember that user made decision
+            mStorage.setVolumeInited(mVolume.getId(), true);
+
             final Intent intent = new Intent(this, StorageWizardReady.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             startActivity(intent);
         } else if (mRadioInternal.isChecked()) {
             final Intent intent = new Intent(this, StorageWizardFormatConfirm.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             startActivity(intent);
         }
     }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrate.java b/src/com/android/settings/deviceinfo/StorageWizardMigrate.java
index 82e32ba..4d42613 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrate.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrate.java
@@ -71,11 +71,11 @@
     public void onNavigateNext() {
         if (mRadioNow.isChecked()) {
             final Intent intent = new Intent(this, StorageWizardMigrateConfirm.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             startActivity(intent);
         } else if (mRadioLater.isChecked()) {
             final Intent intent = new Intent(this, StorageWizardReady.class);
-            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+            intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
             startActivity(intent);
         }
     }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
index 6972031..9aa1441 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
@@ -46,7 +46,7 @@
     @Override
     public void onNavigateNext() {
         final Intent intent = new Intent(this, StorageWizardMigrateProgress.class);
-        intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+        intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
         startActivity(intent);
         finishAffinity();
     }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
index 9bf31f9..b53b250 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
@@ -62,7 +62,7 @@
             final Context context = StorageWizardMigrateProgress.this;
             if (e == null) {
                 final Intent intent = new Intent(context, StorageWizardReady.class);
-                intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.id);
+                intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
                 startActivity(intent);
                 finishAffinity();
 
diff --git a/src/com/android/settings/deviceinfo/StorageWizardReady.java b/src/com/android/settings/deviceinfo/StorageWizardReady.java
index 76324a9..26038ce 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardReady.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardReady.java
@@ -22,6 +22,9 @@
 import com.android.internal.util.Preconditions;
 import com.android.settings.R;
 
+import java.util.List;
+import java.util.Objects;
+
 public class StorageWizardReady extends StorageWizardBase {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -34,15 +37,15 @@
 
         // TODO: handle mixed partition cases instead of just guessing based on
         // first volume type we encounter
-        for (String volId : mDisk.volumeIds) {
-            final VolumeInfo vol = mStorage.findVolumeById(volId);
-            if (vol == null) continue;
+        final List<VolumeInfo> vols = mStorage.getVolumes();
+        for (VolumeInfo vol : vols) {
+            if (!Objects.equals(mDisk.getId(), vol.getDiskId())) continue;
 
-            if (vol.type == VolumeInfo.TYPE_PUBLIC) {
+            if (vol.getType() == VolumeInfo.TYPE_PUBLIC) {
                 setBodyText(R.string.storage_wizard_ready_external_body,
                         mDisk.getDescription());
                 break;
-            } else if (vol.type == VolumeInfo.TYPE_PRIVATE) {
+            } else if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
                 setBodyText(R.string.storage_wizard_ready_internal_body,
                         mDisk.getDescription());
                 break;
