diff --git a/res/values/strings.xml b/res/values/strings.xml
index bc3679c..ab7f180 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8339,8 +8339,9 @@
     <string name="storage_size_large_alternate"><xliff:g id="number" example="128">^1</xliff:g><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></string>
     <!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
     <string name="storage_volume_total">Used of <xliff:g id="total" example="32GB">%1$s</xliff:g></string>
-    <!-- The percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=4]-->
-    <string name="storage_percent_used"><xliff:g id="percent" example="50%">%1$s</xliff:g>%%</string>
+    <!-- Follows the percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=7]-->
+    <string name="storage_percent_full">full</string>
+
 
     <!-- Title of games app storage screen [CHAR LIMIT=30] -->
     <string name="game_storage_settings">Games</string>
diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java
index ba7939d..0feaa07 100644
--- a/src/com/android/settings/widget/DonutView.java
+++ b/src/com/android/settings/widget/DonutView.java
@@ -22,20 +22,25 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.android.internal.util.Preconditions;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
 /**
  * DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
- * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut.
+ * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut).
  */
 public class DonutView extends View {
     private static final int TOP = -90;
     private float mStrokeWidth;
+    private float mDeviceDensity;
     private int mPercent;
     private Paint mBackgroundCircle;
     private Paint mFilledArc;
     private TextPaint mTextPaint;
+    private TextPaint mBigNumberPaint;
+    private String mPercentString;
+    private String mFullString;
 
     public DonutView(Context context) {
         super(context);
@@ -43,8 +48,8 @@
 
     public DonutView(Context context, AttributeSet attrs) {
         super(context, attrs);
-        float density = getResources().getDisplayMetrics().density;
-        mStrokeWidth = 6f * density;
+        mDeviceDensity = getResources().getDisplayMetrics().density;
+        mStrokeWidth = 6f * mDeviceDensity;
 
         mBackgroundCircle = new Paint();
         mBackgroundCircle.setAntiAlias(true);
@@ -63,28 +68,43 @@
         mTextPaint = new TextPaint();
         mTextPaint.setColor(Utils.getColorAccent(getContext()));
         mTextPaint.setAntiAlias(true);
-        mTextPaint.setTextSize(18f * density);
+        mTextPaint.setTextSize(14f * mDeviceDensity);
         mTextPaint.setTextAlign(Paint.Align.CENTER);
+
+        mBigNumberPaint = new TextPaint();
+        mBigNumberPaint.setColor(Utils.getColorAccent(getContext()));
+        mBigNumberPaint.setAntiAlias(true);
+        mBigNumberPaint.setTextSize(30f * mDeviceDensity);
+        mBigNumberPaint.setTextAlign(Paint.Align.CENTER);
     }
 
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
+        drawDonut(canvas);
+        drawInnerText(canvas);
+    }
+
+    private void drawDonut(Canvas canvas) {
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, 360, false, mBackgroundCircle);
 
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, (360 * mPercent / 100), false, mFilledArc);
+    }
 
-        int centerX = getWidth() / 2;
-        int centerY = getHeight() / 2;
+    private void drawInnerText(Canvas canvas) {
+        final float centerX = getWidth() / 2;
+        final float centerY = getHeight() / 2;
+        final float totalHeight = getTextHeight(mTextPaint) + getTextHeight(mBigNumberPaint);
+        final float startY = centerY + totalHeight / 2;
 
-        String percentString =
-                String.format(getContext().getString(R.string.storage_percent_used), mPercent);
-        // drawText uses the Y dimension as the floor of the text, so we do this to center.
-        canvas.drawText(percentString, centerX,
-                centerY + getTextHeight(mTextPaint) / 2 - mTextPaint.descent(),
-                mTextPaint);
+        // The first line is the height of the bottom text + its descender above the bottom line.
+        canvas.drawText(mPercentString, centerX,
+                startY - getTextHeight(mTextPaint) - mBigNumberPaint.descent(),
+                mBigNumberPaint);
+        // The second line starts at the bottom + room for the descender.
+        canvas.drawText(mFullString, centerX, startY - mTextPaint.descent(), mTextPaint);
     }
 
     /**
@@ -92,6 +112,8 @@
      */
     public void setPercentage(int percent) {
         mPercent = percent;
+        mPercentString = Utils.formatPercentage(mPercent);
+        mFullString = getContext().getString(R.string.storage_percent_full);
         invalidate();
     }
 
