diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index f0da2744bed76eed006991fb528619d5be9e4a7f..fb4d97b8b751404f9a3345c487bfcfb134e0c32a 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -167,6 +167,8 @@
             <enum name="im" value="3" />
             <enum name="web" value="4" />
             <enum name="phone" value="5" />
+            <enum name="number" value="6" />
+            <enum name="webEmail" value="7" />
         </attr>
         <attr name="passwordInput" format="boolean" />
         <attr name="hasSettingsKey" format="string" />
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index 97ef687bd9e3d0c7f372f4d5d8a1a68a4de45d6c..91dbf25cf76f29dc61a0a204afe261b4d3d0d8ee 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -36,6 +36,8 @@ public class KeyboardId {
     public static final int MODE_WEB = 4;
     public static final int MODE_PHONE = 5;
     public static final int MODE_NUMBER = 6;
+    // Should come up with implementing web & email mode clearer way.
+    public static final int MODE_WEB_EMAIL = 7;
 
     public final Locale mLocale;
     public final int mOrientation;
@@ -159,6 +161,7 @@ public class KeyboardId {
         case MODE_WEB: return "web";
         case MODE_PHONE: return "phone";
         case MODE_NUMBER: return "number";
+        case MODE_WEB_EMAIL: return "webEmail";
         }
         return null;
     }
@@ -182,6 +185,7 @@ public class KeyboardId {
         case EditorInfo.IME_ACTION_SEARCH: action = "actionSearch"; break;
         case EditorInfo.IME_ACTION_SEND: action = "actionSend"; break;
         case EditorInfo.IME_ACTION_DONE: action = "actionDone"; break;
+        case EditorInfo.IME_ACTION_NEXT: action = "actionNext"; break;
         case EditorInfo.IME_ACTION_PREVIOUS: action = "actionPrevious"; break;
         default: action = "actionUnknown(" + actionNo + ")"; break;
         }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 6e76cadf2d38a1feb7a6eda30f3ec140146968b8..bf831bfbc3794a007a20a95bfdcb1f968a836e7d 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -16,15 +16,6 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardActionListener;
-import com.android.inputmethod.keyboard.KeyboardSwitcher;
-import com.android.inputmethod.keyboard.KeyboardView;
-import com.android.inputmethod.keyboard.LatinKeyboard;
-import com.android.inputmethod.keyboard.LatinKeyboardView;
-import com.android.inputmethod.latin.Utils.RingCharBuffer;
-import com.android.inputmethod.voice.VoiceIMEConnector;
-
 import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -72,6 +63,15 @@ import android.widget.FrameLayout;
 import android.widget.HorizontalScrollView;
 import android.widget.LinearLayout;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardActionListener;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.KeyboardView;
+import com.android.inputmethod.keyboard.LatinKeyboard;
+import com.android.inputmethod.keyboard.LatinKeyboardView;
+import com.android.inputmethod.latin.Utils.RingCharBuffer;
+import com.android.inputmethod.voice.VoiceIMEConnector;
+
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -85,7 +85,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     private static final String TAG = LatinIME.class.getSimpleName();
     private static final boolean PERF_DEBUG = false;
     private static final boolean TRACE = false;
-    private static boolean DEBUG = LatinImeLogger.sDBG;
+    private static boolean DEBUG;
 
     /**
      * The private IME option used to indicate that no microphone should be
@@ -390,6 +390,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         mSubtypeSwitcher = SubtypeSwitcher.getInstance();
         mKeyboardSwitcher = KeyboardSwitcher.getInstance();
         mAccessibilityUtils = AccessibilityUtils.getInstance();
+        DEBUG = LatinImeLogger.sDBG;
 
         final Resources res = getResources();
         mResources = res;
@@ -532,8 +533,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
         LatinKeyboardView inputView = switcher.getInputView();
 
-        if(DEBUG) {
-            Log.d(TAG, "onStartInputView: " + inputView);
+        if (DEBUG) {
+            Log.d(TAG, "onStartInputView: inputType=" + ((attribute == null) ? "none"
+                    : String.format("0x%08x", attribute.inputType)));
         }
         // In landscape mode, this method gets called without the input view being created.
         if (inputView == null) {
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 727e3f16dcf602296ea23a0f5c71a86af6427d61..a895ba28165a69dd7f4c8be6c2ea8d5180791c00 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -25,6 +25,7 @@ import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Process;
 import android.text.InputType;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.inputmethod.EditorInfo;
@@ -38,6 +39,7 @@ import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.lang.reflect.Field;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -485,7 +487,9 @@ public class Utils {
         case InputType.TYPE_CLASS_PHONE:
             return KeyboardId.MODE_PHONE;
         case InputType.TYPE_CLASS_TEXT:
-            if (Utils.isEmailVariation(variation)) {
+            if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS) {
+                return KeyboardId.MODE_WEB_EMAIL;
+            } else if (Utils.isEmailVariation(variation)) {
                 return KeyboardId.MODE_EMAIL;
             } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) {
                 return KeyboardId.MODE_URL;
@@ -493,7 +497,8 @@ public class Utils {
                 return KeyboardId.MODE_IM;
             } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
                 return KeyboardId.MODE_TEXT;
-            } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
+            } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT
+                    || variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD) {
                 return KeyboardId.MODE_WEB;
             } else {
                 return KeyboardId.MODE_TEXT;