diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
index 292bf35cb59c9b00307587adc52e80f52f458aa3..2a0dad6782346e5e33b9374f1a07f48a3a6778af 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
@@ -120,6 +120,10 @@ public final class KeySpecParser {
     }
 
     public static String getLabel(final String keySpec) {
+        if (keySpec == null) {
+            // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
+            return null;
+        }
         if (hasIcon(keySpec)) {
             return null;
         }
@@ -140,6 +144,10 @@ public final class KeySpecParser {
     }
 
     public static String getOutputText(final String keySpec) {
+        if (keySpec == null) {
+            // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
+            return null;
+        }
         final int labelEnd = indexOfLabelEnd(keySpec);
         if (hasCode(keySpec, labelEnd)) {
             return null;
@@ -165,6 +173,10 @@ public final class KeySpecParser {
     }
 
     public static int getCode(final String keySpec, final KeyboardCodesSet codesSet) {
+        if (keySpec == null) {
+            // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
+            return CODE_UNSPECIFIED;
+        }
         final int labelEnd = indexOfLabelEnd(keySpec);
         if (hasCode(keySpec, labelEnd)) {
             checkDoubleLabelEnd(keySpec, labelEnd);
@@ -187,6 +199,7 @@ public final class KeySpecParser {
         return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT;
     }
 
+    // TODO: Make this method private once Key.code attribute is removed.
     public static int parseCode(final String text, final KeyboardCodesSet codesSet,
             final int defCode) {
         if (text == null) {
@@ -202,6 +215,10 @@ public final class KeySpecParser {
     }
 
     public static int getIconId(final String keySpec) {
+        if (keySpec == null) {
+            // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
+            return KeyboardIconsSet.ICON_UNDEFINED;
+        }
         if (!hasIcon(keySpec)) {
             return KeyboardIconsSet.ICON_UNDEFINED;
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
index d3bc0c2b2668d7d7e34120185dc4f0ac1cfeacf0..0551e9e98866b97bdadab10e6c1c103fcb583ed6 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
@@ -46,6 +46,9 @@ public final class MoreKeySpec {
 
     public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale,
             final KeyboardCodesSet codesSet) {
+        if (TextUtils.isEmpty(moreKeySpec)) {
+            throw new KeySpecParser.KeySpecParserError("Empty more key spec");
+        }
         mLabel = StringUtils.toUpperCaseOfStringForLocale(
                 KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale);
         final int code = StringUtils.toUpperCaseOfCodeForLocale(
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
index 9b6c462009f7f1aec205455bf31b79d2e90c08e6..9e43bd4d25b6c6c3edfa3d2c5ee18c38bb1cdc67 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
@@ -16,6 +16,9 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
+import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
+
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.latin.Constants;
@@ -40,4 +43,13 @@ public final class KeySpecParserTests extends KeySpecParserTestsBase {
                 Constants.printableCode(expectedCode),
                 Constants.printableCode(actualCode));
     }
+
+    // TODO: Remove this method.
+    // These should throw {@link KeySpecParserError} when Key.keyLabel attribute become mandatory.
+    public void testEmptySpec() {
+        assertParser("Null spec", null,
+                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+        assertParser("Empty spec", "",
+                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index 04b7008ef5b275940c0751daa109723407c3ccfc..a02d4029913a75a2bce7857440608af58429ac79 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -251,10 +251,6 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
     }
 
     public void testFormatError() {
-        assertParserError("Null spec", null, null,
-                null, ICON_UNDEFINED, CODE_UNSPECIFIED);
-        assertParserError("Empty spec", "", null,
-                null, ICON_UNDEFINED, CODE_UNSPECIFIED);
         assertParserError("Single bar", "|",
                 "|", null, ICON_UNDEFINED, '|');
         assertParserError("Empty label with outputText", "|a",
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
index e49c624612e8fd84215fb1a2deb42911063e4628..ea25bcf37b24488211b954495eac1f440fd24d30 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
@@ -16,6 +16,9 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
+import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
+
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.latin.Constants;
@@ -42,6 +45,14 @@ public final class MoreKeySpecTests extends KeySpecParserTestsBase {
                 Constants.printableCode(spec.mCode));
     }
 
+    // TODO: Move this method to {@link KeySpecParserBase}.
+    public void testEmptySpec() {
+        assertParserError("Null spec", null,
+                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+        assertParserError("Empty spec", "",
+                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+    }
+
     private static void assertArrayEquals(final String message, final Object[] expected,
             final Object[] actual) {
         if (expected == actual) {