diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 64a4c9fc62765e13c4d7f6e1cc5186c7dbc98678..2087115041c27e4654845988db33840a5027f7f6 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -106,6 +106,14 @@
         <attr name="keyOutputText" format="string" />
         <!-- The label to display on the key. -->
         <attr name="keyLabel" format="string" />
+        <!-- The key label option -->
+        <attr name="keyLabelOption">
+            <!-- This should be aligned with BaseKeyboardView.KEY_LABEL_OPTION_* -->
+            <flag name="alignLeft" value="1" />
+            <flag name="alignRight" value="2" />
+            <flag name="alignBottom" value="8" />
+            <flag name="fontItalic" value="16" />
+        </attr>
         <!-- The unicode that this key generates in manual temporary upper case mode. -->
         <attr name="manualTemporaryUpperCaseCode" format="integer" />
         <!-- The icon to display on the key instead of the label. -->
@@ -132,14 +140,14 @@
     </declare-styleable>
 
     <declare-styleable name="BaseKeyboard_Case">
-        <!-- This should be matched with KeyboardSwitcher.MODE_* -->
+        <!-- This should be aligned with KeyboardSwitcher.MODE_* -->
         <attr name="mode">
-            <flag name="text" value="0" />
-            <flag name="url" value="1" />
-            <flag name="email" value="2" />
-            <flag name="im" value="3" />
-            <flag name="web" value="4" />
-            <flag name="phone" value="5" />
+            <enum name="text" value="0" />
+            <enum name="url" value="1" />
+            <enum name="email" value="2" />
+            <enum name="im" value="3" />
+            <enum name="web" value="4" />
+            <enum name="phone" value="5" />
         </attr>
         <attr name="settingsKey" format="string" />
         <attr name="voiceKey" format="string" />
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index cc513ae896b9517897b153a1eef54b01df71f3bb..018a1f98381455ec3e5925e6b3aed2bc89a58ec2 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -226,6 +226,12 @@
     <string name="label_alpha_key">ABC</string>
     <!-- Label for ALT modifier key.  Must be short to fit on key! -->
     <string name="label_alt_key">ALT</string>
+    <!-- Label for Backspace modifier key.  Must be short to fit on key! -->
+    <string name="label_backspace_key">Backspace</string>
+    <!-- Label for Shift modifier key.  Must be short to fit on key! -->
+    <string name="label_shift_key">Shift</string>
+    <!-- Label for Return key.  Must be short to fit on key! -->
+    <string name="label_return_key">Return</string>
     <!-- Label for Shift modifier key of symbol keyboard.  Must be short to fit on key! -->
     <string name="label_more_key">More</string>
     <!-- Label for "Tab" key.  Must be short to fit on key! [CHAR LIMIT=4]-->
diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml
index 8199b019b49a70bed9061a96ba75e39f9b208cff..013f005d42a621e54fcd8778a56d0fd08de08cbd 100644
--- a/java/res/xml-xlarge/kbd_phone.xml
+++ b/java/res/xml-xlarge/kbd_phone.xml
@@ -30,6 +30,7 @@
         <Key
             latin:codes="@integer/key_tab"
             latin:keyLabel="@string/label_tab_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="12.1%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -61,8 +62,8 @@
             latin:horizontalGap="4.0%p" />
         <Key
             latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyLabel="@string/label_backspace_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="15.0%p"
             latin:isModifier="true"
             latin:isRepeatable="true"
@@ -72,6 +73,7 @@
         <Key
             latin:codes="@integer/key_symbol"
             latin:keyLabel="@string/label_more_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="12.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
@@ -104,8 +106,8 @@
             latin:horizontalGap="4.0%p" />
         <Key
             latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+            latin:keyLabel="@string/label_return_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="15.0%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml
index 2e604d374a74ca790eb553a32526314bdd62224f..618d2c3bc3ae33ecd52dd9e973b6c4724036961b 100644
--- a/java/res/xml-xlarge/kbd_phone_symbols.xml
+++ b/java/res/xml-xlarge/kbd_phone_symbols.xml
@@ -30,6 +30,7 @@
         <Key
             latin:codes="@integer/key_tab"
             latin:keyLabel="@string/label_tab_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="12.1%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -64,8 +65,8 @@
             latin:horizontalGap="4.0%p" />
         <Key
             latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyLabel="@string/label_backspace_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="15.0%p"
             latin:isModifier="true"
             latin:isRepeatable="true"
@@ -75,6 +76,7 @@
         <Key
             latin:codes="@integer/key_symbol"
             latin:keyLabel="@string/label_more_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="12.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
@@ -110,8 +112,8 @@
             latin:horizontalGap="4.0%p" />
         <Key
             latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+            latin:keyLabel="@string/label_return_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="15.0%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-xlarge/kbd_qwerty_row1.xml
index 51a792798f7fe0e476e5af5bbb4862517f05266e..75420798353501242951fa99d176e6e666fa4f6f 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row1.xml
+++ b/java/res/xml-xlarge/kbd_qwerty_row1.xml
@@ -25,7 +25,8 @@
     <Row>
         <Key
             latin:codes="@integer/key_tab"
-            latin:keyLabel="Tab"
+            latin:keyLabel="@string/label_tab_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="7.0%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-xlarge/kbd_qwerty_row2.xml
index 71aa916c7a4cd9f42faa38ffa59dc33069404e09..cf1a908674e6f8ef4ae717761d2ae2b6243e1af6 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row2.xml
+++ b/java/res/xml-xlarge/kbd_qwerty_row2.xml
@@ -25,6 +25,7 @@
         <Key
             latin:codes="@integer/key_symbol"
             latin:keyLabel="@string/label_symbol_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="9.7%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -75,8 +76,8 @@
         </switch>
         <Key
             latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+            latin:keyLabel="@string/label_return_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="8.3%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-xlarge/kbd_qwerty_row3.xml
index 24d1b1db9ebb0a0e8198e476c4dca46dcebe7d2b..cc3476cc774b3be369a50f5877877d486ffc5d2d 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row3.xml
+++ b/java/res/xml-xlarge/kbd_qwerty_row3.xml
@@ -24,9 +24,9 @@
     <Row>
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabel="@string/label_shift_key"
             latin:keyWidth="13.1%p"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:isModifier="true"
             latin:isSticky="true"
             latin:keyEdgeFlags="left" />
@@ -80,8 +80,8 @@
         </switch>
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabel="@string/label_shift_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="13.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml
index 102853320eb451547bd9e494897c1ac4515c6e75..354558e9d6576b42266bd1bea7b3a6ee3b5c2fc6 100644
--- a/java/res/xml-xlarge/kbd_symbols.xml
+++ b/java/res/xml-xlarge/kbd_symbols.xml
@@ -29,7 +29,8 @@
     <Row>
         <Key
             latin:codes="@integer/key_tab"
-            latin:keyLabel="Tab"
+            latin:keyLabel="@string/label_tab_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="7.0%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -80,6 +81,7 @@
         <Key
             latin:codes="@integer/key_symbol"
             latin:keyLabel="@string/label_alpha_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="9.7%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -119,8 +121,8 @@
             latin:popupCharacters="]}&gt;" />
         <Key
             latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+            latin:keyLabel="@string/label_return_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="8.3%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="right" />
@@ -129,7 +131,7 @@
         <Key
             latin:codes="@integer/key_shift"
             latin:keyLabel="@string/label_more_key"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="13.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
@@ -162,6 +164,7 @@
             latin:codes="@integer/key_shift"
             latin:keyLabel="@string/label_more_key"
             latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="13.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml
index d6de3a0cdf4a0a53063fc7c85bede2f4e567967f..5042b7227e594d86079573928ae4e4d93bed052a 100644
--- a/java/res/xml-xlarge/kbd_symbols_shift.xml
+++ b/java/res/xml-xlarge/kbd_symbols_shift.xml
@@ -29,7 +29,8 @@
     <Row>
         <Key
             latin:codes="@integer/key_tab"
-            latin:keyLabel="Tab"
+            latin:keyLabel="@string/label_tab_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="7.0%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -70,6 +71,7 @@
         <Key
             latin:codes="@integer/key_symbol"
             latin:keyLabel="@string/label_alpha_key"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="9.7%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="left" />
@@ -99,8 +101,8 @@
             latin:keyLabel="]" />
         <Key
             latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+            latin:keyLabel="@string/label_return_key"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="8.3%p"
             latin:isModifier="true"
             latin:keyEdgeFlags="right" />
@@ -109,7 +111,7 @@
         <Key
             latin:codes="@integer/key_shift"
             latin:keyLabel="@string/label_more_key"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabelOption="fontItalic|alignLeft|alignBottom"
             latin:keyWidth="13.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
@@ -143,7 +145,7 @@
         <Key
             latin:codes="@integer/key_shift"
             latin:keyLabel="@string/label_more_key"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyLabelOption="fontItalic|alignRight|alignBottom"
             latin:keyWidth="13.1%p"
             latin:isModifier="true"
             latin:isSticky="true"
diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java
index 9dbfff34aaf16a889db86406cc1c56060b39bd8e..cb0ac216ce69597f205d7c123202246a5aaf8f5f 100644
--- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java
@@ -183,6 +183,8 @@ public class BaseKeyboard {
 
         /** Label to display */
         public CharSequence label;
+        /** Option of the label */
+        public int labelOption;
 
         /** Icon to display instead of a label. Icon takes precedence over a label */
         public Drawable icon;
@@ -331,6 +333,7 @@ public class BaseKeyboard {
             setDefaultBounds(manualTemporaryUpperCaseHintIcon);
 
             label = a.getText(R.styleable.BaseKeyboard_Key_keyLabel);
+            labelOption = a.getInt(R.styleable.BaseKeyboard_Key_keyLabelOption, 0);
             manualTemporaryUpperCaseCode = a.getInt(
                     R.styleable.BaseKeyboard_Key_manualTemporaryUpperCaseCode, 0);
             text = a.getText(R.styleable.BaseKeyboard_Key_keyOutputText);
diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java
index 89c9572b1c8ce384215de8dc31eb53956136c024..8efd0ae9a27c7969faf885f23fa9506d6d0a3923 100644
--- a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java
@@ -249,9 +249,20 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy {
     private final Rect mClipRegion = new Rect(0, 0, 0, 0);
     // This map caches key label text height in pixel as value and key label text size as map key.
     private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>();
-    // Distance from horizontal center of the key, proportional to key label text height.
-    private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f;
-    private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H";
+    // This map caches key label text width in pixel as value and key label text size as map key.
+    private final HashMap<Integer, Integer> mTextWidthCache = new HashMap<Integer, Integer>();
+    // Distance from horizontal center of the key, proportional to key label text height and width.
+    private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.55f;
+    private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f;
+    private final float KEY_LABEL_HORIZONTAL_PADDING_FACTOR = 0.80f;
+    private final String KEY_LABEL_REFERENCE_CHAR = "H";
+    private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1;
+    private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2;
+    private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8;
+    private final int KEY_LABEL_OPTION_FONT_ITALIC = 16;
+    // TODO: Currently we don't have san-serif italic type face. This is actually san-serif
+    // non-italic type face.
+    private final Typeface TYPEFACE_ITALIC = Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC);
 
     private final UIHandler mHandler = new UIHandler();
 
@@ -808,12 +819,17 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy {
             keyBackground.draw(canvas);
 
             boolean drawHintIcon = true;
+            // Draw key label
             if (label != null) {
                 // For characters, use large font. For labels like "Done", use small font.
                 final int labelSize;
                 if (label.length() > 1 && key.codes.length < 2) {
                     labelSize = mLabelTextSize;
-                    paint.setTypeface(Typeface.DEFAULT_BOLD);
+                    if ((key.labelOption & KEY_LABEL_OPTION_FONT_ITALIC) != 0) {
+                        paint.setTypeface(TYPEFACE_ITALIC);
+                    } else {
+                        paint.setTypeface(Typeface.DEFAULT_BOLD);
+                    }
                 } else {
                     labelSize = mKeyTextSize;
                     paint.setTypeface(mKeyTextStyle);
@@ -821,26 +837,51 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy {
                 paint.setTextSize(labelSize);
 
                 Integer labelHeightValue = mTextHeightCache.get(labelSize);
-                final int labelHeight;
+                final int labelCharHeight;
+                final int labelCharWidth;
                 if (labelHeightValue != null) {
-                    labelHeight = labelHeightValue;
+                    labelCharHeight = labelHeightValue;
+                    labelCharWidth = mTextWidthCache.get(labelSize);
                 } else {
                     Rect textBounds = new Rect();
-                    paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds);
-                    labelHeight = textBounds.height();
-                    mTextHeightCache.put(labelSize, labelHeight);
+                    paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, textBounds);
+                    labelCharHeight = textBounds.height();
+                    labelCharWidth = textBounds.width();
+                    mTextHeightCache.put(labelSize, labelCharHeight);
+                    mTextWidthCache.put(labelSize, labelCharWidth);
                 }
 
-                // Draw a drop shadow for the text
+                // Vertical label text alignment.
+                final float baseline;
+                if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_BOTTOM) != 0) {
+                    baseline = key.height -
+                            + labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR;
+                } else { // Align center
+                    final float centerY = (key.height + padding.top - padding.bottom) / 2;
+                    baseline = centerY
+                            + labelCharHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER;
+                }
+                // Horizontal label text alignment
+                final int positionX;
+                if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) {
+                    positionX = (int)(
+                            labelCharWidth * KEY_LABEL_HORIZONTAL_PADDING_FACTOR + padding.left);
+                    paint.setTextAlign(Align.LEFT);
+                } else if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) {
+                    positionX = (int)(key.width
+                            - labelCharWidth * KEY_LABEL_HORIZONTAL_PADDING_FACTOR - padding.right);
+                    paint.setTextAlign(Align.RIGHT);
+                } else {
+                    positionX = (key.width + padding.left - padding.right) / 2;
+                    paint.setTextAlign(Align.CENTER);
+                }
+                // Set a drop shadow for the text
                 paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
-                final int centerX = (key.width + padding.left - padding.right) / 2;
-                final int centerY = (key.height + padding.top - padding.bottom) / 2;
-                final float baseline = centerY
-                        + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR;
-                canvas.drawText(label, centerX, baseline, paint);
+                canvas.drawText(label, positionX, baseline, paint);
                 // Turn off drop shadow
                 paint.setShadowLayer(0, 0, 0, 0);
             }
+            // Draw key icon
             if (key.label == null && key.icon != null) {
                 int drawableWidth = key.icon.getIntrinsicWidth();
                 int drawableHeight = key.icon.getIntrinsicHeight();