diff --git a/java/res/layout-xlarge/recognition_status.xml b/java/res/layout-xlarge/recognition_status.xml
new file mode 100644
index 0000000000000000000000000000000000000000..40bc098230f8ba10542a6a64aee11815784fd373
--- /dev/null
+++ b/java/res/layout-xlarge/recognition_status.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<RelativeLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:background="@drawable/background_voice">
+    <LinearLayout
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            android:id="@+id/popup_layout"
+            android:orientation="vertical"
+            android:layout_height="371dip"
+            android:layout_width="500dip"
+            android:layout_centerInParent="true"
+            android:background="@drawable/vs_dialog_red">
+        <TextView
+                android:id="@+id/text"
+                android:text="@string/voice_error"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:singleLine="true"
+                android:layout_marginTop="10dip"
+                android:textSize="28sp"
+                android:textColor="#ffffff"
+                android:layout_gravity="center"
+                android:visibility="invisible"/>
+        <RelativeLayout
+                android:layout_height="0dip"
+                android:layout_width="match_parent"
+                android:layout_weight="1.0">
+            <com.android.inputmethod.deprecated.voice.SoundIndicator
+                    android:id="@+id/sound_indicator"
+                    android:src="@drawable/mic_full"
+                    android:background="@drawable/mic_base"
+                    android:adjustViewBounds="true"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_centerInParent="true"
+                    android:visibility="gone"/>
+            <ImageView
+                    android:id="@+id/image"
+                    android:src="@drawable/mic_slash"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_centerInParent="true"
+                    android:visibility="visible"/>
+            <ProgressBar
+                    android:id="@+id/progress"
+                    android:indeterminate="true"
+                    android:indeterminateOnly="false"
+                    android:layout_height="60dip"
+                    android:layout_width="60dip"
+                    android:layout_centerInParent="true"
+                    android:visibility="gone"/>
+        </RelativeLayout>
+        <!--
+        The text is set by the code. We specify a random text (voice_error), so the
+        text view does not have a zero height. This is necessary to keep the slash
+        mic and the recording mic is the same position
+        -->
+        <TextView
+                android:id="@+id/language"
+                android:text="@string/voice_error"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:singleLine="true"
+                android:textSize="14sp"
+                android:layout_marginBottom="3dip"
+                android:layout_gravity="center"
+                android:textColor="#ffffff"
+                android:visibility="invisible"/>
+        <Button
+                android:id="@+id/button"
+                android:layout_width="match_parent"
+                android:layout_height="54dip"
+                android:singleLine="true"
+                android:focusable="true"
+                android:text="@string/cancel"
+                android:layout_gravity="center_horizontal"
+                android:background="@drawable/btn_center"
+                android:textColor="#ffffff"
+                android:textSize="19sp" />
+    </LinearLayout>
+</RelativeLayout>
diff --git a/java/res/layout/recognition_status.xml b/java/res/layout/recognition_status.xml
index 45f68974ab1ea70f56e4448f33340c9c3ecdde15..a2ddb7c505fe27614b3d3f2664b69930043e2a77 100644
--- a/java/res/layout/recognition_status.xml
+++ b/java/res/layout/recognition_status.xml
@@ -1,19 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/* 
+/*
 **
 ** Copyright 2009, The Android Open Source Project
 **
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
 **
-**     http://www.apache.org/licenses/LICENSE-2.0 
+**     http://www.apache.org/licenses/LICENSE-2.0
 **
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
 -->
@@ -37,7 +37,7 @@
                 android:layout_width="wrap_content"
                 android:singleLine="true"
                 android:layout_marginTop="10dip"
-                android:textSize="28sp"
+                android:textSize="20sp"
                 android:textColor="#ffffff"
                 android:layout_gravity="center"
                 android:visibility="invisible"/>
@@ -81,7 +81,8 @@
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:singleLine="true"
-                android:textSize="14sp"
+                android:textSize="15sp"
+                android:layout_marginTop="3dip"
                 android:layout_marginBottom="3dip"
                 android:layout_gravity="center"
                 android:textColor="#ffffff"
@@ -89,13 +90,13 @@
         <Button
                 android:id="@+id/button"
                 android:layout_width="match_parent"
-                android:layout_height="54dip"
+                android:layout_height="30dip"
                 android:singleLine="true"
                 android:focusable="true"
                 android:text="@string/cancel"
                 android:layout_gravity="center_horizontal"
                 android:background="@drawable/btn_center"
                 android:textColor="#ffffff"
-                android:textSize="19sp" />
+                android:textSize="15sp" />
     </LinearLayout>
 </RelativeLayout>
diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
index 0c2a58ea90ed3f0f51f9056535527af596be0f14..d99f40765b5f242c741256d9acbbf631c2dbfe6d 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
@@ -67,7 +67,8 @@ public class InputMethodManagerCompatWrapper {
 
     // For the compatibility, IMM will create dummy subtypes if subtypes are not found.
     // This is required to be false if the current behavior is broken. For now, it's ok to be true.
-    private static final boolean HAS_VOICE_FUNCTION = true;
+    public static final boolean FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES =
+            !InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED;
     private static final String VOICE_MODE = "voice";
     private static final String KEYBOARD_MODE = "keyboard";
 
@@ -118,8 +119,7 @@ public class InputMethodManagerCompatWrapper {
         Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList,
                 (imi != null ? imi.getInputMethodInfo() : null), allowsImplicitlySelectedSubtypes);
         if (retval == null || !(retval instanceof List) || ((List<?>)retval).isEmpty()) {
-            if (InputMethodServiceCompatWrapper.
-                    CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
+            if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) {
                 // Returns an empty list
                 return Collections.emptyList();
             }
@@ -148,7 +148,7 @@ public class InputMethodManagerCompatWrapper {
 
     @SuppressWarnings("unused")
     private InputMethodSubtypeCompatWrapper getLastResortSubtype(String mode) {
-        if (VOICE_MODE.equals(mode) && !HAS_VOICE_FUNCTION)
+        if (VOICE_MODE.equals(mode) && !FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES)
             return null;
         Locale inputLocale = SubtypeSwitcher.getInstance().getInputLocale();
         if (inputLocale == null)
@@ -160,8 +160,7 @@ public class InputMethodManagerCompatWrapper {
             getShortcutInputMethodsAndSubtypes() {
         Object retval = CompatUtils.invoke(mImm, null, METHOD_getShortcutInputMethodsAndSubtypes);
         if (retval == null || !(retval instanceof Map) || ((Map<?, ?>)retval).isEmpty()) {
-            if (InputMethodServiceCompatWrapper.
-                    CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
+            if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) {
                 // Returns an empty map
                 return Collections.emptyMap();
             }
diff --git a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
index d6afd06c5a454bffaab189e997186160a93e214e..828aea41f6f158540ee6b8b677ab289410db2c34 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
@@ -47,11 +47,17 @@ public class InputMethodServiceCompatWrapper extends InputMethodService {
     @SuppressWarnings("unused")
     public void notifyOnCurrentInputMethodSubtypeChanged(InputMethodSubtypeCompatWrapper subtype) {
         // Do nothing when the API level is 11 or later
-        if (CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) return;
+        // and FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES is not true
+        if (CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED && !InputMethodManagerCompatWrapper.
+                FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) {
+            return;
+        }
         if (subtype == null) {
             subtype = mImm.getCurrentInputMethodSubtype();
         }
         if (subtype != null) {
+            if (!InputMethodManagerCompatWrapper.FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES
+                    && !subtype.isDummy()) return;
             if (!InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) {
                 LanguageSwitcherProxy.getInstance().setLocale(subtype.getLocale());
             }
diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
index 86c8af37f8b574c090734f3c027b37f22100b3f1..806c355a91a6e097c7ae341e6f415ee1d665216a 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
@@ -116,6 +116,10 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper
         return (String)CompatUtils.invoke(mObj, null, METHOD_getExtraValueOf, key);
     }
 
+    public boolean isDummy() {
+        return !hasOriginalObject();
+    }
+
     @Override
     public boolean equals(Object o) {
         if (o instanceof InputMethodSubtypeCompatWrapper) {