diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index d0d575c..ede4156 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -247,8 +247,10 @@
         // show only integer values for exposure compensation
         int maxValue = Math.min(3, (int) FloatMath.floor(max * step));
         int minValue = Math.max(-3, (int) FloatMath.ceil(min * step));
+        String explabel = mContext.getResources().getString(R.string.pref_exposure_label);
         CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
         CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
+        CharSequence labels[] = new CharSequence[maxValue - minValue + 1];
         int[] icons = new int[maxValue - minValue + 1];
         TypedArray iconIds = mContext.getResources().obtainTypedArray(
                 R.array.pref_camera_exposure_icons);
@@ -257,10 +259,12 @@
             StringBuilder builder = new StringBuilder();
             if (i > 0) builder.append('+');
             entries[maxValue - i] = builder.append(i).toString();
+            labels[maxValue - i] = explabel + " " + builder.toString();
             icons[maxValue - i] = iconIds.getResourceId(3 + i, 0);
         }
         exposure.setUseSingleIcon(true);
         exposure.setEntries(entries);
+        exposure.setLabels(labels);
         exposure.setEntryValues(entryValues);
         exposure.setLargeIconIds(icons);
     }
diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java
index a29b197..9ea2e34 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -40,6 +40,7 @@
 
     private CharSequence[] mEntries;
     private CharSequence[] mEntryValues;
+    private CharSequence[] mLabels;
     private boolean mLoaded = false;
 
     public ListPreference(Context context, AttributeSet attrs) {
@@ -68,6 +69,8 @@
         setEntries(a.getTextArray(R.styleable.ListPreference_entries));
         setEntryValues(a.getTextArray(
                 R.styleable.ListPreference_entryValues));
+        setLabels(a.getTextArray(
+                R.styleable.ListPreference_labels));
         a.recycle();
     }
 
@@ -83,6 +86,10 @@
         return mEntryValues;
     }
 
+    public CharSequence[] getLabels() {
+        return mLabels;
+    }
+
     public void setEntries(CharSequence entries[]) {
         mEntries = entries == null ? new CharSequence[0] : entries;
     }
@@ -91,6 +98,10 @@
         mEntryValues = values == null ? new CharSequence[0] : values;
     }
 
+    public void setLabels(CharSequence labels[]) {
+        mLabels = labels == null ? new CharSequence[0] : labels;
+    }
+
     public String getValue() {
         if (!mLoaded) {
             mValue = getSharedPreferences().getString(mKey,
@@ -135,6 +146,10 @@
         return mEntries[findIndexOfValue(getValue())].toString();
     }
 
+    public String getLabel() {
+        return mLabels[findIndexOfValue(getValue())].toString();
+    }
+
     protected void persistStringValue(String value) {
         SharedPreferences.Editor editor = getSharedPreferences().edit();
         editor.putString(mKey, value);
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index f5ba733..09c96b2 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -17,6 +17,7 @@
 package com.android.camera;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.hardware.Camera.Parameters;
 import android.view.LayoutInflater;
 
@@ -65,20 +66,26 @@
         mPopup = null;
         mSecondPopup = null;
         PieItem item = null;
+        final Resources res = mActivity.getResources();
         // flash
         if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) {
             item = makeItem(CameraSettings.KEY_FLASH_MODE, POS_FLASH, 5);
+            item.setLabel(res.getString(R.string.pref_camera_flashmode_label));
             mRenderer.addItem(item);
         }
         // exposure compensation
         if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) {
             item = makeItem(CameraSettings.KEY_EXPOSURE, POS_EXP, 5);
+            item.setLabel(res.getString(R.string.pref_exposure_label));
             mRenderer.addItem(item);
         }
         // camera switcher
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeItem(R.drawable.ic_switch_photo_facing_holo_light);
+            ListPreference lpref = group.findPreference(CameraSettings.KEY_CAMERA_ID);
             item.setPosition(POS_SWITCH, 5);
+            item.setLabel(lpref.getLabel());
+            final PieItem fitem = item;
             item.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(PieItem item) {
@@ -91,6 +98,7 @@
                         index = (index + 1) % values.length;
                         int newCameraId = Integer
                                 .parseInt((String) values[index]);
+                        fitem.setLabel(camPref.getLabel());
                         mListener.onCameraPickerClicked(newCameraId);
                     }
                 }
@@ -99,8 +107,11 @@
         }
         // hdr
         if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
+            ListPreference lp = group.findPreference(CameraSettings.KEY_CAMERA_HDR);
             item = makeItem(R.drawable.ic_hdr);
+            item.setLabel(lp.getLabel());
             item.setPosition(POS_HDR, 5);
+            final PieItem fitem = item;
             item.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(PieItem item) {
@@ -112,6 +123,7 @@
                         int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2;
                         pref.setValueIndex(index);
                         onSettingChanged(pref);
+                        fitem.setLabel(pref.getLabel());
                     }
                 }
             });
@@ -121,10 +133,12 @@
         // more settings
         PieItem more = makeItem(R.drawable.ic_settings_holo_light);
         more.setPosition(POS_MORE, 5);
+        more.setLabel(res.getString(R.string.camera_menu_more_label));
         mRenderer.addItem(more);
         // white balance
         if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
             item = makeItem(CameraSettings.KEY_WHITE_BALANCE, POS_WB, 5);
+            item.setLabel(res.getString(R.string.pref_camera_whitebalance_label));
             more.addItem(item);
         }
         // settings popup
@@ -137,6 +151,7 @@
                 CameraSettings.KEY_TIMER_SOUND_EFFECTS,
                 };
         item = makeItem(R.drawable.ic_settings_holo_light);
+        item.setLabel(res.getString(R.string.camera_menu_settings_label));
         item.setPosition(POS_SET, 5);
         item.setOnClickListener(new OnClickListener() {
             @Override
diff --git a/src/com/android/camera/PieController.java b/src/com/android/camera/PieController.java
index a9b8575..5ccab5e 100644
--- a/src/com/android/camera/PieController.java
+++ b/src/com/android/camera/PieController.java
@@ -104,6 +104,7 @@
         }
         PieItem item = makeItem(resid);
         item.setPosition(position, count);
+        item.setLabel(pref.getTitle().toUpperCase());
         mPreferences.add(pref);
         mPreferenceMap.put(pref, item);
         int nOfEntries = pref.getEntries().length;
@@ -116,6 +117,7 @@
                     inner = makeItem(pref.getEntries()[i]);
                 }
                 inner.setPosition(i, nOfEntries);
+                inner.setLabel(pref.getLabels()[i]);
                 item.addItem(inner);
                 final int index = i;
                 inner.setOnClickListener(new OnClickListener() {
diff --git a/src/com/android/camera/drawable/TextDrawable.java b/src/com/android/camera/drawable/TextDrawable.java
index 2e86364..ac5f1ce 100644
--- a/src/com/android/camera/drawable/TextDrawable.java
+++ b/src/com/android/camera/drawable/TextDrawable.java
@@ -37,6 +37,10 @@
     private int mIntrinsicWidth;
     private int mIntrinsicHeight;
 
+    public TextDrawable(Resources res) {
+        this(res, "");
+    }
+
     public TextDrawable(Resources res, CharSequence text) {
         mText = text;
         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -49,11 +53,24 @@
         mIntrinsicHeight = mPaint.getFontMetricsInt(null);
     }
 
+    public void setText(CharSequence txt) {
+        mText = txt;
+        if (txt == null) {
+            mIntrinsicWidth = 0;
+            mIntrinsicHeight = 0;
+        } else {
+            mIntrinsicWidth = (int) (mPaint.measureText(mText, 0, mText.length()) + .5);
+            mIntrinsicHeight = mPaint.getFontMetricsInt(null);
+        }
+    }
+
     @Override
     public void draw(Canvas canvas) {
-        Rect bounds = getBounds();
-        canvas.drawText(mText, 0, mText.length(),
-                bounds.centerX(), bounds.centerY(), mPaint);
+        if (mText != null) {
+            Rect bounds = getBounds();
+            canvas.drawText(mText, 0, mText.length(),
+                    bounds.centerX(), bounds.centerY(), mPaint);
+        }
     }
 
     @Override
diff --git a/src/com/android/camera/ui/PieItem.java b/src/com/android/camera/ui/PieItem.java
index 6128e04..6dbcb85 100644
--- a/src/com/android/camera/ui/PieItem.java
+++ b/src/com/android/camera/ui/PieItem.java
@@ -44,6 +44,7 @@
     private Path mPath;
     private OnClickListener mOnClickListener;
     private float mAlpha;
+    private CharSequence mLabel;
 
     // Gray out the view when disabled
     private static final float ENABLED_ALPHA = 1;
@@ -59,6 +60,14 @@
         mEnabled = true;
     }
 
+    public void setLabel(CharSequence txt) {
+        mLabel = txt;
+    }
+
+    public CharSequence getLabel() {
+        return mLabel;
+    }
+
     public void setPosition(int pos, int count) {
         mPosition = pos;
         mCount = count;
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 0969e4e..4374fa6 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -27,7 +27,6 @@
 import android.graphics.RectF;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.ViewConfiguration;
 import android.view.animation.Animation;
@@ -35,6 +34,7 @@
 import android.view.animation.LinearInterpolator;
 import android.view.animation.Transformation;
 
+import com.android.camera.drawable.TextDrawable;
 import com.android.gallery3d.R;
 
 import java.util.ArrayList;
@@ -133,6 +133,7 @@
     private FadeOutAnimation mFadeOut;
     private volatile boolean mFocusCancelled;
     private PointF mPolar = new PointF();
+    private TextDrawable mLabel;
 
 
 
@@ -213,6 +214,7 @@
         mSliceRadius = res.getDimensionPixelSize(R.dimen.pie_item_radius);
         mArcRadius = res.getDimensionPixelSize(R.dimen.pie_arc_radius);
         mArcOffset = res.getDimensionPixelSize(R.dimen.pie_arc_offset);
+        mLabel = new TextDrawable(res);
     }
 
     private PieItem getRoot() {
@@ -269,6 +271,7 @@
                     }
                 }
             }
+            mLabel.setText("");
             mOpen.clear();
             mOpen.add(root);
             layoutPie();
@@ -335,6 +338,15 @@
 
     private void layoutPie() {
         layoutItems(0, getRoot().getItems());
+        layoutLabel(0);
+    }
+
+    private void layoutLabel(int level) {
+        int x = mPieCenterX;
+        int y = mArcCenterY - mArcRadius - (level + 2) * mRadiusInc;
+        int w = mLabel.getIntrinsicWidth();
+        int h = mLabel.getIntrinsicHeight();
+        mLabel.setBounds(x - w/2, y - h/2, x + w/2, y + h/2);
     }
 
     private void layoutItems(int level, List<PieItem> items) {
@@ -480,6 +492,7 @@
             for (PieItem item : getParent().getItems()) {
                 drawItem(Math.max(0, mOpen.size() - 2), canvas, item, alpha);
             }
+            mLabel.draw(canvas);
         }
         if (hasOpenItem()) {
             int level = getLevel();
@@ -491,6 +504,7 @@
                     drawItem(level, canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
                 }
             }
+            mLabel.draw(canvas);
         }
         canvas.restoreToCount(state);
     }
@@ -606,6 +620,7 @@
                 } else {
                     deselect();
                 }
+                mLabel.setText("");
                 return false;
             }
             PieItem item = findItem(mPolar);
@@ -665,6 +680,8 @@
         if (item != null && item.isEnabled()) {
             item.setSelected(true);
             mCurrentItem = item;
+            mLabel.setText(mCurrentItem.getLabel());
+            layoutLabel(getLevel());
         } else {
             mCurrentItem = null;
         }
@@ -690,6 +707,7 @@
             mCurrentItem = item;
             if ((mCurrentItem != getOpenItem()) && mCurrentItem.hasItems()) {
                 openCurrentItem();
+                layoutLabel(getLevel());
             }
         } else {
             mCurrentItem = null;
@@ -728,6 +746,7 @@
                     mXFade = null;
                     ci.setSelected(false);
                     mOpening = false;
+                    mLabel.setText("");
                 }
 
                 @Override
