diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 91ebac1da4f3ca95f82c40befbefffb1b9925d40..0834adf20679c148a83a4e1c2d2cf0aefd0a9aca 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -71,7 +71,7 @@
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:parentStyle="defaultEnterKeyStyle" />
+                latin:parentStyle="shiftEnterKeyStyle" />
         </case>
         <!-- Smiley in textShortMessage field.
              Overrides common enter key style. -->
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 3788ca8ba39c704c1c61680aa3833296f91f3a4b..61a515badd60bf0c922f8602fba513d0a1451347 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -99,7 +99,11 @@
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
     <key-style
-        latin:styleName="defaultActionKeyStyle"
+        latin:styleName="shiftEnterKeyStyle"
+        latin:code="!code/key_shift_enter"
+        latin:parentStyle="defaultEnterKeyStyle" />
+    <key-style
+        latin:styleName="defaultActionEnterKeyStyle"
         latin:code="!code/key_action_enter"
         latin:keyIcon="!icon/undefined"
         latin:backgroundType="action"
@@ -112,7 +116,7 @@
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:parentStyle="defaultEnterKeyStyle" />
+                latin:parentStyle="shiftEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionGo"
@@ -120,7 +124,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabel="!text/label_go_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionNext"
@@ -128,7 +132,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabel="!text/label_next_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionPrevious"
@@ -136,7 +140,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabel="!text/label_previous_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionDone"
@@ -144,7 +148,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabel="!text/label_done_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSend"
@@ -152,7 +156,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabel="!text/label_send_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSearch"
@@ -160,7 +164,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyIcon="!icon/search_key"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionCustomLabel"
@@ -168,7 +172,7 @@
             <key-style
                 latin:styleName="enterKeyStyle"
                 latin:keyLabelFlags="fromCustomActionLabel"
-                latin:parentStyle="defaultActionKeyStyle" />
+                latin:parentStyle="defaultActionEnterKeyStyle" />
         </case>
         <!-- imeAction is either actionNone or actionUnspecified. -->
         <default>
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
index 428e31ccd37c12467d6ffcb8fa37795e7b20c2e2..0d852dde221192f15defda4062b1c8e3b23d88e6 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
@@ -51,6 +51,7 @@ public final class KeyboardCodesSet {
         "key_action_enter",
         "key_action_next",
         "key_action_previous",
+        "key_shift_enter",
         "key_language_switch",
         "key_research",
         "key_unspecified",
@@ -86,6 +87,7 @@ public final class KeyboardCodesSet {
         Constants.CODE_ACTION_ENTER,
         Constants.CODE_ACTION_NEXT,
         Constants.CODE_ACTION_PREVIOUS,
+        Constants.CODE_SHIFT_ENTER,
         Constants.CODE_LANGUAGE_SWITCH,
         Constants.CODE_RESEARCH,
         Constants.CODE_UNSPECIFIED,
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index 5c8a2edd8fe679dca57f6b1ecb6273522b4d7e72..483504cfbd2e089ce2d9de3b8f6bf9ebf4fcccf9 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -184,8 +184,9 @@ public final class Constants {
     public static final int CODE_ACTION_PREVIOUS = -9;
     public static final int CODE_LANGUAGE_SWITCH = -10;
     public static final int CODE_RESEARCH = -11;
+    public static final int CODE_SHIFT_ENTER = -12;
     // Code value representing the code is not specified.
-    public static final int CODE_UNSPECIFIED = -12;
+    public static final int CODE_UNSPECIFIED = -13;
 
     public static boolean isLetterCode(final int code) {
         return code >= CODE_SPACE;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4a3511472e2b5fccc632d9981d2c2b799a6559d0..ab21cff476b019018a64c28d550fd2b008db1481 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1369,9 +1369,6 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
         case Constants.CODE_SHORTCUT:
             mSubtypeSwitcher.switchToShortcutIME(this);
             break;
-        case Constants.CODE_ACTION_ENTER:
-            performEditorAction(getActionId(switcher.getKeyboard()));
-            break;
         case Constants.CODE_ACTION_NEXT:
             performEditorAction(EditorInfo.IME_ACTION_NEXT);
             break;
@@ -1386,32 +1383,20 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
                 ResearchLogger.getInstance().onResearchKeySelected(this);
             }
             break;
-        default:
-            mSpaceState = SPACE_STATE_NONE;
-            if (mSettings.getCurrent().isWordSeparator(primaryCode)) {
-                didAutoCorrect = handleSeparator(primaryCode, x, y, spaceState);
-            } else {
-                if (SPACE_STATE_PHANTOM == spaceState) {
-                    if (ProductionFlag.IS_INTERNAL) {
-                        if (mWordComposer.isComposingWord() && mWordComposer.isBatchMode()) {
-                            Stats.onAutoCorrection(
-                                    "", mWordComposer.getTypedWord(), " ", mWordComposer);
-                        }
-                    }
-                    commitTyped(LastComposedWord.NOT_A_SEPARATOR);
-                }
-                final int keyX, keyY;
-                final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
-                if (keyboard != null && keyboard.hasProximityCharsCorrection(primaryCode)) {
-                    keyX = x;
-                    keyY = y;
-                } else {
-                    keyX = Constants.NOT_A_COORDINATE;
-                    keyY = Constants.NOT_A_COORDINATE;
-                }
-                handleCharacter(primaryCode, keyX, keyY, spaceState);
+        case Constants.CODE_ACTION_ENTER:
+            final int actionId = getActionId(switcher.getKeyboard());
+            if (EditorInfo.IME_ACTION_NONE != actionId
+                && EditorInfo.IME_ACTION_UNSPECIFIED != actionId) {
+                performEditorAction(actionId);
+                break;
             }
-            mExpectingUpdateSelection = true;
+            didAutoCorrect = handleNonSpecialCharacter(Constants.CODE_ENTER, x, y, spaceState);
+            break;
+        case Constants.CODE_SHIFT_ENTER:
+            didAutoCorrect = handleNonSpecialCharacter(Constants.CODE_ENTER, x, y, spaceState);
+            break;
+        default:
+            didAutoCorrect = handleNonSpecialCharacter(primaryCode, x, y, spaceState);
             break;
         }
         switcher.onCodeInput(primaryCode);
@@ -1425,6 +1410,38 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
         mConnection.endBatchEdit();
     }
 
+    private boolean handleNonSpecialCharacter(final int primaryCode, final int x, final int y,
+            final int spaceState) {
+        mSpaceState = SPACE_STATE_NONE;
+        final boolean didAutoCorrect;
+        if (mSettings.getCurrent().isWordSeparator(primaryCode)) {
+            didAutoCorrect = handleSeparator(primaryCode, x, y, spaceState);
+        } else {
+            didAutoCorrect = false;
+            if (SPACE_STATE_PHANTOM == spaceState) {
+                if (ProductionFlag.IS_INTERNAL) {
+                    if (mWordComposer.isComposingWord() && mWordComposer.isBatchMode()) {
+                        Stats.onAutoCorrection(
+                                "", mWordComposer.getTypedWord(), " ", mWordComposer);
+                    }
+                }
+                commitTyped(LastComposedWord.NOT_A_SEPARATOR);
+            }
+            final int keyX, keyY;
+            final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
+            if (keyboard != null && keyboard.hasProximityCharsCorrection(primaryCode)) {
+                keyX = x;
+                keyY = y;
+            } else {
+                keyX = Constants.NOT_A_COORDINATE;
+                keyY = Constants.NOT_A_COORDINATE;
+            }
+            handleCharacter(primaryCode, keyX, keyY, spaceState);
+        }
+        mExpectingUpdateSelection = true;
+        return didAutoCorrect;
+    }
+
     // Called from PointerTracker through the KeyboardActionListener interface
     @Override
     public void onTextInput(final String rawText) {