Enable Material theme for Android

With this CL, Mozc for Android supports Material theme.

Note that this CL also contains a lot of other improvements and bug fixes that might not be directly related to the Material theme.  Here are some examples:
  * Floating candidate window support in Android 5.0.
  * Improved accessibility support.
  * Start bundling Key Character Map (KCM) file of Japanese 109 keyboard.

See the release note for details.

As for desktop versions, no behavior change is intended.

BUG=none
TEST=manually done with Nexus 5 / Android 5.0.1 (LRX22C)

git-svn-id: https://mozc.googlecode.com/svn/trunk@467 a6090854-d499-a067-5803-1114d4e51264
diff --git a/src/DEPS b/src/DEPS
index d58edc4..03c4ff4 100644
--- a/src/DEPS
+++ b/src/DEPS
@@ -29,6 +29,7 @@
 
 vars = {
   "breakpad_revision": "1391",
+  "fonttools_revision": "5ba7d98a4153fad57258fca23b0bcb238717aec3",
   "gtest_revision": "700",
   "gmock_revision": "501",
   "gyp_revision": "2012",
@@ -82,6 +83,9 @@
       File("http://findbugs.googlecode.com/"
            + "svn/repos/release-repository/com/google/code/findbugs/jsr305/"
            + Var("jsr305_version") + "/jsr305-" + Var("jsr305_version") + ".jar"),
+    "src/third_party/fontTools":
+      "https://github.com/googlei18n/fonttools.git@" +
+      Var("fonttools_revision"),
     "src/third_party/zlib/v1_2_8":
       "https://src.chromium.org/chrome/trunk/src/third_party/zlib@" +
       Var("zlib_revision"),
diff --git a/src/android/AndroidManifest_template.xml b/src/android/AndroidManifest_template.xml
index 988b823..5d3a845 100644
--- a/src/android/AndroidManifest_template.xml
+++ b/src/android/AndroidManifest_template.xml
@@ -33,15 +33,21 @@
           package="@ANDROID_APPLICATION_ID@"
           android:versionCode="@ANDROID_VERSION_CODE@"
           android:versionName="@MAJOR@.@MINOR@.@BUILD@.@REVISION@-@ANDROID_ARCH@">
-  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
+  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
 
   <!-- Google Japanese Input (the main code) requires the following permissions. -->
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.VIBRATE" />
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 
 
-  <application android:icon="@drawable/application_icon" android:label="@string/app_full_name" >
+  <application android:icon="@drawable/application_icon"
+               android:label="@string/app_full_name"
+               android:allowBackup="false"
+               android:theme="@style/AppThemeSelector" >
     <service android:name="@ANDROID_SERVICE_NAME@"
              android:permission="android.permission.BIND_INPUT_METHOD"
              android:label="@string/app_full_name">
@@ -51,18 +57,32 @@
       <meta-data android:name="android.view.im" android:resource="@xml/method" />
     </service>
 
-    <!-- Preference -->
-    <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity"
+    <!-- Launcher Icon -->
+    <activity android:name="org.mozc.android.inputmethod.japanese.LauncherActivity"
+              android:enabled="@bool/show_launcher_icon"
               android:label="@string/app_full_name">
       <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
     </activity>
+
+    <receiver android:name="org.mozc.android.inputmethod.japanese.LauncherIconVisibilityInitializer">
+      <intent-filter>
+        <action android:name="android.intent.action.BOOT_COMPLETED" />
+        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
+        <action android:name="android.intent.action.USER_INITIALIZE" />
+      </intent-filter>
+    </receiver>
+
+    <!-- Preference -->
+    <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity" />
     <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcFragmentPreferenceActivity"
-              android:launchMode="singleTask" />
+              android:launchMode="singleTask"
+              android:theme="@style/AppThemeSelectorSettings"/>
     <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcFragmentSoftwareKeyboardAdvancedSettingsPreferenceActivity"
-              android:launchMode="singleTop" />
+              android:launchMode="singleTop"
+              android:theme="@style/AppThemeSelectorSettings"/>
 
     <activity android:name="org.mozc.android.inputmethod.japanese.FirstTimeLaunchActivity" />
     <activity android:name="org.mozc.android.inputmethod.japanese.preference.MiniBrowserActivity"
@@ -70,11 +90,11 @@
 
     <!-- User dictionary tool -->
     <activity android:name="org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryToolActivity"
-              android:enabled="@bool/enable_user_dictionary_tools_activity"
               android:label="@string/user_dictionary_tool_app_name"
-              android:theme="@style/MozcLightTheme"
               android:uiOptions="splitActionBarWhenNarrow"
-              android:configChanges="orientation|screenSize">
+              android:configChanges="orientation|screenSize"
+              android:theme="@style/AppThemeSelectorSettings">
+
       <!-- Intent filters to receive a file-sending intent for importing user dictionary data.
            UserDictionaryToolActivity accepts only file scheme.
       -->
@@ -111,11 +131,20 @@
     <activity android:name="org.mozc.android.inputmethod.japanese.mushroom.MushroomSelectionActivity"
               android:launchMode="singleTask"
               android:taskAffinity=".mushroom"
-              android:theme="@style/MozcMushroomDialogTheme"
+              android:theme="@android:style/Theme.DeviceDefault.Light.Dialog"
               android:windowSoftInputMode="stateAlwaysHidden"
               android:excludeFromRecents="true" />
 
 
+    <!-- Input device manager -->
+    <receiver android:name="org.mozc.android.inputmethod.japanese.InputDeviceReceiver">
+      <intent-filter>
+        <action android:name="android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS" />
+      </intent-filter>
+      <meta-data android:name="android.hardware.input.metadata.KEYBOARD_LAYOUTS"
+                 android:resource="@xml/keyboard_layouts" />
+    </receiver>
+
     <!-- Following entry is for unit tests. Do not remove. -->
     <!-- The activity is used for testing views. -->
     <activity android:name="android.app.Activity" />
diff --git a/src/android/android.gyp b/src/android/android.gyp
index 9943cf8..147f2a3 100644
--- a/src/android/android.gyp
+++ b/src/android/android.gyp
@@ -100,6 +100,7 @@
       'type': 'none',
       'dependencies': [
         'protobuf/protobuf.gyp:protobuf_java',
+        'resources/resources.gyp:resources',
         'sdk_apk_dependencies',
         'userfeedback/userfeedback.gyp:userfeedback',
       ],
@@ -153,9 +154,10 @@
         'android_manifest',
         'assets',
         'mozc',
-        'gen_mozc_drawable',
         'guava_library',
         'userfeedback/userfeedback.gyp:userfeedback_project',
+        'subset_font',
+        'resources/resources.gyp:resources_project',
         'support_libraries',
       ],
     },
@@ -219,7 +221,6 @@
         'files': [
           # Copies the copyright and credit info.
           '../data/installer/credits_en.html',
-          '../data/installer/credits_ja.html',
         ],
       }],
     },
@@ -407,7 +408,7 @@
           'outputs': ['dummy_touch_stat_data'],
           'action': [
             'python', 'gen_touch_event_stats.py',
-            '--output_dir', 'assets',
+            '--output_dir', '<(sdk_asset_dir)',
             '--stats_data', '../data/typing/touch_event_stats.csv',
             '--collected_keyboards', 'collected_keyboards.csv',
           ],
@@ -528,22 +529,34 @@
       ],
     },
     {
-      'target_name': 'gen_mozc_drawable',
+      'target_name': 'subset_font',
       'type': 'none',
+      'dependencies': [
+        # TODO(komatsu): Is it better to move android_base.gyp?
+        'resources/resources.gyp:copy_asis_svg',
+        'resources/resources.gyp:transform_template_svg',
+      ],
+      'variables': {
+        'input_font': '<(font_dir)/Noto-Roboto2-Regular.otf',
+        'fonttools_path': '<(third_party_dir)/fontTools/Lib/fontTools',
+      },
       'actions': [
         {
-          'action_name': 'generate_pic_files',
+          'action_name': 'make_subset_font',
           'inputs': [
-            '<(dummy_input_file)',
-            'gen_mozc_drawable.py',
+            '<(input_font)',
+            'gen_subset_font.py',
           ],
           'outputs': [
-            'dummy_gen_mozc_drawable_output',
+            '<(sdk_asset_dir)/subset_font.otf',
           ],
           'action': [
-            'python', 'gen_mozc_drawable.py',
-            '--svg_dir=../data/images/android/svg',
-            '--output_dir=<(resources_project_path)/res/raw',
+            'python',
+            'gen_subset_font.py',
+            '--svg_paths=<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip,<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+            '--input_font', '<(input_font)',
+            '--output_font', '<@(_outputs)',
+            '--fonttools_path', '<(fonttools_path)',
           ],
         },
       ],
diff --git a/src/android/android_env.gypi b/src/android/android_env.gypi
index c92a1ba..579b53f 100644
--- a/src/android/android_env.gypi
+++ b/src/android/android_env.gypi
@@ -78,7 +78,7 @@
         'native_test_small_targets': [
           'oss_data_manager_test',
         ],
-        'resources_project_path': 'static_resources/resources_oss',
+        'font_dir': '<(third_party_dir)/noto_font',
       },
     }],
     ['android_arch=="arm" and android_compiler=="gcc"', {
diff --git a/src/android/android_resources.gypi b/src/android/android_resources.gypi
new file mode 100644
index 0000000..853b35d
--- /dev/null
+++ b/src/android/android_resources.gypi
@@ -0,0 +1,60 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+{
+  'variables': {
+    'android_translations': [
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-ja/*.xml)',
+    ],
+
+    'android_resources': [
+      '<@(android_translations)',
+
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable-hdpi/*.png)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable-xhdpi/*.png)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/layout/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/layout-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/menu/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h380dp-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h500dp-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h570dp-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h650dp-port/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h720dp-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h800dp-port/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h900dp-port/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-land/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-v16/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/values-v21/*.xml)',
+      '<!@(ls -1 <(original_sdk_resources_dir)/res/xml/*.xml)',
+    ],
+  },
+}
+
diff --git a/src/android/gen_mozc_drawable.py b/src/android/gen_mozc_drawable.py
index ad11a4b..b4f7699 100644
--- a/src/android/gen_mozc_drawable.py
+++ b/src/android/gen_mozc_drawable.py
@@ -70,6 +70,7 @@
 CMD_PICTURE_DRAW_ELLIPSE = 7
 CMD_PICTURE_DRAW_GROUP_START = 8
 CMD_PICTURE_DRAW_GROUP_END = 9
+CMD_PICTURE_DRAW_TEXT = 10
 
 CMD_PICTURE_PATH_EOP = 0
 CMD_PICTURE_PATH_MOVE = 1
@@ -88,6 +89,20 @@
 CMD_PICTURE_PAINT_STROKE_CAP = 5
 CMD_PICTURE_PAINT_STROKE_JOIN = 6
 CMD_PICTURE_PAINT_SHADER = 7
+CMD_PICTURE_PAINT_FONT_SIZE = 8
+CMD_PICTURE_PAINT_TEXT_ANCHOR = 9
+CMD_PICTURE_PAINT_DOMINANT_BASELINE = 10
+CMD_PICTURE_PAINT_FONT_WEIGHT = 11
+
+CMD_PICTURE_PAINT_TEXT_ANCHOR_START = 0
+CMD_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE = 1
+CMD_PICTURE_PAINT_TEXT_ANCHOR_END = 2
+
+CMD_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO = 0
+CMD_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL = 1
+
+CMD_PICTURE_PAINT_FONT_WEIGHT_NORMAL = 0
+CMD_PICTURE_PAINT_FONT_WEIGHT_BOLD = 1
 
 CMD_PICTURE_SHADER_LINEAR_GRADIENT = 1
 CMD_PICTURE_SHADER_RADIAL_GRADIENT = 2
@@ -99,19 +114,22 @@
 STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3
 STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4
 STYLE_CATEGORY_KEYICON_BOUND = 5
-STYLE_CATEGORY_KEYICON_FUNCTION = 6
-STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 7
-STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 8
-STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW = 9
-STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 10
-STYLE_CATEGORY_KEYICON_POPUP_FUNCTION = 11
-STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK = 12
+STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION = 6
+STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE = 7
+STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION = 8
+STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 9
+STYLE_CATEGORY_KEYICON_ENTER = 10
+STYLE_CATEGORY_KEYICON_ENTER_CIRCLE = 11
+STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 12
+STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 13
 # We may be able to reuse same resources for symbol major/minor icons.
-STYLE_CATEGORY_SYMBOL_MAJOR = 13
-STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 14
-STYLE_CATEGORY_SYMBOL_MINOR = 15
-STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 16
-STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND = 17
+STYLE_CATEGORY_SYMBOL_MAJOR = 14
+STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 15
+STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE = 16
+STYLE_CATEGORY_SYMBOL_MINOR = 17
+STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 18
+STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT = 19
+STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED = 20
 
 # We'll check the category id by reverse sorted order, to resolve prefix match
 # confliction.
@@ -124,23 +142,28 @@
         ('style-keyicon-guide-highlight',
          STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT),
         ('style-keyicon-bound', STYLE_CATEGORY_KEYICON_BOUND),
-        ('style-keyicon-function', STYLE_CATEGORY_KEYICON_FUNCTION),
+        ('style-keyicon-twelvekeys-function',
+         STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION),
+        ('style-keyicon-twelvekeys-globe',
+         STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE),
+        ('style-keyicon-qwerty-function',
+         STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION),
         ('style-keyicon-function-dark', STYLE_CATEGORY_KEYICON_FUNCTION_DARK),
+        ('style-keyicon-enter', STYLE_CATEGORY_KEYICON_ENTER),
+        ('style-keyicon-enter-circle', STYLE_CATEGORY_KEYICON_ENTER_CIRCLE),
         ('style-keyicon-qwerty-shift-on-arrow',
          STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW),
-        ('style-keyicon-qwerty-caps-on-arrow',
-         STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW),
         ('style-keypopup-highlight', STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT),
-        ('style-keyicon-popup-function',
-         STYLE_CATEGORY_KEYICON_POPUP_FUNCTION),
-        ('style-keyicon-popup-function-dark',
-         STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK),
         ('style-symbol-major', STYLE_CATEGORY_SYMBOL_MAJOR),
         ('style-symbol-major-selected', STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED),
+        ('style-symbol-major-emoji-disable-circle',
+         STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE),
         ('style-symbol-minor', STYLE_CATEGORY_SYMBOL_MINOR),
         ('style-symbol-minor-selected', STYLE_CATEGORY_SYMBOL_MINOR_SELECTED),
-        ('style-keyboard-folding-button-background',
-         STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND),
+        ('style-keyboard-folding-button-background-default',
+         STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT),
+        ('style-keyboard-folding-button-background-scrolled',
+         STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED),
     ],
     reverse=True)
 
@@ -150,11 +173,11 @@
 #
 # Format of StateListDrawable:
 # 2, [[state_list], drawable]
-COLOR_PATTERN = re.compile(r'#([0-9A-Fa-f]{6})')
+COLOR_PATTERN = re.compile(r'#([0-9A-Fa-f]{3,8}(?![0-9A-Fa-f]))')
 PIXEL_PATTERN = re.compile(r'(\d+)(?:px)?')
 FLOAT_PATTERN = re.compile(r'^\s*,?\s*([+-]?\d+(?:\.\d*)?(:?e[+-]\d+)?)')
 SHADER_PATTERN = re.compile(r'url\(#(.*)\)')
-TRANSFORM_PATTERN = re.compile(r'(matrix|translate)\((.*)\)')
+TRANSFORM_PATTERN = re.compile(r'(matrix|translate|scale)\((.*)\)')
 MATRIX_PATTERN = re.compile(r'matrix\((.*)\)')
 STOP_COLOR_PATTERN = re.compile(r'stop-color:(.*)')
 
@@ -162,14 +185,16 @@
 HAS_SHADOW = 1
 HAS_BELOW_SHADOW = 2
 
+
 class _OutputStream(object):
   """Simple wrapper of output stream by by packing value in big endian."""
+
   def __init__(self, output):
     self.output = output
 
   def WriteByte(self, value):
     if not (0 <= value <= 255):
-      logging.critical('overflow')
+      logging.critical('overflow byte')
       sys.exit(1)
     self.output.write(struct.pack('>B', value & 0xFF))
 
@@ -187,15 +212,21 @@
     # so we can compress the data by using fixed-precision values.
     self.output.write(struct.pack('>f', value))
 
+  def WriteString(self, value):
+    utf8_string = value.encode('utf-8')
+    self.WriteInt16(len(utf8_string))
+    self.output.write(utf8_string)
+
   def __enter__(self):
     self.output.__enter__()
 
-  def __exit__(self):
-    self.output.__exit__()
+  def __exit__(self, exec_type, exec_value, traceback):
+    self.output.__exit__(exec_type, exec_value, traceback)
 
 
 class MozcDrawableConverter(object):
   """Converter from .svg file to .pic file."""
+
   def __init__(self):
     pass
 
@@ -209,12 +240,22 @@
     if not m:
       return None
 
-    c = int(m.group(1), 16)
-    if c < 0 or 0x1000000 <= c:
+    c_str = m.group(1)
+    if 3 <= len(c_str) <= 4:
+      expanded_c_str = ''
+      for ch in c_str:
+        expanded_c_str = expanded_c_str + ch + ch
+      c_str = expanded_c_str
+    if len(c_str) == 6:
+      c_str = 'FF' + c_str
+    if len(c_str) != 8:
+      logging.critical('Invalid color format.')
+      sys.exit(1)
+    c = int(c_str, 16)
+    if c < 0 or 0x100000000 <= c:
       logging.critical('Out of color range: %s', color)
       sys.exit(1)
-    # Set alpha.
-    return c | 0xFF000000
+    return c
 
   def _ParseShader(self, color, shader_map):
     """Parses shader attribute and returns a shader name from the given map."""
@@ -278,77 +319,104 @@
       y1 = float(node.get('y1'))
       x2 = float(node.get('x2'))
       y2 = float(node.get('y2'))
-      gradientTransform = node.get('gradientTransform')
-      if gradientTransform:
-        m = MATRIX_PATTERN.match(gradientTransform)
-        (m11, m21, m12, m22, m13, m23) = self._ParseFloatList(m.group(1))
+      gradient_transform = node.get('gradientTransform')
+      if gradient_transform:
+        m = MATRIX_PATTERN.match(gradient_transform)
+        (m11, m21, m12, m22, m13, m23) = tuple(self._ParseFloatList(m.group(1)))
         (x1, y1) = (m11 * x1 + m12 * y1 + m13, m21 * x1 + m22 * y1 + m23)
         (x2, y2) = (m11 * x2 + m12 * y2 + m13, m21 * x2 + m22 * y2 + m23)
 
       color_list = self._ParseStopList(node)
-      return { element_id: ('linear', x1, y1, x2, y2, color_list) }
+      return {element_id: ('linear', x1, y1, x2, y2, color_list)}
 
     if node.tag == '{http://www.w3.org/2000/svg}radialGradient':
       element_id = node.get('id')
       cx = float(node.get('cx'))
       cy = float(node.get('cy'))
       r = float(node.get('r'))
-      gradientTransform = node.get('gradientTransform')
-      if gradientTransform:
-        m = MATRIX_PATTERN.match(gradientTransform)
+      gradient_transform = node.get('gradientTransform')
+      if gradient_transform:
+        m = MATRIX_PATTERN.match(gradient_transform)
         matrix = self._ParseFloatList(m.group(1))
       else:
         matrix = None
 
       color_list = self._ParseStopList(node)
-      return { element_id: ('radial', cx, cy, r, matrix, color_list) }
+      return {element_id: ('radial', cx, cy, r, matrix, color_list)}
 
     return {}
 
   def _ParseStyle(self, node, has_shadow, shader_map):
     """Parses style attribute of the given node."""
-    result = {}
+    common_map = {}
+    # Default fill color is black (SVG's spec)
+    fill_map = {'style': 'fill', 'color': 0xFF000000, 'shadow': has_shadow}
+    # Default stroke color is none (SVG's spec)
+    stroke_map = {'style': 'stroke', 'shadow': has_shadow}
+
+    # Special warning for font-size.
+    # Inkscape often unexpectedly converts from sytle to font-size attribute.
+    if node.get('font-size', ''):
+      logging.warning('font-size attribute is not supported.')
+
     for attr in node.get('style', '').split(';'):
       attr = attr.strip()
       if not attr:
         continue
       command, arg = attr.split(':')
       if command == 'fill' or command == 'stroke':
-        shader = self._ParseShader(arg, shader_map)
-        color = self._ParseColor(arg)
-
-        if shader is None and color is None:
-          if arg != 'none':
-            logging.error('Unknown pattern: %s', arg)
+        paint_map = fill_map if command == 'fill' else stroke_map
+        if arg == 'none':
+          paint_map.pop('color', None)
+          paint_map.pop('shader', None)
           continue
 
-        paint_map = {}
+        shader = self._ParseShader(arg, shader_map)
+        color = self._ParseColor(arg)
+        if shader is None and color is None:
+          if arg != 'none':
+            logging.critical('Unknown pattern: %s', arg)
+            sys.exit(1)
+          continue
+
         paint_map['style'] = command
         if shader is not None:
           paint_map['shader'] = shader
         if color is not None:
           paint_map['color'] = color
-        paint_map['shadow'] = has_shadow
-
-        result[command] = paint_map
         continue
 
       if command == 'stroke-width':
-        paint_map = result['stroke']
-        paint_map['stroke-width'] = float(arg)
+        stroke_map['stroke-width'] = float(arg)
         continue
 
       if command == 'stroke-linecap':
-        paint_map = result['stroke']
-        paint_map['stroke-linecap'] = arg
+        stroke_map['stroke-linecap'] = arg
         continue
 
       if command == 'stroke-linejoin':
-        paint_map = result['stroke']
-        paint_map['stroke-linejoin'] = arg
+        stroke_map['stroke-linejoin'] = arg
         continue
 
-    return sorted(result.values(), key=lambda e: e['style'])
+      # font relating attributes are common to all commands.
+      if command == 'font-size':
+        common_map['font-size'] = self._ParsePixel(arg)
+      if command == 'text-anchor':
+        common_map['text-anchor'] = arg
+      if command == 'dominant-baseline':
+        common_map['dominant-baseline'] = arg
+      if command == 'font-weight':
+        common_map['font-weight'] = arg
+
+    # 'fill' comes first in order to draw 'fill' first (SVG specification).
+    result = []
+    if 'color' in fill_map or 'shader' in fill_map:
+      fill_map.update(common_map)
+      result.append(fill_map)
+    if 'color' in stroke_map or 'shader' in stroke_map:
+      stroke_map.update(common_map)
+      result.append(stroke_map)
+    return result
 
   def _ParseStopList(self, parent_node):
     result = []
@@ -390,7 +458,8 @@
       output.WriteFloat(2.)
       output.WriteInt32(0xFF292929)
 
-  def _ConvertStyle(self, style, output):
+  def _ConvertStyleCommand(self, style, output):
+    """Converts style attribute."""
     if style == 'fill':
       output.WriteByte(CMD_PICTURE_PAINT_STYLE)
       output.WriteByte(0)
@@ -490,23 +559,57 @@
     logging.critical('unknown stroke-linejoin: %s', stroke_linejoin)
     sys.exit(1)
 
-  def _ConvertStyleMap(self, style_map, output):
-    self._ConvertStyle(style_map['style'], output)
-    self._MaybeConvertColor(style_map.get('color'), output)
-    self._MaybeConvertShader(style_map.get('shader'), output)
-    self._MaybeConvertShadow(style_map['shadow'], output)
-    self._MaybeConvertStrokeWidth(style_map.get('stroke-width'), output)
-    self._MaybeConvertStrokeLinecap(style_map.get('stroke-linecap'), output)
-    self._MaybeConvertStrokeLinejoin(style_map.get('stroke-linejoin'), output)
-    output.WriteByte(CMD_PICTURE_PAINT_EOP)
+  def _MaybeConvertFontSize(self, font_size, output):
+    if font_size is None:
+      return
+    output.WriteByte(CMD_PICTURE_PAINT_FONT_SIZE)
+    output.WriteFloat(font_size)
+    return
 
-  def _ConvertStyleList(self, style_list, output):
-    output.WriteByte(len(style_list))
-    for style_map in style_list:
-      self._ConvertStyleMap(style_map, output)
+  def _MaybeConvertTextAnchor(self, text_anchor, output):
+    if text_anchor is None:
+      return
+    output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR)
+    if text_anchor == 'start':
+      output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_START)
+    elif text_anchor == 'middle':
+      output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE)
+    elif text_anchor == 'end':
+      output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_END)
+    else:
+      logging.critical('text-anchor is invalid (%s)', text_anchor)
+      sys.exit(1)
+    return
 
-  def _ConvertStyleCategory(self, style_category, output):
-    output.WriteByte(1)
+  def _MaybeConvertDominantBaseline(self, baseline, output):
+    if baseline is None:
+      return
+    output.WriteByte(CMD_PICTURE_PAINT_DOMINANT_BASELINE)
+    if baseline == 'auto':
+      output.WriteByte(CMD_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO)
+    elif baseline == 'central':
+      output.WriteByte(CMD_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL)
+    else:
+      logging.critical('dominant-baseline is invalid (%s)', baseline)
+      sys.exit(1)
+    return
+
+  def _MaybeConvertFontWeight(self, weight, output):
+    if weight is None:
+      return
+    output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT)
+    if weight == 'normal':
+      output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT_NORMAL)
+    elif weight == 'bold':
+      output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT_BOLD)
+    else:
+      logging.critical('font-weight is invalid (%s)', weight)
+      sys.exit(1)
+    return
+
+  def _MaybeConvertStyleCategory(self, style_category, output):
+    if style_category is None:
+      return
     for id_prefix, category in STYLE_CATEGORY_MAP:
       if style_category.startswith(id_prefix):
         output.WriteByte(STYLE_CATEGORY_TAG + category)
@@ -514,6 +617,25 @@
     logging.critical('unknown style_category: "%s"', style_category)
     sys.exit(1)
 
+  def _ConvertStyle(self, style_category, style_list, output):
+    style_len = len(style_list)
+    output.WriteByte(style_len)
+    for style_map in style_list:
+      self._ConvertStyleCommand(style_map['style'], output)
+      self._MaybeConvertColor(style_map.get('color'), output)
+      self._MaybeConvertShader(style_map.get('shader'), output)
+      self._MaybeConvertShadow(style_map['shadow'], output)
+      self._MaybeConvertStrokeWidth(style_map.get('stroke-width'), output)
+      self._MaybeConvertStrokeLinecap(style_map.get('stroke-linecap'), output)
+      self._MaybeConvertStrokeLinejoin(style_map.get('stroke-linejoin'), output)
+      self._MaybeConvertFontSize(style_map.get('font-size'), output)
+      self._MaybeConvertTextAnchor(style_map.get('text-anchor'), output)
+      self._MaybeConvertDominantBaseline(style_map.get('dominant-baseline'),
+                                         output)
+      self._MaybeConvertFontWeight(style_map.get('font-weight'), output)
+      self._MaybeConvertStyleCategory(style_category, output)
+      output.WriteByte(CMD_PICTURE_PAINT_EOP)
+
   def _ConvertPath(self, node, output):
     path = node.get('d')
     if path is None:
@@ -650,10 +772,7 @@
       self, node, style_category, has_shadow, shader_map, output):
     style_list = self._ParseStyle(node, has_shadow, shader_map)
     self._ConvertPath(node, output)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertPolylineElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -667,10 +786,7 @@
     output.WriteByte(len(point_list))
     for coord in point_list:
       output.WriteFloat(coord)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertPolygonElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -681,10 +797,7 @@
     output.WriteByte(len(point_list))
     for coord in point_list:
       output.WriteFloat(coord)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertLineElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -698,10 +811,7 @@
     output.WriteFloat(y1)
     output.WriteFloat(x2)
     output.WriteFloat(y2)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertCircleElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -713,10 +823,7 @@
     output.WriteFloat(cx)
     output.WriteFloat(cy)
     output.WriteFloat(r)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertEllipseElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -730,10 +837,7 @@
     output.WriteFloat(cy)
     output.WriteFloat(rx)
     output.WriteFloat(ry)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertRectElement(
       self, node, style_category, has_shadow, shader_map, output):
@@ -747,14 +851,39 @@
     output.WriteFloat(y)
     output.WriteFloat(w)
     output.WriteFloat(h)
-    if style_category is not None:
-      self._ConvertStyleCategory(style_category, output)
-    else:
-      self._ConvertStyleList(style_list, output)
+    self._ConvertStyle(style_category, style_list, output)
+
+  def _ConvertTextElement(
+      self, node, style_category, has_shadow, shader_map, output):
+    """Converts text element.
+
+    The text element must not have any children.
+
+    Args:
+      node: node
+      style_category: style_category(optional)
+      has_shadow: shadow value
+      shader_map: shader map
+      output: output stream
+    """
+    if not node.text:
+      # Ignore empty text node
+      return
+
+    style_list = self._ParseStyle(node, has_shadow, shader_map)
+    x = float(node.get('x', 0))
+    y = float(node.get('y', 0))
+    output.WriteByte(CMD_PICTURE_DRAW_TEXT)
+    output.WriteFloat(x)
+    output.WriteFloat(y)
+    if node:
+      logging.critical('<text> with children is not supported.')
+      sys.exit(1)
+    output.WriteString(node.text)
+    self._ConvertStyle(style_category, style_list, output)
 
   def _ConvertGroupElement(
       self, node, style_category, has_shadow, shader_map, output):
-
     transform = node.get('transform')
     if transform:
       # Output order of 3x3 matrix;
@@ -794,6 +923,25 @@
         output.WriteFloat(tx)
         output.WriteFloat(ty)
         output.WriteFloat(1)
+      elif transformation == 'scale':
+        parsed_coords = tuple(self._ParseFloatList(coords))
+        if len(parsed_coords) != 1 and len(parsed_coords) != 2:
+          logging.critical('Invalid argument for scale: %s', coords)
+          sys.exit(1)
+        sx = parsed_coords[0]
+        if len(parsed_coords) == 1:
+          sy = sx
+        else:
+          sy = parsed_coords[1]
+        output.WriteFloat(sx)
+        output.WriteFloat(0)
+        output.WriteFloat(0)
+        output.WriteFloat(0)
+        output.WriteFloat(sy)
+        output.WriteFloat(0)
+        output.WriteFloat(0)
+        output.WriteFloat(0)
+        output.WriteFloat(1)
       else:
         # Never reach here. Just in case.
         logging.critical('Unsupported transform: %s', transform)
@@ -855,17 +1003,26 @@
           node, style_category, has_shadow, shader_map, output)
       return
 
+    if node.tag == '{http://www.w3.org/2000/svg}text':
+      self._ConvertTextElement(
+          node, style_category, has_shadow, shader_map, output)
+      return
+
     if node.tag in ['{http://www.w3.org/2000/svg}g',
                     '{http://www.w3.org/2000/svg}svg']:
       self._ConvertGroupElement(
           node, style_category, has_shadow, shader_map, output)
       return
 
+    # Ignore following tags.
     if node.tag in ['{http://www.w3.org/2000/svg}linearGradient',
-                    '{http://www.w3.org/2000/svg}radialGradient']:
+                    '{http://www.w3.org/2000/svg}radialGradient',
+                    '{http://www.w3.org/2000/svg}metadata',
+                    '{http://www.w3.org/2000/svg}defs',]:
       return
 
-    logging.warning('Unknown element: %s', node.tag)
+    logging.critical('Unknown element: %s', node.tag)
+    sys.exit(1)
 
   def _OutputEOP(self, output):
     output.WriteByte(CMD_PICTURE_EOP)
@@ -899,21 +1056,22 @@
     return output.output.getvalue()
 
 
-def ConvertFiles(svg_dir, output_dir):
+def ConvertFiles(svg_paths, output_dir):
   """Converts SVG files into MechaMozc specific *pic* files.
 
   Args:
-    svg_dir: Path to a directory which has svg files (recursively).
+    svg_paths: Comma separated paths to a directory/zip which has svg files
+               (recursively).
     output_dir: Path of the destination directory.
   """
-  logging.debug('Start SVG conversion. From:%s, To:%s', svg_dir, output_dir)
+  logging.debug('Start SVG conversion. From:%s, To:%s', svg_paths, output_dir)
   # Ensure that the output directory exists.
   if not os.path.exists(output_dir):
     os.makedirs(output_dir)
 
   converter = MozcDrawableConverter()
   number_of_conversion = 0
-  for dirpath, dirnames, filenames in os.walk(svg_dir):
+  for dirpath, _, filenames in util.WalkFileContainers(svg_paths):
     for filename in filenames:
       basename, ext = os.path.splitext(filename)
       if ext != '.svg':
@@ -971,11 +1129,16 @@
 
 
 def ParseOptions():
+  """Parses options."""
   parser = optparse.OptionParser()
-  parser.add_option('--svg_dir', dest='svg_dir',
-                    help='Path to a directory containing .svg files.')
+  parser.add_option('--svg_paths', dest='svg_paths',
+                    help='Comma separated paths to a directory or'
+                    ' a .zip file containing .svg files.')
   parser.add_option('--output_dir', dest='output_dir',
                     help='Path to the output directory,')
+  parser.add_option('--build_log', dest='build_log',
+                    help='(Optional) Path to build log to generate.'
+                    ' If set, nothing will be sent to stderr.')
   parser.add_option('--verbose', '-v', dest='verbose',
                     action='store_true', default=False,
                     help='Shows verbose message.')
@@ -987,9 +1150,12 @@
   logging.getLogger().addFilter(util.ColoredLoggingFilter())
 
   options = ParseOptions()
-  if options.verbose:
+  if options.build_log:
+    logging.getLogger().handlers = []
+    logging.getLogger().addHandler(logging.FileHandler(options.build_log, 'w'))
+  if options.verbose or options.build_log:
     logging.getLogger().setLevel(logging.DEBUG)
-  ConvertFiles(options.svg_dir, options.output_dir)
+  ConvertFiles(options.svg_paths, options.output_dir)
 
 
 if __name__ == '__main__':
diff --git a/src/android/gen_subset_font.py b/src/android/gen_subset_font.py
new file mode 100644
index 0000000..67db258
--- /dev/null
+++ b/src/android/gen_subset_font.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Generates subset font.
+
+1. Corrects characters from .svg files in given directory.
+  Only text nodes in <text> element are taken into account.
+2. Make subset font which contains only the characters corrected above.
+"""
+
+import logging
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+from xml.etree import cElementTree as ElementTree
+
+from build_tools import util
+
+
+def ExtractCharactersFromSvgFile(svg_file):
+  result = set()
+  for text in ElementTree.parse(svg_file).findall(
+      './/{http://www.w3.org/2000/svg}text'):
+    if text.text:
+      result.update(tuple(text.text))  # Split into characters.
+  logging.debug('%s: %s', svg_file, result)
+  return result
+
+
+def ExtractCharactersFromDirectory(svg_paths):
+  result = set()
+  for dirpath, _, filenames in util.WalkFileContainers(svg_paths):
+    for filename in filenames:
+      if os.path.splitext(filename)[1] != '.svg':
+        # Do nothing for files other than svg.
+        continue
+      result.update(ExtractCharactersFromSvgFile(
+          os.path.join(dirpath, filename)))
+  return list(result)
+
+
+def MakeSubsetFont(fonttools_path, unicodes, input_font, output_font):
+  """Makes subset font using fontTools toolchain.
+
+  Args:
+    fonttools_path: Path to fontTools library.
+    unicodes: A list of unicode characters of which glyph should be in
+              the output.
+    input_font: Path to input font.
+    output_font: Path to output font.
+  """
+  if not unicodes:
+    # subset.py requires at least one unicode character.
+    logging.debug('No unicode character is specified. Use "A" as stub.')
+    unicodes = [u'A']
+
+  tempdir = tempfile.mkdtemp()
+  try:
+    # fontTools's output file name is fixed (input file path + '.subset').
+    # To get result with specified file name, copy the input font
+    # to temporary directory and copy the result with renaming.
+    shutil.copy(input_font, tempdir)
+    temp_input_font = os.path.join(tempdir, os.path.basename(input_font))
+    commands = ['python', os.path.join(fonttools_path, 'subset.py'),
+                temp_input_font]
+    commands.extend(['U+%08x' % ord(char) for char in unicodes])
+    env = os.environ.copy()
+    # In fontTools toolchain, "from fontTools import XXXX" is executed.
+    # In order for successfull import, add parent directory of the toolchain
+    # into PYTHONPATH.
+    env['PYTHONPATH'] += ':%s' % os.path.join(fonttools_path, '..')
+    if subprocess.call(commands, env=env) != 0:
+      sys.exit(1)
+    shutil.copyfile('%s.subset' % temp_input_font, output_font)
+  finally:
+    shutil.rmtree(tempdir)
+
+
+def ParseOptions():
+  """Parses options."""
+  parser = optparse.OptionParser()
+  parser.add_option('--svg_paths', dest='svg_paths',
+                    help='Comma separated paths to a directory or'
+                    ' a .zip file containing .svg files.')
+  parser.add_option('--input_font', dest='input_font',
+                    help='Path to the input font.')
+  parser.add_option('--output_font', dest='output_font',
+                    help='Path to the output font.')
+  parser.add_option('--fonttools_path', dest='fonttools_path',
+                    help='Path to fontTools toolchain.')
+  parser.add_option('--verbose', dest='verbose',
+                    help='Verbosity')
+  return parser.parse_args()[0]
+
+
+def main():
+  logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
+
+  options = ParseOptions()
+  if options.verbose:
+    logging.getLogger().setLevel(logging.DEBUG)
+  unicodes = ExtractCharactersFromDirectory(options.svg_paths)
+  MakeSubsetFont(options.fonttools_path, unicodes,
+                 options.input_font, options.output_font)
+
+
+if __name__ == '__main__':
+  main()
+
diff --git a/src/android/proguard-project.txt b/src/android/proguard-project.txt
index f401f16..26c35b4 100644
--- a/src/android/proguard-project.txt
+++ b/src/android/proguard-project.txt
@@ -54,6 +54,11 @@
     public static <methods>;
 }
 
+# Skin's fields are accessed by reflection.
+-keepclassmembers class org.mozc.android.inputmethod.japanese.view.Skin {
+    <fields>;
+}
+
 # Needed for Guava library.
 -libraryjars libs/jsr305.jar
 -dontwarn sun.misc.Unsafe
diff --git a/src/android/project.properties b/src/android/project.properties
index 8d01942..8cef1f3 100644
--- a/src/android/project.properties
+++ b/src/android/project.properties
@@ -30,7 +30,7 @@
 
 
 # Project target.
-target=android-19
+target=android-21
 
 # Location of the ProGuard configuration.
 proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
@@ -38,5 +38,5 @@
 # Library projects
 # 'resources' project must not be placed at the tail of reference definition.
 # Otherwise aapt command crashes.
-android.library.reference.1=static_resources/resources_oss
+android.library.reference.1=resources
 android.library.reference.2=protobuf
diff --git a/src/android/protobuf/project.properties b/src/android/protobuf/project.properties
index 9aacf2f..c3b6d82 100644
--- a/src/android/protobuf/project.properties
+++ b/src/android/protobuf/project.properties
@@ -39,4 +39,4 @@
 android.library=true
 
 # Project target.
-target=android-19
+target=android-21
diff --git a/src/android/resources/AndroidManifest.xml b/src/android/resources/AndroidManifest.xml
new file mode 100644
index 0000000..b060f87
--- /dev/null
+++ b/src/android/resources/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.mozc.android.inputmethod.japanese.resources">
+  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
+</manifest>
diff --git a/src/android/static_resources/resources_oss/ant.properties b/src/android/resources/ant.properties
similarity index 100%
rename from src/android/static_resources/resources_oss/ant.properties
rename to src/android/resources/ant.properties
diff --git a/src/android/static_resources/resources_oss/build.xml b/src/android/resources/build.xml
similarity index 100%
rename from src/android/static_resources/resources_oss/build.xml
rename to src/android/resources/build.xml
diff --git a/src/android/resources/proguard-project.txt b/src/android/resources/proguard-project.txt
new file mode 100644
index 0000000..5317df3
--- /dev/null
+++ b/src/android/resources/proguard-project.txt
@@ -0,0 +1,49 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/src/android/resources/project.properties b/src/android/resources/project.properties
new file mode 100644
index 0000000..613d5c2
--- /dev/null
+++ b/src/android/resources/project.properties
@@ -0,0 +1,44 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-21
+android.library=true
diff --git a/src/android/resources/resources.gyp b/src/android/resources/resources.gyp
new file mode 100644
index 0000000..fa6b0b9
--- /dev/null
+++ b/src/android/resources/resources.gyp
@@ -0,0 +1,304 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+{
+  'variables': {
+    'relative_dir': 'android/resources',
+    'abs_android_dir': '<(abs_depth)/<(relative_dir)',
+    # Actions with an existing input and non-existing output behave like
+    # phony rules.  Nothing matters for an input but its existence, so
+    # we use 'resources.gyp' as a dummy input since it must exist.
+    'dummy_input_file': 'resources.gyp',
+    # GYP's 'copies' rule cannot copy a whole directory recursively, so we use
+    # our own script to copy files.
+    'copy_file': ['python', '../../build_tools/copy_file.py'],
+    'shared_intermediate_mozc_dir': '<(SHARED_INTERMEDIATE_DIR)/',
+    'static_resources_dir': '<(abs_depth)/android/static_resources',
+    'sdk_resources_dir': '<(shared_intermediate_mozc_dir)/android/resources',
+  },
+  'conditions': [
+    ['branding=="GoogleJapaneseInput"', {
+      'conditions': [
+        ['android_hide_icon==1', {
+          'variables': {
+            'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_preinstall_bools.xml',
+          },
+        }, { # else
+          'variables': {
+            'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_standard_bools.xml',
+          },
+        }],
+        ['android_release_icon==1', {
+          'variables': {
+            'application_icon_dir': '<(static_resources_dir)/application_icon/release_icon/',
+          },
+        }, {  # else
+          'variables': {
+            'application_icon_dir': '<(static_resources_dir)/application_icon/dogfood_icon/',
+          },
+        }],
+      ],
+      'variables': {
+        'original_sdk_resources_dir': '<(static_resources_dir)/resources',
+      },
+    }, {  # 'branding!="GoogleJapaneseInput"'
+      'variables': {
+        'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_standard_bools.xml',
+        'original_sdk_resources_dir': '<(static_resources_dir)/resources_oss',
+        'application_icon_dir': '<(static_resources_dir)/application_icon/oss_icon/',
+      },
+    }],
+  ],
+  'targets': [
+    {
+      'target_name': 'resources',
+      'type': 'none',
+      'dependencies': [
+        'resources_project',
+      ],
+      'actions': [
+        {
+          'action_name': 'build_resources',
+          'inputs': [
+            'AndroidManifest.xml',
+            'build.xml',
+            'project.properties',
+            'ant.properties',
+            'proguard-project.txt',
+          ],
+          'outputs': [
+            'bin/classes.jar',
+            'gen/org/mozc/android/inputmethod/japanese/resources/R.java',
+          ],
+          'includes': ['../ant.gypi'],
+        },
+      ],
+    },
+    {
+      'target_name': 'resources_project',
+      'type': 'none',
+      'dependencies': [
+        'copy_resources',
+        'gen_kcm_data',
+        'gen_mozc_drawable',
+      ],
+    },
+    {
+      # Copies original resources to intermediate directory.
+      # Then make symbolic link from android/resources to the intermediate directory.
+      # The symbolic link is required to build both by ADT and ant.
+      'target_name': 'copy_resources',
+      'type': 'none',
+      'includes': ['../android_resources.gypi'],
+      'inputs': ['<@(android_resources)'],
+      'outputs': ['dummy_copy_resources'],
+      'actions': [
+        {
+          'action_name': 'copy_files',
+          'inputs': ['<@(android_resources)'],
+          'outputs': ['dummy_copy_files'],
+          'action': [
+            '<@(copy_file)', '-pr',
+            '<@(android_resources)',
+            '<(sdk_resources_dir)',
+            '--src_base', '<(original_sdk_resources_dir)',
+          ],
+        },
+        {
+          # Make sure the link of resources/res does not exist.
+          # the new link is created in the next step.
+          'action_name': 'remove_symbolic_link',
+          'inputs': [
+            'dummy_copy_files'
+          ],
+          'outputs': [
+            'dummy_remove_symbolic_link',
+          ],
+          'action': [
+            'rm', '-f', 'res',
+          ],
+        },
+        {
+          'action_name': 'make_symbolic_link',
+          'inputs': [
+            'dummy_remove_symbolic_link'
+          ],
+          'outputs': [
+            'dummy_make_symbolic_link',
+          ],
+          'action': [
+            'ln', '-r', '-s', '-f',
+            '<(sdk_resources_dir)/res',
+            'res',
+          ],
+        },
+        {
+          'action_name': 'copy_configuration_dependent_resources',
+          'inputs': [
+            'dummy_make_symbolic_link',
+          ],
+          'outputs': [
+            'dummy_copy_configuration_dependent_resources',
+          ],
+          'action': [
+            'ln', '-s', '-f',
+            '<(launcher_icon_bools)',
+            '<(sdk_resources_dir)/res/values/',
+          ],
+        },
+        {
+          'action_name': 'copy_application_icons',
+          'variables': {
+            'icon_files': [
+              '<(application_icon_dir)/drawable-hdpi/application_icon.png',
+              '<(application_icon_dir)/drawable-mdpi/application_icon.png',
+              '<(application_icon_dir)/drawable-xhdpi/application_icon.png',
+              '<(application_icon_dir)/drawable-xxhdpi/application_icon.png',
+              '<(application_icon_dir)/drawable-xxxhdpi/application_icon.png',
+            ],
+          },
+          'inputs': [
+            'dummy_make_symbolic_link',
+            '<@(icon_files)',
+          ],
+          'outputs': [
+            '<(sdk_resources_dir)/res/drawable-hdpi/application_icon.png',
+            '<(sdk_resources_dir)/res/drawable-mdpi/application_icon.png',
+            '<(sdk_resources_dir)/res/drawable-xhdpi/application_icon.png',
+            '<(sdk_resources_dir)/res/drawable-xxhdpi/application_icon.png',
+            '<(sdk_resources_dir)/res/drawable-xxxhdpi/application_icon.png',
+          ],
+          'action': ['<@(copy_file)', '-pr',
+                     '<@(icon_files)',
+                     '<(sdk_resources_dir)/res/',
+                     '--src_base', '<(application_icon_dir)'],
+        },
+      ],
+    },
+    {
+      'target_name': 'gen_kcm_data',
+      'type': 'none',
+      'dependencies': ['copy_resources'],
+      'copies': [{
+        'destination': '<(sdk_resources_dir)/res/raw',
+        'files': [
+          '../../data/android/keyboard_layout_japanese109a.kcm',
+        ],
+      }],
+    },
+    {
+      # This (and 'copy_asis_svg') tareget outputs single .zip file
+      # in order to make build system work correctly.
+      # Without this hack, all the names of the generated files
+      # should be listed up in 'inputs' and/or 'outputs' field.
+      'target_name': 'transform_template_svg',
+      'type': 'none',
+      'actions': [
+        {
+          'action_name': 'transform_template_svg',
+          'inputs': [
+            '../../data/images/android/template/transform.py',
+          ],
+          'outputs': [
+            '<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+          ],
+          'conditions': [
+            ['OS=="linux" or OS=="mac"', {
+              'inputs': ['<!@(ls -1 ../../data/images/android/template/*.svg)']
+            }, {
+              # TODO: Support Windows.
+              'inputs': ['<(dummy_input_file)']
+            }],
+          ],
+          'action': [
+            'python', '../../data/images/android/template/transform.py',
+            '--output_zip', '<@(_outputs)',
+          ],
+        },
+      ],
+    },
+    {
+      'target_name': 'copy_asis_svg',
+      'type': 'none',
+      'actions': [
+        {
+          'action_name': 'archive_asis_svg',
+          'outputs': [
+            '<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+          ],
+          'conditions': [
+            ['OS=="linux" or OS=="mac"', {
+              'inputs': ['<!@(ls -1 ../../data/images/android/svg/*.svg)']
+            }, {
+              # TODO: Support Windows.
+              'inputs': ['<(dummy_input_file)']
+            }],
+          ],
+          'action': [
+            # TODO: Support Windows.
+            'zip',
+            '-q',  # quiet operation
+            '-1',  # compress faster
+            '-j',  # don't record directory names
+            '<@(_outputs)',
+            '<@(_inputs)',
+          ],
+        },
+      ],
+    },
+    {
+      'target_name': 'gen_mozc_drawable',
+      'type': 'none',
+      'dependencies': [
+        'copy_asis_svg',
+        'transform_template_svg',
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_pic_files',
+          'inputs': [
+            '<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+            '<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+            '../gen_mozc_drawable.py',
+          ],
+          'outputs': [
+            '<(shared_intermediate_mozc_dir)/data/images/android/svg/gen_mozc_drawable.log',
+          ],
+          'dependencies': ['copy_resources'],
+          'action': [
+            'python', '../gen_mozc_drawable.py',
+            '--svg_paths=<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip,<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+            '--output_dir=<(sdk_resources_dir)/res/raw',
+            '--build_log=<(shared_intermediate_mozc_dir)/data/images/android/svg/gen_mozc_drawable.log',
+          ],
+        },
+      ],
+    },
+  ],
+}
diff --git a/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY b/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
index d16377a..cd74d4e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
@@ -32,7 +32,9 @@
 import org.mozc.android.inputmethod.japanese.MozcUtil.TelephonyManagerInterface;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil.PreferenceManagerStaticInterface;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory.LauncherIconManager;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -90,9 +92,6 @@
   @VisibleForTesting
   static final String PREF_LAUNCHED_AT_LEAST_ONCE = "pref_launched_at_least_once";
   @VisibleForTesting
-  static final String PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE =
-      "pref_last_launch_abi_independent_version_code";
-  @VisibleForTesting
   static final String PREF_WELCOME_ACTIVITY_SHOWN = "pref_welcome_activity_shown";
 
   private static class ApplicationInitializerImpl implements ApplicationInitializationStatus {
@@ -113,11 +112,13 @@
 
     @Override
     public Optional<Integer> getLastLaunchAbiIndependentVersionCode() {
-      if (!this.sharedPreferences.contains(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
+      if (!this.sharedPreferences.contains(
+          PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
         return Optional.absent();
       }
       return Optional.of(
-          this.sharedPreferences.getInt(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 0));
+          this.sharedPreferences.getInt(
+              PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 0));
     }
 
     @Override
@@ -149,10 +150,45 @@
       this.telephonyManager = Preconditions.checkNotNull(telephonyManager);
     }
 
-    public Optional<Intent> initialize(boolean omitWelcomeActivity,
+    /**
+     * Initializes the application.
+     *
+     * <p>Updates some preferences.
+     * Here we use three preference items.
+     * <ul>
+     * <li>pref_welcome_activity_shown: True if the "Welcome" activity has shown at least once.
+     * <li>pref_last_launch_abi_independent_version_code: The latest version number which
+     * has launched at least once.
+     * <li>pref_launched_at_least_once: Deprecated. True if the the IME has launched at least once.
+     * </ul>
+     * Some preferences should be set at the first time launch.
+     * If the IME is a system application (preinstalled), it shouldn't show "Welcome" activity.
+     * If an update is performed (meaning that the IME becomes non-system app),
+     * the activity should be shown at the first time launch.
+     *
+     * We have to do migration process.
+     * If pref_launched_at_least_once exists, pref_welcome_activity_shown is recognized as
+     * true and pref_last_launch_abi_independent_version_code is recognized as
+     * LAUNCHED_AT_LEAST_ONCE_DEPRECATED_VERSION_CODE. And then pref_launched_at_least_once is
+     * removed.
+     *
+     * @param isSystemApplication true if the app is a system application (== preinstall)
+     * @param isDevChannel true if the app is built for dev channel
+     * @param isWelcomeActivityPreferred true if the configuration prefers to shown welcome activity
+     *        if it's not been shown yet.
+     * @param abiIndependentVersionCode ABI independent version code, typically obtained
+     *        from {@link MozcUtil#getAbiIndependentVersionCode(Context)}
+     *
+     * @return if forwarding is needed Intent is returned. The caller side should invoke the Intent.
+     */
+    public Optional<Intent> initialize(boolean isSystemApplication,
                                        boolean isDevChannel,
                                        boolean isWelcomeActivityPreferred,
-                                       int abiIndependentVersionCode) {
+                                       int abiIndependentVersionCode,
+                                       LauncherIconManager launcherIconManager,
+                                       PreferenceManagerStaticInterface preferenceManager) {
+      Preconditions.checkNotNull(launcherIconManager);
+      Preconditions.checkNotNull(preferenceManager);
       SharedPreferences.Editor editor = sharedPreferences.edit();
       Resources resources = context.getResources();
       try {
@@ -175,27 +211,43 @@
         // Preferences: Update if this is the first launch
         if (!lastVersionCode.isPresent()) {
           // Store full-screen relating preferences.
+          DisplayMetrics portraitMetrics = getPortraitDisplayMetrics(
+              resources.getDisplayMetrics(), resources.getConfiguration().orientation);
           storeDefaultFullscreenMode(
-              sharedPreferences,
-              getPortraitDisplayMetrics(resources.getDisplayMetrics(),
-                                        resources.getConfiguration().orientation),
-              resources.getDimension(R.dimen.fullscreen_threshold),
-              resources.getDimension(R.dimen.ime_window_height_portrait),
-              resources.getDimension(R.dimen.ime_window_height_landscape));
+              sharedPreferences, portraitMetrics.heightPixels, portraitMetrics.widthPixels,
+              (int) Math.ceil(getDimensionForOrientation(
+                  resources, R.dimen.input_frame_height, Configuration.ORIENTATION_PORTRAIT)),
+              (int) Math.ceil(getDimensionForOrientation(
+                  resources, R.dimen.input_frame_height, Configuration.ORIENTATION_LANDSCAPE)),
+              resources.getDimensionPixelOffset(R.dimen.fullscreen_threshold));
 
           // Run emoji provider type detection, so that the detected provider will be
           // used as the default values of the preference activity.
           EmojiProviderType.maybeSetDetectedEmojiProviderType(
               sharedPreferences, telephonyManager);
         }
+        // Update launcher icon visibility and relating preference.
+        launcherIconManager.updateLauncherIconVisibility(context);
+        // Save default preference to the storage.
+        // NOTE: This method must NOT be called before updateLauncherIconVisibility() above.
+        //       Above method requires PREF_LAUNCHER_ICON_VISIBILITY_KEY is not filled with
+        //       the default value.
+        //       If PREF_LAUNCHER_ICON_VISIBILITY_KEY is filled prior to
+        //       updateLauncherIconVisibility(), the launcher icon will be unexpectedly shown
+        //       when 2.16.1955.3 (preinstall version) is overwritten by PlayStore version.
+        PreferenceUtil.setDefaultValues(
+            preferenceManager, context, MozcUtil.isDebug(context),
+            resources.getBoolean(R.bool.sending_information_features_enabled));
 
         if (isDevChannel) {
           // Usage Stats: Make pref_other_usage_stats_key enabled when dev channel.
           editor.putBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY, true);
+          maybeShowNotificationForDevChannel(abiIndependentVersionCode,
+              lastVersionCode);
         }
 
         // Welcome Activity
-        if (!isActivityShown && !omitWelcomeActivity && isWelcomeActivityPreferred) {
+        if (!isActivityShown && !isSystemApplication && isWelcomeActivityPreferred) {
           editor.putBoolean(PREF_WELCOME_ACTIVITY_SHOWN, true);
           Intent intent = new Intent(context, FirstTimeLaunchActivity.class);
           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -204,18 +256,21 @@
         return Optional.absent();
       } finally {
         editor.remove(PREF_LAUNCHED_AT_LEAST_ONCE);
-        editor.putInt(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, abiIndependentVersionCode);
+        editor.putInt(PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE,
+                      abiIndependentVersionCode);
         editor.commit();
       }
     }
 
+    private void maybeShowNotificationForDevChannel(
+        int abiIndependentVersionCode, Optional<Integer> lastVersionCode) {
+    }
+
     /**
      * Returns a modified {@code DisplayMetrics} which equals to portrait modes's one.
      *
      * If current orientation is PORTRAIT, given {@code currentMetrics} is returned.
      * Otherwise {@code currentMetrics}'s {@code heightPixels} and {@code widthPixels} are swapped.
-     *
-     * Package private for testing purpose.
      */
     @VisibleForTesting
     static DisplayMetrics getPortraitDisplayMetrics(DisplayMetrics currentMetrics,
@@ -232,27 +287,43 @@
     }
 
     /**
+     * Get a dimension for the specified orientation.
+     * This method may be heavy since it updates the {@code resources} twice.
+     */
+    @VisibleForTesting
+    static float getDimensionForOrientation(Resources resources, int id, int orientation) {
+      Configuration configuration = resources.getConfiguration();
+      if (configuration.orientation == orientation) {
+        return resources.getDimension(id);
+      }
+
+      Configuration originalConfiguration = new Configuration(resources.getConfiguration());
+      try {
+        configuration.orientation = orientation;
+        resources.updateConfiguration(configuration, null);
+        return resources.getDimension(id);
+      } finally {
+        resources.updateConfiguration(originalConfiguration, null);
+      }
+    }
+
+    /**
      * Stores the default value of "fullscreen mode" to the shared preference.
-     *
-     * Package private for testing purpose.
      */
     @VisibleForTesting
     static void storeDefaultFullscreenMode(
-        SharedPreferences sharedPreferences, DisplayMetrics displayMetrics,
-        float fullscreenThresholdInPixel,
-        float portraitImeHeightInPixel, float landscapeImeHeightInPixel) {
+        SharedPreferences sharedPreferences,
+        int portraitDisplayHeight, int landscapeDisplayHeight,
+        int portraitInputFrameHeight, int landscapeInputFrameHeight, int fullscreenThreshold) {
       Preconditions.checkNotNull(sharedPreferences);
-      Preconditions.checkNotNull(displayMetrics);
 
       SharedPreferences.Editor editor = sharedPreferences.edit();
       editor.putBoolean(
           "pref_portrait_fullscreen_key",
-          displayMetrics.heightPixels - portraitImeHeightInPixel
-              < fullscreenThresholdInPixel);
+          portraitDisplayHeight - portraitInputFrameHeight < fullscreenThreshold);
       editor.putBoolean(
           "pref_landscape_fullscreen_key",
-          displayMetrics.widthPixels - landscapeImeHeightInPixel
-              < fullscreenThresholdInPixel);
+          landscapeDisplayHeight - landscapeInputFrameHeight < fullscreenThreshold);
       editor.commit();
     }
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
index 74ceecd..8e3ac7f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
@@ -29,6 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import org.mozc.android.inputmethod.japanese.MozcView.InputFrameFoldButtonClickListener;
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
@@ -40,19 +41,22 @@
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
 import org.mozc.android.inputmethod.japanese.ui.ConversionCandidateLayouter;
+import org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView;
 import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
 import org.mozc.android.inputmethod.japanese.ui.SpanFactory;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.View;
 import android.view.animation.Animation;
-import android.widget.CompoundButton;
+import android.widget.LinearLayout;
 
 /**
  * The view to show candidates.
@@ -60,17 +64,13 @@
  */
 public class CandidateView extends InOutAnimatedFrameLayout implements MemoryManageable {
 
-  /**
-   * Adapter for conversion candidate selection.
-   */
+  /** Adapter for conversion candidate selection. */
+  @VisibleForTesting
   static class ConversionCandidateSelectListener implements CandidateSelectListener {
     private final ViewEventListener viewEventListener;
 
     ConversionCandidateSelectListener(ViewEventListener viewEventListener) {
-      if (viewEventListener == null) {
-        throw new NullPointerException("viewEventListener should be non-null.");
-      }
-      this.viewEventListener = viewEventListener;
+      this.viewEventListener = Preconditions.checkNotNull(viewEventListener);
     }
 
     @Override
@@ -80,7 +80,6 @@
     }
   }
 
-
   private class OutAnimationAdapter extends AnimationAdapter {
     @Override
     public void onAnimationEnd(Animation animation) {
@@ -94,6 +93,8 @@
     private static final String DESCRIPTION_DELIMITER = " \t\n\r\f";
 
     ScrollGuideView scrollGuideView = null;
+    InputFrameFoldButtonView inputFrameFoldButtonView = null;
+    @VisibleForTesting int foldButtonBackgroundVisibilityThreshold = 0;
 
     // TODO(hidehiko): Simplify the interface as this is needed just for expandSuggestion.
     private ViewEventListener viewEventListener;
@@ -104,7 +105,7 @@
     private boolean isExpanded = false;
 
     {
-      setBackgroundDrawableType(DrawableType.CANDIDATE_BACKGROUND);
+      setSpanBackgroundDrawableType(DrawableType.CANDIDATE_BACKGROUND);
       layouter = new ConversionCandidateLayouter();
     }
 
@@ -117,6 +118,7 @@
           resources.getInteger(R.integer.candidate_scroller_minimum_velocity));
     }
 
+    @VisibleForTesting
     void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
       Preconditions.checkArgument(candidateTextSize > 0);
       Preconditions.checkArgument(descriptionTextSize > 0);
@@ -130,7 +132,9 @@
           resources.getDimension(R.dimen.symbol_description_right_padding);
       float descriptionVerticalPadding =
           resources.getDimension(R.dimen.symbol_description_bottom_padding);
+      float separatorWidth = resources.getDimensionPixelSize(R.dimen.candidate_separator_width);
 
+      carrierEmojiRenderHelper.setCandidateTextSize(candidateTextSize);
       candidateLayoutRenderer.setValueTextSize(candidateTextSize);
       candidateLayoutRenderer.setValueHorizontalPadding(valueHorizontalPadding);
       candidateLayoutRenderer.setValueScalingPolicy(ValueScalingPolicy.HORIZONTAL);
@@ -138,6 +142,7 @@
       candidateLayoutRenderer.setDescriptionHorizontalPadding(descriptionHorizontalPadding);
       candidateLayoutRenderer.setDescriptionVerticalPadding(descriptionVerticalPadding);
       candidateLayoutRenderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.EXCLUSIVE);
+      candidateLayoutRenderer.setSeparatorWidth(separatorWidth);
 
       SpanFactory spanFactory = new SpanFactory();
       spanFactory.setValueTextSize(candidateTextSize);
@@ -160,6 +165,8 @@
       layouter.setValueHeight(candidateTextSize);
       layouter.setValueHorizontalPadding(valueHorizontalPadding);
       layouter.setValueVerticalPadding(valueVerticalPadding);
+
+      foldButtonBackgroundVisibilityThreshold = (int) (1.8 * valueVerticalPadding);
     }
 
     @Override
@@ -171,7 +178,9 @@
       this.viewEventListener = viewEventListener;
     }
 
+    @Override
     void reset() {
+      super.reset();
       isExpanded = false;
     }
 
@@ -179,6 +188,10 @@
     protected void onScrollChanged(int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
       super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY);
       updateScrollGuide();
+      if (inputFrameFoldButtonView != null) {
+        inputFrameFoldButtonView.showBackgroundForScrolled(
+            scrollY > foldButtonBackgroundVisibilityThreshold);
+      }
       expandSuggestionIfNeeded();
     }
 
@@ -228,6 +241,17 @@
       super.update(candidateList);
       updateScrollGuide();
     }
+
+    @Override
+    protected Drawable getViewBackgroundDrawable(Skin skin) {
+      return skin.conversionCandidateViewBackgroundDrawable;
+    }
+
+    @Override
+    public void setSkin(Skin skin) {
+      super.setSkin(skin);
+      candidateLayoutRenderer.setSeparatorColor(skin.candidateBackgroundSeparatorColor);
+    }
   }
 
   public CandidateView(Context context) {
@@ -250,32 +274,36 @@
     ConversionCandidateWordView conversionCandidateWordView = getConversionCandidateWordView();
     scrollGuideView.setScroller(conversionCandidateWordView.scroller);
     conversionCandidateWordView.scrollGuideView = scrollGuideView;
-
-    // Initialize inputFrameFoldButton.
-    CompoundButton inputFrameFoldButton = getInputFrameFoldButton();
-    inputFrameFoldButton.setBackgroundDrawable(
-        new MozcDrawableFactory(getResources()).getDrawable(R.raw.keyboard__fold__tab).orNull());
+    conversionCandidateWordView.inputFrameFoldButtonView = getInputFrameFoldButton();
+    // To use Canvas#drawPicture(), the view shouldn't be h/w accelerated.
+    getInputFrameFoldButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
 
     reset();
   }
 
-  CompoundButton getInputFrameFoldButton() {
-    return CompoundButton.class.cast(findViewById(R.id.input_frame_fold_button));
+  @VisibleForTesting InputFrameFoldButtonView getInputFrameFoldButton() {
+    return InputFrameFoldButtonView.class.cast(findViewById(R.id.input_frame_fold_button));
   }
 
-  ConversionCandidateWordView getConversionCandidateWordView() {
+  @VisibleForTesting ConversionCandidateWordView getConversionCandidateWordView() {
     return ConversionCandidateWordView.class.cast(findViewById(R.id.candidate_word_view));
   }
 
-  ScrollGuideView getScrollGuideView() {
+  private ConversionCandidateWordContainerView getConversionCandidateWordContainerView() {
+    return ConversionCandidateWordContainerView.class.cast(
+        findViewById(R.id.conversion_candidate_word_container_view));
+  }
+
+  @VisibleForTesting ScrollGuideView getScrollGuideView() {
     return ScrollGuideView.class.cast(findViewById(R.id.candidate_scroll_guide_view));
   }
 
-  /**
-   * Updates the view based on {@code Command}.
-   * Exposed as protected for testing purpose.
-   */
-  protected void update(Command outCommand) {
+  @VisibleForTesting LinearLayout getCandidateWordFrame() {
+    return LinearLayout.class.cast(findViewById(R.id.candidate_word_frame));
+  }
+
+  /** Updates the view based on {@code Command}. */
+  void update(Command outCommand) {
     if (outCommand == null) {
       getConversionCandidateWordView().update(null);
       return;
@@ -283,8 +311,8 @@
 
     Input input = outCommand.getInput();
     CandidateList allCandidateWords = outCommand.getOutput().getAllCandidateWords();
-    if (input.getType() == CommandType.SEND_COMMAND &&
-        input.getCommand().getType() == SessionCommand.CommandType.EXPAND_SUGGESTION) {
+    if (input.getType() == CommandType.SEND_COMMAND
+        && input.getCommand().getType() == SessionCommand.CommandType.EXPAND_SUGGESTION) {
       getConversionCandidateWordView().updateForExpandSuggestion(allCandidateWords);
     } else {
       getConversionCandidateWordView().update(allCandidateWords);
@@ -293,19 +321,18 @@
 
   /**
    * Register callback object.
-   * Note: exposed as a protected method for testing purpose.
    * @param listener
    */
-  protected void setViewEventListener(ViewEventListener listener,
-                                      OnClickListener inputFrameFoldButtonClickListner) {
-    if (listener == null) {
-      throw new NullPointerException("lister must be non-null.");
-    }
+  void setViewEventListener(ViewEventListener listener) {
+    Preconditions.checkNotNull(listener);
     ConversionCandidateWordView conversionCandidateWordView = getConversionCandidateWordView();
     conversionCandidateWordView.setViewEventListener(listener);
     conversionCandidateWordView.setCandidateSelectListener(
         new ConversionCandidateSelectListener(listener));
-    getInputFrameFoldButton().setOnClickListener(inputFrameFoldButtonClickListner);
+  }
+
+  void setInputFrameFoldButtonOnClickListener(InputFrameFoldButtonClickListener listener) {
+    getInputFrameFoldButton().setOnClickListener(Preconditions.checkNotNull(listener));
   }
 
   void reset() {
@@ -317,9 +344,14 @@
     getInputFrameFoldButton().setChecked(checked);
   }
 
-  void setSkinType(SkinType skinType) {
-    getScrollGuideView().setSkinType(skinType);
-    getConversionCandidateWordView().setSkinType(skinType);
+  @SuppressWarnings("deprecation")
+  void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    getScrollGuideView().setSkin(skin);
+    getConversionCandidateWordView().setSkin(skin);
+    getInputFrameFoldButton().setSkin(skin);
+    getCandidateWordFrame().setBackgroundColor(skin.candidateBackgroundBottomColor);
+    invalidate();
   }
 
   void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
@@ -328,12 +360,13 @@
 
     getConversionCandidateWordView().setCandidateTextDimension(candidateTextSize,
                                                                descriptionTextSize);
+    getConversionCandidateWordContainerView().setCandidateTextDimension(candidateTextSize);
   }
 
-  void setNarrowMode(boolean narrowMode) {
-    getInputFrameFoldButton().setVisibility(narrowMode ? GONE : VISIBLE);
+  void enableFoldButton(boolean enabled) {
+    getInputFrameFoldButton().setVisibility(enabled ? VISIBLE : GONE);
     getConversionCandidateWordView().getCandidateLayouter()
-        .reserveEmptySpanForInputFoldButton(!narrowMode);
+        .reserveEmptySpanForInputFoldButton(enabled);
   }
 
   @Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java
new file mode 100644
index 0000000..6b875f9
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java
@@ -0,0 +1,456 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.InOutAnimatedFrameLayout.VisibilityChangeListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.TranslateAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+
+/**
+ * Manages candidate views (floating, on-keyboard).
+ */
+class CandidateViewManager implements MemoryManageable {
+
+  /** Listener interface to handle the height change of a keyboard candidate view. */
+  public interface KeyboardCandidateViewHeightListener {
+    public void onExpanded();
+    public void onCollapse();
+  }
+
+  private static class ClearCandidateAnimationListener implements Animation.AnimationListener {
+    private final CandidateView candidateView;
+
+    public ClearCandidateAnimationListener(CandidateView candidateView) {
+      this.candidateView = Preconditions.checkNotNull(candidateView);
+    }
+
+    @Override
+    public void onAnimationEnd(Animation animation) {
+      candidateView.update(EMPTY_COMMAND);
+    }
+
+    @Override
+    public void onAnimationRepeat(Animation animation) {
+    }
+
+    @Override
+    public void onAnimationStart(Animation animation) {
+    }
+  }
+
+  /** {@link CandidateMode#FLOATING} is only available on Lollipop or later. */
+  private enum CandidateMode {
+    KEYBOARD, NUMBER, FLOATING,
+  }
+
+  private static final Animation NO_ANIMATION = new Animation() {};
+  @VisibleForTesting static final Command EMPTY_COMMAND = Command.getDefaultInstance();
+
+  @VisibleForTesting final CandidateView keyboardCandidateView;
+  @VisibleForTesting final FloatingCandidateView floatingCandidateView;
+  /**
+   * SymbolInputView which number candidate view belongs to is created lazily.
+   * Therefore number candidate view is not accessible when CandidateViewManager is instantiated.
+   */
+  @VisibleForTesting Optional<CandidateView> numberCandidateView = Optional.absent();
+
+  private Optional<KeyboardCandidateViewHeightListener> keyboardCandidateViewHeightListener =
+      Optional.absent();
+  /**
+   * Current active candidate view.
+   * {@link CandidateMode#FLOATING} is only available on Lollipop or later.
+   */
+  private CandidateMode candidateMode = CandidateMode.KEYBOARD;
+
+  /** Cache of {@link EditorInfo} instance to switch candidate views. */
+  private EditorInfo editorInfo = new EditorInfo();
+  /** Cache of {@link Skin} instance to switch candidate views. */
+  private Skin skin = Skin.getFallbackInstance();
+  /** Cache of candidate text size. */
+  private float candidateTextSize;
+  /** Cache of description text size. */
+  private float descriptionTextSize;
+  /** Cache of {@link ViewEventListener}. */
+  private Optional<ViewEventListener> viewEventListener = Optional.absent();
+  /** Cache of {@link VisibilityChangeListener}. */
+  private Optional<VisibilityChangeListener> onVisibilityChangeListener = Optional.absent();
+  /**
+   * True if extracted mode (== fullscreen mode) is activated.
+   * <p>
+   * On extracted mode, floating candidate should be disabled in order to show extracted view
+   * in the screen.
+   */
+  private boolean isExtractedMode = false;
+  private boolean allowFloatingMode = false;
+  private boolean narrowMode = false;
+
+  /**
+   * Cache of {@link CursorAnchorInfo} instance to switch candidate views.
+   * This field is null if and only-if Floating candidate view is NOT available, so we don't mark
+   * this value as {code @Nullable} since this field should NOT be used in that situation.
+   */
+  private CursorAnchorInfo cursorAnchorInfo;
+
+  private Animation numberCandidateViewInAnimation = NO_ANIMATION;
+  private Animation numberCandidateViewOutAnimation = NO_ANIMATION;
+
+  @SuppressLint("NewApi")
+  public CandidateViewManager(
+      CandidateView keyboardCandidateView, FloatingCandidateView floatingCandidateView) {
+    this.keyboardCandidateView = Preconditions.checkNotNull(keyboardCandidateView);
+    this.floatingCandidateView = Preconditions.checkNotNull(floatingCandidateView);
+    if (FloatingCandidateView.isAvailable()) {
+      cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+    }
+
+    keyboardCandidateView.setOutAnimationListener(
+        new ClearCandidateAnimationListener(keyboardCandidateView));
+  }
+
+  public void setNumberCandidateView(CandidateView numberCandidateView) {
+    this.numberCandidateView = Optional.of(numberCandidateView);
+    numberCandidateView.setSkin(skin);
+    numberCandidateView.enableFoldButton(true);
+    numberCandidateView.setInAnimation(numberCandidateViewInAnimation);
+    numberCandidateView.setOutAnimation(numberCandidateViewOutAnimation);
+    numberCandidateView.setOutAnimationListener(
+        new ClearCandidateAnimationListener(numberCandidateView));
+    if (candidateTextSize > 0 && descriptionTextSize > 0) {
+      numberCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+    }
+    if (viewEventListener.isPresent()) {
+      numberCandidateView.setViewEventListener(viewEventListener.get());
+    }
+    numberCandidateView.setOnVisibilityChangeListener(onVisibilityChangeListener.orNull());
+  }
+
+  /**
+   * Updates the candidate views by {@code outCommand} and may invoke some animations.
+   * <p>
+   * On-keyboard candidate view may animate and the animation listener may be invoked.
+   */
+  public void update(Command outCommand) {
+    updateInternal(Preconditions.checkNotNull(outCommand), true);
+  }
+
+  private void updateWithoutAnimation(Command outCommand) {
+    updateInternal(outCommand, false);
+  }
+
+  private void updateInternal(Command outCommand, boolean withAnimation) {
+    if (candidateMode == CandidateMode.FLOATING) {
+      floatingCandidateView.setCandidates(outCommand);
+      return;
+    }
+
+    Preconditions.checkState(
+        candidateMode == CandidateMode.KEYBOARD
+        || (candidateMode == CandidateMode.NUMBER && numberCandidateView.isPresent()));
+    CandidateView candidateView = (candidateMode == CandidateMode.KEYBOARD)
+        ? keyboardCandidateView : numberCandidateView.get();
+
+    if (withAnimation) {
+      if (hasCandidates(outCommand)) {
+        candidateView.update(outCommand);
+        // Call CandidateView#update only if there are some candidates in the output.
+        // In such case the candidate view will clear its canvas.
+        startKeyboardCandidateViewInAnimation();
+      } else {
+        // We don't call update method here and clear candidates at the end of this animation,
+        // because it will clear the view's contents during the animation.
+        startKeyboardCandidateViewOutAnimation();
+      }
+    } else {
+      candidateView.update(outCommand);
+      if (hasCandidates(outCommand)) {
+        candidateView.setVisibility(View.VISIBLE);
+      } else {
+        candidateView.setVisibility(View.GONE);
+      }
+    }
+  }
+
+  public void setOnVisibilityChangeListener(Optional<VisibilityChangeListener> listener) {
+    this.onVisibilityChangeListener = Preconditions.checkNotNull(listener);
+    keyboardCandidateView.setOnVisibilityChangeListener(listener.orNull());
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().setOnVisibilityChangeListener(listener.orNull());
+    }
+  }
+
+  /**
+   * Enables/Disables a floating candidate view.
+   * <p>
+   * This method turned floating mode on if it is preferred.
+   * The floating candidate view is only available on Lollipop or later.
+   */
+  private void updateCandiadateWindowActivation() {
+    boolean floatingMode = narrowMode && allowFloatingMode && !isExtractedMode;
+    if (floatingMode == (candidateMode == CandidateMode.FLOATING)) {
+      return;
+    }
+
+    // Clears candidates on the current candidate window.
+    updateWithoutAnimation(EMPTY_COMMAND);
+
+    // Updates the other candidate view.
+    candidateMode = floatingMode ? CandidateMode.FLOATING : CandidateMode.KEYBOARD;
+    updateWithoutAnimation(EMPTY_COMMAND);
+    setEditorInfo(editorInfo);
+    if (FloatingCandidateView.isAvailable()) {
+      setCursorAnchorInfo(cursorAnchorInfo);
+    }
+    // In order to show extracted view correctly, make the visibility GONE when it is not activated.
+    floatingCandidateView.setVisibility(floatingMode ? View.VISIBLE : View.GONE);
+  }
+
+  public void setAllowFloatingMode(boolean allowFloatingMode) {
+    Preconditions.checkArgument(!allowFloatingMode || FloatingCandidateView.isAvailable());
+    this.allowFloatingMode = allowFloatingMode;
+    updateCandiadateWindowActivation();
+  }
+
+  public void setNarrowMode(boolean narrowMode) {
+    this.narrowMode = narrowMode;
+    keyboardCandidateView.enableFoldButton(!narrowMode);
+    updateCandiadateWindowActivation();
+  }
+
+  public void setNumberMode(boolean numberMode) {
+    CandidateMode nextMode = numberMode ? CandidateMode.NUMBER : CandidateMode.KEYBOARD;
+    if (candidateMode == nextMode) {
+      return;
+    }
+    if (nextMode == CandidateMode.NUMBER) {
+      // Hide keyboard candidate view since it is higher than symbol view.
+      updateWithoutAnimation(EMPTY_COMMAND);
+    }
+    candidateMode = nextMode;
+    // Set empty command in order to clear the candidates which have been registered into the next
+    // view. Otherwise such candidates (typically they are obsolete) are shown unexpectedly.
+    // TODO(hsumita): Revisit when Mozc server returns candidates for SWITCH_INPUT_MODE command.
+    updateWithoutAnimation(EMPTY_COMMAND);
+  }
+
+  public void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
+    this.candidateTextSize = candidateTextSize;
+    this.descriptionTextSize = descriptionTextSize;
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().setCandidateTextDimension(
+          candidateTextSize, descriptionTextSize);
+    } else {
+      keyboardCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+    }
+  }
+
+  public void setInputFrameFoldButtonChecked(boolean isChecked) {
+    switch (candidateMode) {
+      case KEYBOARD:
+        keyboardCandidateView.setInputFrameFoldButtonChecked(isChecked);
+        break;
+      case NUMBER:
+        numberCandidateView.get().setInputFrameFoldButtonChecked(isChecked);
+        break;
+      case FLOATING:
+        throw new IllegalStateException("Fold button is not available on floating mode.");
+    }
+  }
+
+  public void setEditorInfo(EditorInfo info) {
+    this.editorInfo = Preconditions.checkNotNull(info);
+    if (candidateMode == CandidateMode.FLOATING) {
+      floatingCandidateView.setEditorInfo(info);
+    }
+  }
+
+  @TargetApi(21)
+  public void setCursorAnchorInfo(CursorAnchorInfo info) {
+    this.cursorAnchorInfo = Preconditions.checkNotNull(info);
+    if (candidateMode == CandidateMode.FLOATING) {
+      floatingCandidateView.setCursorAnchorInfo(info);
+    }
+  }
+
+  public void setSkin(Skin skin) {
+    this.skin = Preconditions.checkNotNull(skin);
+    keyboardCandidateView.setSkin(skin);
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().setSkin(skin);
+    }
+  }
+
+  public void setEventListener(ViewEventListener viewEventListener,
+                               KeyboardCandidateViewHeightListener hightListener) {
+    this.viewEventListener = Optional.of(viewEventListener);
+    this.keyboardCandidateViewHeightListener = Optional.of(hightListener);
+    keyboardCandidateView.setViewEventListener(viewEventListener);
+    floatingCandidateView.setViewEventListener(viewEventListener);
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().setViewEventListener(viewEventListener);
+    }
+  }
+
+  /**
+   * Set true if extracted mode (== fullscreen mode) is activated.
+   */
+  public void setExtractedMode(boolean isExtractedMode) {
+    this.isExtractedMode = isExtractedMode;
+    updateCandiadateWindowActivation();
+  }
+
+  public void setHardwareCompositionMode(CompositionMode mode) {
+    if (isFloatingMode()) {
+      floatingCandidateView.setCompositionMode(mode);
+    }
+  }
+
+  public void reset() {
+    keyboardCandidateView.clearAnimation();
+    keyboardCandidateView.setVisibility(View.GONE);
+    keyboardCandidateView.reset();
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().clearAnimation();
+      numberCandidateView.get().setVisibility(View.GONE);
+      numberCandidateView.get().reset();
+    }
+
+    candidateMode = CandidateMode.KEYBOARD;
+    floatingCandidateView.setVisibility(View.GONE);
+  }
+
+  public void resetHeightDependingComponents(
+      Resources resources, int windowHeight, int inputFrameHeight) {
+    Preconditions.checkNotNull(resources);
+
+    int keyboardCandidateViewHeight = windowHeight - inputFrameHeight;
+    long duration = resources.getInteger(R.integer.candidate_frame_transition_duration);
+    float fromAlpha = 0.0f;
+    float toAlpha = 1.0f;
+
+    keyboardCandidateView.setInAnimation(createKeyboardCandidateViewTransitionAnimation(
+        keyboardCandidateViewHeight, 0, fromAlpha, toAlpha, duration));
+    keyboardCandidateView.setOutAnimation(createKeyboardCandidateViewTransitionAnimation(
+        0, keyboardCandidateViewHeight, toAlpha, fromAlpha, duration));
+
+    int numberCandidateViewHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
+    numberCandidateViewInAnimation = createKeyboardCandidateViewTransitionAnimation(
+        numberCandidateViewHeight, 0, fromAlpha, toAlpha, duration);
+    numberCandidateViewOutAnimation = createKeyboardCandidateViewTransitionAnimation(
+        0, numberCandidateViewHeight, toAlpha, fromAlpha, duration);
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().setInAnimation(numberCandidateViewInAnimation);
+      numberCandidateView.get().setOutAnimation(numberCandidateViewOutAnimation);
+    }
+  }
+
+  public boolean isKeyboardCandidateViewVisible() {
+    return keyboardCandidateView.getVisibility() == View.VISIBLE;
+  }
+
+  private static Animation createKeyboardCandidateViewTransitionAnimation(
+      int fromY, int toY, float fromAlpha, float toAlpha, long duration) {
+    AnimationSet animation = new AnimationSet(false);
+    animation.setDuration(duration);
+
+    AlphaAnimation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
+    alphaAnimation.setDuration(duration);
+    animation.addAnimation(alphaAnimation);
+
+    TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, fromY, toY);
+    translateAnimation.setInterpolator(new DecelerateInterpolator());
+    translateAnimation.setDuration(duration);
+    animation.addAnimation(translateAnimation);
+    return animation;
+  }
+
+  private void startKeyboardCandidateViewInAnimation() {
+    switch (candidateMode) {
+      case KEYBOARD:
+        keyboardCandidateView.startInAnimation();
+        if (keyboardCandidateViewHeightListener.isPresent()) {
+          keyboardCandidateViewHeightListener.get().onExpanded();
+        }
+        break;
+      case NUMBER:
+        numberCandidateView.get().startInAnimation();
+        break;
+      case FLOATING:
+        throw new IllegalStateException("Floating mode doesn't support in-animation.");
+    }
+  }
+
+  private void startKeyboardCandidateViewOutAnimation() {
+    switch (candidateMode) {
+      case KEYBOARD:
+        if (keyboardCandidateViewHeightListener.isPresent()) {
+          keyboardCandidateViewHeightListener.get().onCollapse();
+        }
+        keyboardCandidateView.startOutAnimation();
+        break;
+      case NUMBER:
+        numberCandidateView.get().startOutAnimation();
+        break;
+      case FLOATING:
+        throw new IllegalStateException("Floating mode doesn't support out-animation.");
+    }
+  }
+
+  private static boolean hasCandidates(Command command) {
+    return command.getOutput().getAllCandidateWords().getCandidatesCount() > 0;
+  }
+
+  @Override
+  public void trimMemory() {
+    keyboardCandidateView.trimMemory();
+    if (numberCandidateView.isPresent()) {
+      numberCandidateView.get().trimMemory();
+    }
+  }
+
+  public boolean isFloatingMode() {
+    return candidateMode == CandidateMode.FLOATING;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
index d456b99..f9ff8be 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
@@ -42,23 +42,23 @@
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
 import org.mozc.android.inputmethod.japanese.ui.SnapScroller;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
 import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
 import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.EdgeEffectCompat;
 import android.util.AttributeSet;
 import android.view.GestureDetector;
 import android.view.GestureDetector.SimpleOnGestureListener;
 import android.view.MotionEvent;
 import android.view.View;
+import android.widget.EdgeEffect;
 
 import javax.annotation.Nullable;
 
@@ -73,14 +73,16 @@
    * Handles gestures to scroll candidate list and choose a candidate.
    */
   class CandidateWordGestureDetector {
+
     class CandidateWordViewGestureListener extends SimpleOnGestureListener {
+
       @Override
       public boolean onFling(
           MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
         float velocity = orientationTrait.projectVector(velocityX, velocityY);
         // As fling is started, current action is not tapping.
         // Reset pressing state so that candidate selection is not triggered at touch up event.
-        releaseCandidate();
+        reset();
         // Fling makes scrolling.
         scroller.fling(-(int) velocity);
         invalidate();
@@ -96,7 +98,7 @@
         orientationTrait.scrollTo(CandidateWordView.this, scroller.getScrollPosition());
         // As scroll is started, current action is not tapping.
         // Reset pressing state so that candidate selection is not triggered at touch up event.
-        releaseCandidate();
+        reset();
 
         // Edge effect. Now, in production, we only support vertical scroll.
         if (oldScrollPosition + distance < 0) {
@@ -119,7 +121,7 @@
     // GestureDetector cannot handle all complex gestures which we need.
     // But we use GestureDetector for some gesture recognition
     // because implementing whole gesture detection logic by ourselves is a bit tedious.
-    final GestureDetector gestureDetector;
+    private final GestureDetector gestureDetector;
 
     /**
      * Points to an instance of currently pressed candidate word. Or {@code null} if any
@@ -146,9 +148,10 @@
                         span.getRight(), row.getTop() + row.getHeight());
     }
 
-    private void releaseCandidate() {
+    void reset() {
       pressedCandidate = null;
       pressedRowIndex = Optional.absent();
+      // NOTE: candidateRect doesn't need reset.
     }
 
     CandidateWord getPressedCandidate() {
@@ -195,6 +198,14 @@
     }
 
     boolean onTouchEvent(MotionEvent event) {
+      // Before delegation to gesture detector, handle ACTION_UP event
+      // in order to release edge effect.
+      if (event.getAction() == MotionEvent.ACTION_UP) {
+        topEdgeEffect.onRelease();
+        bottomEdgeEffect.onRelease();
+        invalidate();
+      }
+
       if (gestureDetector.onTouchEvent(event)) {
         return true;
       }
@@ -207,23 +218,25 @@
           scroller.stopScrolling();
           if (!topEdgeEffect.isFinished()) {
             topEdgeEffect.onRelease();
+            invalidate();
           }
           if (!bottomEdgeEffect.isFinished()) {
             bottomEdgeEffect.onRelease();
+            invalidate();
           }
           return true;
         case MotionEvent.ACTION_MOVE:
           if (pressedCandidate != null) {
             // Turn off highlighting if contact point gets out of the candidate.
             if (!candidateRect.contains(scrolledX, scrolledY)) {
-              releaseCandidate();
+              reset();
               invalidate();
             }
           }
           return true;
         case MotionEvent.ACTION_CANCEL:
           if (pressedCandidate != null) {
-            releaseCandidate();
+            reset();
             invalidate();
           }
           return true;
@@ -232,7 +245,7 @@
             if (candidateRect.contains(scrolledX, scrolledY) && candidateSelectListener != null) {
               candidateSelectListener.onCandidateSelected(pressedCandidate, pressedRowIndex);
             }
-            releaseCandidate();
+            reset();
             invalidate();
           }
           return true;
@@ -346,8 +359,8 @@
 
   // Finally, we only need vertical scrolling.
   // TODO(hidehiko): Remove horizontal scrolling related codes.
-  private final EdgeEffectCompat topEdgeEffect = new EdgeEffectCompat(getContext());
-  private final EdgeEffectCompat bottomEdgeEffect = new EdgeEffectCompat(getContext());
+  private final EdgeEffect topEdgeEffect = new EdgeEffect(getContext());
+  private final EdgeEffect bottomEdgeEffect = new EdgeEffect(getContext());
 
   // The Scroller which manages the status of scrolling the view.
   // Default behavior of ScrollView does not suffice our UX design
@@ -367,8 +380,10 @@
   // No padding by default.
   private int horizontalPadding = 0;
 
+  protected final CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+      new CarrierEmojiRenderHelper(this);
   protected final CandidateLayoutRenderer candidateLayoutRenderer =
-      new CandidateLayoutRenderer(this);
+      new CandidateLayoutRenderer();
 
   CandidateWordGestureDetector candidateWordGestureDetector =
       new CandidateWordGestureDetector(getContext());
@@ -377,7 +392,7 @@
   private final OrientationTrait orientationTrait;
 
   protected final BackgroundDrawableFactory backgroundDrawableFactory =
-      new BackgroundDrawableFactory(getResources().getDisplayMetrics().density);
+      new BackgroundDrawableFactory(getResources());
   private DrawableType backgroundDrawableType = null;
 
   private final CandidateWindowAccessibilityDelegate accessibilityDelegate;
@@ -404,6 +419,12 @@
     ViewCompat.setAccessibilityDelegate(this, accessibilityDelegate);
   }
 
+  void reset() {
+    calculatedLayout = null;
+    currentCandidateList = null;
+    candidateWordGestureDetector.reset();
+  }
+
   void setCandidateSelectListener(CandidateSelectListener candidateSelectListener) {
     this.candidateSelectListener = candidateSelectListener;
   }
@@ -436,19 +457,18 @@
   @Override
   protected void onAttachedToWindow() {
     super.onAttachedToWindow();
-    candidateLayoutRenderer.onAttachedToWindow();
+    carrierEmojiRenderHelper.onAttachedToWindow();
   }
 
   @Override
   protected void onDetachedFromWindow() {
-    candidateLayoutRenderer.onDetachedFromWindow();
+    carrierEmojiRenderHelper.onDetachedFromWindow();
     super.onDetachedFromWindow();
   }
 
   public void setEmojiProviderType(EmojiProviderType providerType) {
     Preconditions.checkNotNull(providerType);
-
-    candidateLayoutRenderer.setEmojiProviderType(providerType);
+    carrierEmojiRenderHelper.setEmojiProviderType(providerType);
   }
 
   @Override
@@ -506,7 +526,8 @@
       CandidateWord pressedCandidate = candidateWordGestureDetector.getPressedCandidate();
       int pressedCandidateIndex = (pressedCandidate != null && pressedCandidate.hasIndex())
           ? pressedCandidate.getIndex() : -1;
-      candidateLayoutRenderer.drawCandidateLayout(canvas, calculatedLayout, pressedCandidateIndex);
+      candidateLayoutRenderer.drawCandidateLayout(
+          canvas, calculatedLayout, pressedCandidateIndex, carrierEmojiRenderHelper);
     } finally {
       canvas.restoreToCount(saveCount);
     }
@@ -525,11 +546,13 @@
           topEdgeEffect.onAbsorb(velocity.intValue());
           if (!bottomEdgeEffect.isFinished()) {
             bottomEdgeEffect.onRelease();
+            invalidate();
           }
         } else if (velocity > 0) {
           bottomEdgeEffect.onAbsorb(velocity.intValue());
           if (!topEdgeEffect.isFinished()) {
             topEdgeEffect.onRelease();
+            invalidate();
           }
         }
       }
@@ -586,7 +609,9 @@
   void update(CandidateList candidateList) {
     CandidateList previousCandidateList = currentCandidateList;
     currentCandidateList = candidateList;
-    candidateLayoutRenderer.setCandidateList(Optional.fromNullable(candidateList));
+    Optional<CandidateList> optionalCandidateList = Optional.fromNullable(candidateList);
+    candidateLayoutRenderer.setCandidateList(optionalCandidateList);
+    carrierEmojiRenderHelper.setCandidateList(optionalCandidateList);
     if (layouter != null && !equals(candidateList, previousCandidateList)) {
       updateCalculatedLayout();
     }
@@ -655,32 +680,29 @@
     return currentCandidateList;
   }
 
-  /**
-   * Utility method for creating paint instance.
-   */
-  protected static Paint createPaint(
-      boolean antiAlias, int color, Align textAlign, float textSize) {
-    Paint paint = new Paint();
-    paint.setAntiAlias(antiAlias);
-    paint.setColor(color);
-    paint.setTextAlign(textAlign);
-    paint.setTextSize(textSize);
-    return paint;
-  }
-
-  protected void setBackgroundDrawableType(DrawableType drawableType) {
+  protected void setSpanBackgroundDrawableType(DrawableType drawableType) {
     backgroundDrawableType = drawableType;
-    resetBackground();
+    resetSpanBackground();
   }
 
-  private void resetBackground() {
-    candidateLayoutRenderer.setSpanBackgroundDrawable(
-        Optional.fromNullable(backgroundDrawableFactory.getDrawable(backgroundDrawableType)));
+  private void resetSpanBackground() {
+    Drawable drawable = (backgroundDrawableType != null)
+        ? backgroundDrawableFactory.getDrawable(backgroundDrawableType) : null;
+    candidateLayoutRenderer.setSpanBackgroundDrawable(Optional.fromNullable(drawable));
   }
 
-  void setSkinType(SkinType skinType) {
-    backgroundDrawableFactory.setSkinType(skinType);
-    resetBackground();
+  /**
+   * Returns a Drawable which should be set as the view's background.
+   */
+  protected abstract Drawable getViewBackgroundDrawable(Skin skin);
+
+  @SuppressWarnings("deprecation")
+  void setSkin(Skin skin) {
+    backgroundDrawableFactory.setSkin(Preconditions.checkNotNull(skin));
+    resetSpanBackground();
+    candidateLayoutRenderer.setSkin(skin);
+    setBackgroundDrawable(
+        getViewBackgroundDrawable(skin).getConstantState().newDrawable());
   }
 
   @Override
@@ -697,4 +719,15 @@
     }
     return false;
   }
+
+  @Override
+  protected void onVisibilityChanged(View changedView, int visibility) {
+    super.onVisibilityChanged(changedView, visibility);
+    // If this view gets invisible, reset the internal state of the gesture detector.
+    // Otherwise UP event, which is sent after this view being invisible, will cause
+    // unexpected onCandidateSelected callback.
+    if (visibility != View.VISIBLE) {
+      candidateWordGestureDetector.reset();
+    }
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java b/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
index 5325745..4a1e04d 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
@@ -194,4 +194,9 @@
     }
     return new ComposingTextTrackingInputConnection(baseConnection);
   }
+
+  @Override
+  public boolean requestCursorUpdates(int cursorUpdateMode) {
+    return baseConnection.requestCursorUpdates(cursorUpdateMode);
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java b/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
index 1c88a74..6507095 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
@@ -78,8 +78,7 @@
   void setCandidateTextDimension(float candidateTextSize) {
     Preconditions.checkArgument(candidateTextSize > 0);
 
-    foldingIconSize = candidateTextSize
-        + getResources().getDimension(R.dimen.candidate_vertical_padding_size) * 2;
+    foldingIconSize = getResources().getDimension(R.dimen.candidate_fold_icon_width);
   }
 
   @Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java b/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
index 8880954..38c25e4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
@@ -52,6 +52,7 @@
  */
 public class DependencyFactory {
 
+
   /**
    * Dependencies.
    */
diff --git a/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java b/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
index 50d5ff0..98a76e4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
@@ -53,11 +53,35 @@
     /**
      * Fired when the input view is expanded (the candidate view is fold).
      */
-    INPUTVIEW_EXPAND(true),
+    INPUTVIEW_EXPAND(true, AudioManager.FX_KEYPRESS_STANDARD),
     /**
      * Fired when the input view is fold (the candidate view is expand).
      */
-    INPUTVIEW_FOLD(true),
+    INPUTVIEW_FOLD(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when the symbol input view is closed.
+     */
+    SYMBOL_INPUTVIEW_CLOSED(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when a minor category is selected.
+     */
+    SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when a major category is selected.
+     */
+    SYMBOL_INPUTVIEW_MAJOR_CATEGORY_SELECTED(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when microphone button is touched.
+     */
+    MICROPHONE_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when the hardware composition button in narrow frame is touched.
+     */
+    NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
+    /**
+     * Fired when the widen button in narrow frame is touched.
+     */
+    NARROW_FRAME_WIDEN_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
     ;
     // Constant value to indicate no sound feedback should be played.
     static final int NO_SOUND = -1;
@@ -103,7 +127,7 @@
   private boolean isHapticFeedbackEnabled;
   private long hapticFeedbackDuration = 30;  // 30ms by default.
   private boolean isSoundFeedbackEnabled;
-  private float soundFeedbackVolume = 0.1f;  // System default volume parameter.
+  private float soundFeedbackVolume = 0.4f;  // System default volume parameter.
   @VisibleForTesting final FeedbackListener feedbackListener;
 
   /**
diff --git a/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java b/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java
new file mode 100644
index 0000000..97048db
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java
@@ -0,0 +1,550 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
+import org.mozc.android.inputmethod.japanese.ui.FloatingCandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.FloatingModeIndicator;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.text.InputType;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+import android.widget.PopupWindow;
+
+/**
+ * Floating candidate view for hardware keyboard.
+ */
+@TargetApi(21)
+public class FloatingCandidateView extends View {
+
+  private interface FloatingCandidateViewProxy {
+    public void draw(Canvas canvas);
+    public void viewSizeChanged(int width, int height);
+    public void setCursorAnchorInfo(CursorAnchorInfo info);
+    public void setCandidates(Command outCommand);
+    public void setEditorInfo(EditorInfo editorInfo);
+    public void setCompositionMode(CompositionMode mode);
+    public void setViewEventListener(ViewEventListener listener);
+    public void setVisibility(int visibility);
+    public Optional<Rect> getVisibleRect();
+  }
+
+  private static class FloatingCandidateViewStub implements FloatingCandidateViewProxy {
+    @Override
+    public void draw(Canvas canvas) {}
+
+    @Override
+    public void viewSizeChanged(int width, int height) {}
+
+    @Override
+    public void setCursorAnchorInfo(CursorAnchorInfo info) {}
+
+    @Override
+    public void setCandidates(Command outCommand) {}
+
+    @Override
+    public void setEditorInfo(EditorInfo editorInfo) {}
+
+    @Override
+    public void setCompositionMode(CompositionMode mode) {}
+
+    @Override
+    public void setViewEventListener(ViewEventListener listener) {}
+
+    @Override
+    public void setVisibility(int visibility) {}
+
+    @Override
+    public Optional<Rect> getVisibleRect() {
+      return Optional.absent();
+    }
+  }
+
+  @TargetApi(21)
+  private static class FloatingCandidateViewImpl implements FloatingCandidateViewProxy {
+
+    private final View parentView;
+
+    /** Layouts the floating candidate window and draws it's contents. */
+    private final FloatingCandidateLayoutRenderer layoutRenderer;
+
+    private final FloatingModeIndicator modeIndicator;
+
+    /**
+     * Pop-up window to handle touch events.
+     * <p>
+     * A touch down event on outside a touchable region (set by {@link MozcService#onComputeInsets})
+     * cannot be caught by view, and we cannot expand the touchable region since all touch down
+     * events inside the region are not delegated to a background application.
+     * To handle these touch events, we employ pop-up window.
+     * <p>
+     * This window is always invisible since we cannot control the transition behavior.
+     * (e.g. Pop-up window always move with animation)
+     */
+    private final PopupWindow touchEventReceiverWindow;
+
+    private final int windowVerticalMargin;
+    private final int windowHorizontalMargin;
+
+    /**
+     * Base position of the floating candidate window.
+     * <p>
+     * It is same as the cursor rectangle on pre-composition state, and the left-edge of the focused
+     * segment on other states.
+     */
+    private int basePositionTop;
+    private int basePositionBottom;
+    private int basePositionX;
+    private Optional<CursorAnchorInfo> cursorAnchorInfo = Optional.absent();
+    private Category candidatesCategory = Category.CONVERSION;
+    private int highlightedCharacterStart;
+    private int compositionCharacterEnd;
+    /** True if EditorInfo says suggestion should be suppressed. */
+    private boolean suppressSuggestion;
+    /**
+     * Horizontal offset of the candidate window. See also {@link FloatingCandidateLayoutRenderer}
+     */
+    private int offsetX;
+    /** Vertical offset of the candidate window. See also {@link FloatingCandidateLayoutRenderer} */
+    private int offsetY;
+    private boolean isCandidateWindowShowing;
+
+    public FloatingCandidateViewImpl(View parentView) {
+      Context context = Preconditions.checkNotNull(parentView).getContext();
+      this.parentView = parentView;
+      this.layoutRenderer = new FloatingCandidateLayoutRenderer(context.getResources());
+      this.modeIndicator = new FloatingModeIndicator(parentView);
+      this.touchEventReceiverWindow = createPopupWindow(context);
+      Resources resources = context.getResources();
+      this.windowVerticalMargin =
+          Math.round(resources.getDimension(R.dimen.floating_candidate_window_vertical_margin));
+      this.windowHorizontalMargin =
+          Math.round(resources.getDimension(R.dimen.floating_candidate_window_horizontal_margin));
+    }
+
+    public FloatingCandidateViewImpl(View parentView, PopupWindow popupWindowMock,
+                                     FloatingCandidateLayoutRenderer layoutRenderer,
+                                     FloatingModeIndicator modeIndicator) {
+      this.parentView = Preconditions.checkNotNull(parentView);
+      this.layoutRenderer = Preconditions.checkNotNull(layoutRenderer);
+      this.modeIndicator = Preconditions.checkNotNull(modeIndicator);
+      this.touchEventReceiverWindow = Preconditions.checkNotNull(popupWindowMock);
+      Resources resources = parentView.getContext().getResources();
+      this.windowVerticalMargin =
+          resources.getDimensionPixelSize(R.dimen.floating_candidate_window_vertical_margin);
+      this.windowHorizontalMargin =
+          resources.getDimensionPixelSize(R.dimen.floating_candidate_window_horizontal_margin);
+    }
+
+    private PopupWindow createPopupWindow(Context context) {
+      return new PopupWindow(new View(context) {
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+          Optional<Rect> rect = layoutRenderer.getWindowRect();
+          if (!rect.isPresent()) {
+            return false;
+          }
+
+          MotionEvent copiedEvent = MotionEvent.obtain(event);
+          try {
+            copiedEvent.offsetLocation(rect.get().left, rect.get().top);
+            layoutRenderer.onTouchEvent(copiedEvent);
+            // TODO(hsumita): Don't invalidate the view if not necessary.
+            parentView.invalidate();
+          } finally {
+            copiedEvent.recycle();
+          }
+          return true;
+        }
+      });
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+      if (!isCandidateWindowShowing) {
+        return;
+      }
+
+      int saveId = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+      try {
+        canvas.translate(offsetX, offsetY);
+        layoutRenderer.draw(canvas);
+      } finally {
+        canvas.restoreToCount(saveId);
+      }
+    }
+
+    @Override
+    public void viewSizeChanged(int width, int height) {
+      layoutRenderer.setMaxWidth(width - windowHorizontalMargin * 2);
+      updateCandidateWindowWithSize(width, height);
+    }
+
+    /** Sets {@link CursorAnchorInfo} to update the candidate window position. */
+    @Override
+    public void setCursorAnchorInfo(CursorAnchorInfo info) {
+      cursorAnchorInfo = Optional.of(info);
+      modeIndicator.setCursorAnchorInfo(info);
+      updateCandidateWindow();
+    }
+
+    /** Sets {@link Command} to update the contents of the candidate window. */
+    @Override
+    public void setCandidates(Command outCommand) {
+      Output output = Preconditions.checkNotNull(outCommand).getOutput();
+      layoutRenderer.setCandidates(outCommand);
+      modeIndicator.setCommand(outCommand);
+      highlightedCharacterStart = output.getPreedit().getHighlightedPosition();
+      int currentPreeditPosition = 0;
+      for (Segment segment : output.getPreedit().getSegmentList()) {
+        currentPreeditPosition += segment.getValueLength();
+      }
+      compositionCharacterEnd = currentPreeditPosition;
+      candidatesCategory = output.getCandidates().getCategory();
+      updateCandidateWindow();
+    }
+
+    /** Sets {@link EditorInfo} for context-aware behavior. */
+    @Override
+    public void setEditorInfo(EditorInfo editorInfo) {
+      Preconditions.checkNotNull(editorInfo);
+      boolean previusSuppressSuggestion = suppressSuggestion;
+      suppressSuggestion = shouldSuppressSuggestion(editorInfo);
+      if (previusSuppressSuggestion != suppressSuggestion) {
+        updateCandidateWindow();
+      }
+    }
+
+    @Override
+    public void setCompositionMode(CompositionMode mode) {
+      modeIndicator.setCompositionMode(mode);
+    }
+
+    /** Set view event listener to handle events invoked by the candidate window. */
+    @Override
+    public void setViewEventListener(ViewEventListener listener) {
+      layoutRenderer.setViewEventListener(Preconditions.checkNotNull(listener));
+    }
+
+    @Override
+    public void setVisibility(int visibility) {
+      if (visibility != View.VISIBLE) {
+        modeIndicator.hide();
+      }
+    }
+
+    /**
+     * Updates the candidate window.
+     * <p>
+     * All layout related states should be updated before call this method.
+     */
+    private void updateCandidateWindow() {
+      updateCandidateWindowWithSize(parentView.getWidth(), parentView.getHeight());
+    }
+
+    private int calculateWindowLeftPosition(Rect rect, int basePositionX, int viewWidth) {
+      return MozcUtil.clamp(
+          basePositionX + rect.left,
+          windowHorizontalMargin, viewWidth - rect.width() - windowHorizontalMargin);
+    }
+
+    /**
+     * Updates the candidate window with width and height.
+     * <p>
+     * All layout related states should be updated before call this method.
+     */
+    private void updateCandidateWindowWithSize(int viewWidth, int viewHeight) {
+      if (suppressSuggestion && candidatesCategory == Category.SUGGESTION) {
+        dismissCandidateWindow();
+        return;
+      }
+
+      Optional<Rect> optionalWindowRect = layoutRenderer.getWindowRect();
+      if (!optionalWindowRect.isPresent()) {
+        dismissCandidateWindow();
+        return;
+      }
+
+      Rect rect = optionalWindowRect.get();
+      updateBasePosition(rect, viewWidth);
+      int lowerAreaHeight = viewHeight - basePositionBottom - windowVerticalMargin;
+      int upperAreaHeight = basePositionTop - windowVerticalMargin;
+      int top = (lowerAreaHeight < rect.height() && lowerAreaHeight < upperAreaHeight)
+        ? MozcUtil.clamp(basePositionTop - rect.height() - windowVerticalMargin,
+                         0, viewHeight - rect.height())
+        : Math.max(0, basePositionBottom + windowVerticalMargin);
+      int left = calculateWindowLeftPosition(rect, basePositionX, viewWidth);
+
+      offsetX = left - rect.left;
+      offsetY = top - rect.top;
+
+      rect.offset(offsetX, offsetY);
+      showCandidateWindow(rect);
+    }
+
+    /** Return true if floating candidate window should be suppressed. */
+    private boolean shouldSuppressSuggestion(EditorInfo editorInfo) {
+      if ((editorInfo.inputType & EditorInfo.TYPE_MASK_CLASS) != InputType.TYPE_CLASS_TEXT) {
+        return true;
+      }
+
+      if ((editorInfo.inputType
+           & (InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE))
+           != 0) {
+        return true;
+      }
+
+      switch (editorInfo.inputType & EditorInfo.TYPE_MASK_VARIATION) {
+        case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+        case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+        case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+        case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+        case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+        case InputType.TYPE_TEXT_VARIATION_URI:
+        case InputType.TYPE_TEXT_VARIATION_FILTER:
+          return true;
+        default:
+          return false;
+      }
+    }
+
+    private void resetBasePosition() {
+      basePositionTop = 0;
+      basePositionBottom = 0;
+      basePositionX = 0;
+      return;
+    }
+
+    /**
+     * Update {@code basePositionTop}, {@code basePositionBottom} and {@code basePositionX} using
+     * {@code cursorAnchorInfo}.
+     */
+    private void updateBasePosition(Rect windowRect, int viewWidth) {
+      if (!cursorAnchorInfo.isPresent()) {
+        resetBasePosition();
+        return;
+      }
+
+      CursorAnchorInfo info = cursorAnchorInfo.get();
+      int composingStartIndex = info.getComposingTextStart() + highlightedCharacterStart;
+      int composingEndIndex = info.getComposingTextStart() + compositionCharacterEnd - 1;
+      RectF firstCharacterBounds = info.getCharacterBounds(composingStartIndex);
+      float[] points;
+      if (firstCharacterBounds != null) {
+        points = new float[] {firstCharacterBounds.left, firstCharacterBounds.top,
+                              firstCharacterBounds.left, firstCharacterBounds.bottom};
+      } else if (!Float.isNaN(info.getInsertionMarkerHorizontal())) {
+        points = new float[] {info.getInsertionMarkerHorizontal(), info.getInsertionMarkerTop(),
+                              info.getInsertionMarkerHorizontal(), info.getInsertionMarkerBottom()};
+      } else {
+        resetBasePosition();
+        return;
+      }
+
+      // Adjust the bottom base position not to hide composition characters by the floating
+      // candidate window.
+      int windowLeft = calculateWindowLeftPosition(windowRect, (int) points[0], viewWidth);
+      for (int i = composingEndIndex; i > composingStartIndex; --i) {
+        RectF bounds = info.getCharacterBounds(i);
+        if (bounds == null) {
+          continue;
+        }
+        if (bounds.bottom <= points[3]) {
+          break;
+        }
+        if (bounds.right > windowLeft) {
+          points[3] = bounds.bottom;
+          break;
+        }
+      }
+
+      info.getMatrix().mapPoints(points);
+      int[] screenOffset = new int[2];
+      parentView.getLocationOnScreen(screenOffset);
+      basePositionX = Math.round(points[0]) - screenOffset[0];
+      basePositionTop = Math.round(points[1]) - screenOffset[1];
+      basePositionBottom = Math.round(points[3]) - screenOffset[1];
+    }
+
+    /**
+     * Shows the candidate window.
+     * <p>
+     * First {@code touchEventReceiverWindow} is shown (or is updated its position if it has been
+     * already shown). Then this view is invalidated. As the result {@code draw} will be called back
+     * and visible candidate window will be shown.
+    */
+    private void showCandidateWindow(Rect rect) {
+      isCandidateWindowShowing = true;
+      if (touchEventReceiverWindow.isShowing()) {
+        touchEventReceiverWindow.update(rect.left, rect.top, rect.width(), rect.height());
+      } else {
+        touchEventReceiverWindow.setWidth(rect.width());
+        touchEventReceiverWindow.setHeight(rect.height());
+        touchEventReceiverWindow.showAtLocation(
+            parentView, Gravity.NO_GRAVITY, rect.left, rect.top);
+      }
+      parentView.postInvalidate();
+    }
+
+    /**
+     * Dismisses the candidate window.
+     * <p>
+     * Does the very similar things as {@showCandidateWindow}.
+    */
+    private void dismissCandidateWindow() {
+      if (isCandidateWindowShowing) {
+        isCandidateWindowShowing = false;
+        touchEventReceiverWindow.dismiss();
+        parentView.postInvalidate();
+      }
+    }
+
+    @Override
+    public Optional<Rect> getVisibleRect() {
+      Optional<Rect> rect = layoutRenderer.getWindowRect();
+      if (touchEventReceiverWindow.isShowing() && rect.isPresent()) {
+        rect.get().offset(offsetX, offsetY);
+        return rect;
+      } else {
+        return Optional.<Rect>absent();
+      }
+    }
+  }
+
+  private final FloatingCandidateViewProxy floatingCandidateViewProxy;
+
+  public FloatingCandidateView(Context context) {
+    super(context);
+    floatingCandidateViewProxy = createFloatingCandidateViewInstance(this);
+  }
+
+  public FloatingCandidateView(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    floatingCandidateViewProxy = createFloatingCandidateViewInstance(this);
+  }
+
+  @VisibleForTesting
+  FloatingCandidateView(Context context, PopupWindow popupWindowMock) {
+    super(context);
+    floatingCandidateViewProxy = new FloatingCandidateViewImpl(
+        this, popupWindowMock, new FloatingCandidateLayoutRenderer(context.getResources()),
+        new FloatingModeIndicator(this));
+  }
+
+  @VisibleForTesting
+  FloatingCandidateView(Context context, PopupWindow popupWindowMock,
+                        FloatingCandidateLayoutRenderer layoutRenderer,
+                        FloatingModeIndicator modeIndicator) {
+    super(context);
+    floatingCandidateViewProxy =
+        new FloatingCandidateViewImpl(this, popupWindowMock, layoutRenderer, modeIndicator);
+  }
+
+  private static FloatingCandidateViewProxy createFloatingCandidateViewInstance(View view) {
+    return isAvailable()
+        ? new FloatingCandidateViewImpl(view)
+        : new FloatingCandidateViewStub();
+  }
+
+  @Override
+  protected void onFinishInflate() {
+    // Use software renderer since hardware renderer doesn't support Paint#setShadowLayer() and
+    // Canvas#drawPicture() which is used by MozcDrawable.
+    this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+  }
+
+  public static boolean isAvailable() {
+    return Build.VERSION.SDK_INT >= 21;
+  }
+
+  @Override
+  public void setVisibility(int visibility) {
+    super.setVisibility(visibility);
+    floatingCandidateViewProxy.setVisibility(visibility);
+  }
+
+  @Override
+  public void onDraw(Canvas canvas) {
+    super.onDraw(canvas);
+    floatingCandidateViewProxy.draw(canvas);
+  }
+
+  @Override
+  public void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+    super.onSizeChanged(width, height, oldWidth, oldHeight);
+    floatingCandidateViewProxy.viewSizeChanged(width, height);
+  }
+
+  /** Sets {@link CursorAnchorInfo} to update the candidate window position. */
+  public void setCursorAnchorInfo(CursorAnchorInfo info) {
+    floatingCandidateViewProxy.setCursorAnchorInfo(info);
+  }
+
+  /** Sets {@link Command} to update the contents of the candidate window. */
+  public void setCandidates(Command outCommand) {
+    floatingCandidateViewProxy.setCandidates(outCommand);
+  }
+
+  /** Sets {@link EditorInfo} for context-aware behavior. */
+  public void setEditorInfo(EditorInfo editorInfo) {
+    floatingCandidateViewProxy.setEditorInfo(editorInfo);
+  }
+
+  public void setCompositionMode(CompositionMode mode) {
+    floatingCandidateViewProxy.setCompositionMode(mode);
+  }
+
+  /** Set view event listener to handle events invoked by the candidate window. */
+  public void setViewEventListener(ViewEventListener listener) {
+    floatingCandidateViewProxy.setViewEventListener(listener);
+  }
+
+  @VisibleForTesting Optional<Rect> getVisibleRect() {
+    return floatingCandidateViewProxy.getVisibleRect();
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java b/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java
new file mode 100644
index 0000000..847692c
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java
@@ -0,0 +1,39 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+class InputDeviceReceiver extends BroadcastReceiver {
+  @Override
+  public void onReceive(Context context, Intent intent) {}
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java
deleted file mode 100644
index 7b2ec9d..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.keyboard.Flick;
-import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
-import org.mozc.android.inputmethod.japanese.keyboard.Key;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
-import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.Row;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
-import org.mozc.android.inputmethod.japanese.resources.R;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import android.util.SparseIntArray;
-
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboard extends Keyboard {
-  /**
-   * Each keyboard has its own specification.
-   *
-   * For example, some keyboards use a special Romanji table.
-   */
-  public static enum KeyboardSpecification {
-    // 12 keys.
-    TWELVE_KEY_TOGGLE_KANA(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_KANA", 0, 1, 1),
-        R.xml.kbd_12keys_kana,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.TWELVE_KEYS_TO_HIRAGANA,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        true,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_TOGGLE_ALPHABET(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_ALPHABET", 0, 1, 1),
-        R.xml.kbd_12keys_abc,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.TWELVE_KEYS_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_TOGGLE_NUMBER(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_NUMBER", 0, 1, 1),
-        R.xml.kbd_12keys_123,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.TWELVE_KEYS_TO_NUMBER,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_TOGGLE_QWERTY_ALPHABET(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_QWERTY_ALPHABET", 0, 4, 0),
-        R.xml.kbd_12keys_qwerty_abc,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    // Flick mode.
-    TWELVE_KEY_FLICK_KANA(
-        new KeyboardSpecificationName("TWELVE_KEY_FLICK_KANA", 0, 1, 3),
-        R.xml.kbd_12keys_flick_kana,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.FLICK_TO_HIRAGANA,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        true,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_FLICK_ALPHABET(
-        new KeyboardSpecificationName("TWELVE_KEY_FLICK_ALPHABET", 0, 1, 1),
-        R.xml.kbd_12keys_flick_abc,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.FLICK_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    TWELVE_KEY_FLICK_NUMBER(
-        new KeyboardSpecificationName("TWELVE_KEY_FLICK_NUMBER", 0, 1, 1),
-        R.xml.kbd_12keys_flick_123,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.FLICK_TO_NUMBER,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    TWELVE_KEY_TOGGLE_FLICK_KANA(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_KANA", 0, 1, 3),
-        R.xml.kbd_12keys_flick_kana,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.TOGGLE_FLICK_TO_HIRAGANA,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        true,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_TOGGLE_FLICK_ALPHABET(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 1, 1),
-        R.xml.kbd_12keys_flick_abc,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.TOGGLE_FLICK_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    TWELVE_KEY_TOGGLE_FLICK_NUMBER(
-        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 1, 1),
-        R.xml.kbd_12keys_flick_123,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.TOGGLE_FLICK_TO_NUMBER,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    // QWERTY keyboard.
-    QWERTY_KANA(
-        new KeyboardSpecificationName("QWERTY_KANA", 0, 3, 1),
-        R.xml.kbd_qwerty_kana,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    QWERTY_KANA_NUMBER(
-        new KeyboardSpecificationName("QWERTY_KANA_NUMBER", 0, 2, 1),
-        R.xml.kbd_qwerty_kana_123,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA_NUMBER,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    QWERTY_ALPHABET(
-        new KeyboardSpecificationName("QWERTY_ALPHABET", 0, 4, 0),
-        R.xml.kbd_qwerty_abc,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    QWERTY_ALPHABET_NUMBER(
-        new KeyboardSpecificationName("QWERTY_ALPHABET_NUMBER", 0, 2, 1),
-        R.xml.kbd_qwerty_abc_123,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    // Godan keyboard.
-    GODAN_KANA(
-        new KeyboardSpecificationName("GODAN_KANA", 0, 1, 1),
-        R.xml.kbd_godan_kana,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.GODAN_TO_HIRAGANA,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        true,
-        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
-    // HARDWARE QWERTY keyboard.
-    HARDWARE_QWERTY_KANA(
-        new KeyboardSpecificationName("HARDWARE_QWERTY_KANA", 0, 1, 0),
-        0,
-        CompositionMode.HIRAGANA,
-        SpecialRomanjiTable.DEFAULT_TABLE,
-        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    HARDWARE_QWERTY_ALPHABET(
-        new KeyboardSpecificationName("HARDWARE_QWERTY_ALPHABET", 0, 1, 0),
-        0,
-        CompositionMode.HALF_ASCII,
-        SpecialRomanjiTable.DEFAULT_TABLE,
-        SpaceOnAlphanumeric.COMMIT,
-        false,
-        CrossingEdgeBehavior.DO_NOTHING),
-
-    ;
-
-    private final KeyboardSpecificationName specName;
-    private final int resourceId;
-    private final CompositionMode compositionMode;
-    private final SpecialRomanjiTable specialRomanjiTable;
-    private final SpaceOnAlphanumeric spaceOnAlphanumeric;
-    private final boolean kanaModifierInsensitiveConversion;
-    private final CrossingEdgeBehavior crossingEdgeBehavior;
-
-    private KeyboardSpecification(
-        KeyboardSpecificationName specName,
-        int resourceId,
-        CompositionMode compositionMode,
-        SpecialRomanjiTable specialRomanjiTable,
-        SpaceOnAlphanumeric spaceOnAlphanumeric,
-        boolean kanaModifierInsensitiveConversion,
-        CrossingEdgeBehavior crossingEdgeBehavior) {
-      this.specName = Preconditions.checkNotNull(specName);
-      this.resourceId = resourceId;
-      this.compositionMode = Preconditions.checkNotNull(compositionMode);
-      this.specialRomanjiTable = Preconditions.checkNotNull(specialRomanjiTable);
-      this.spaceOnAlphanumeric = Preconditions.checkNotNull(spaceOnAlphanumeric);
-      this.kanaModifierInsensitiveConversion = kanaModifierInsensitiveConversion;
-      this.crossingEdgeBehavior = Preconditions.checkNotNull(crossingEdgeBehavior);
-    }
-
-    public int getXmlLayoutResourceId() {
-      return resourceId;
-    }
-
-    public CompositionMode getCompositionMode() {
-      return compositionMode;
-    }
-
-    public KeyboardSpecificationName getKeyboardSpecificationName() {
-      return specName;
-    }
-
-    public KeyboardSpecificationName getSpecName() {
-      return specName;
-    }
-
-    public SpecialRomanjiTable getSpecialRomanjiTable() {
-      return specialRomanjiTable;
-    }
-
-    public SpaceOnAlphanumeric getSpaceOnAlphanumeric() {
-      return spaceOnAlphanumeric;
-    }
-
-    public boolean isKanaModifierInsensitiveConversion() {
-      return kanaModifierInsensitiveConversion;
-    }
-
-    public CrossingEdgeBehavior getCrossingEdgeBehavior() {
-      return crossingEdgeBehavior;
-    }
-  }
-
-  private final KeyboardSpecification specification;
-  private Optional<SparseIntArray> sourceIdToKeyCode = Optional.absent();
-
-  public JapaneseKeyboard(
-      Optional<String> contentDescription,
-      List<Row> rowList, float flickThreshold, KeyboardSpecification specification) {
-    super(Preconditions.checkNotNull(contentDescription),
-          Preconditions.checkNotNull(rowList), flickThreshold);
-    this.specification = Preconditions.checkNotNull(specification);
-  }
-
-  public KeyboardSpecification getSpecification() {
-    return specification;
-  }
-
-  /**
-   * Returns keyCode from {@code souceId}.
-   *
-   * <p>If not found, {@code Integer.MIN_VALUE} is returned.
-   */
-  public int getKeyCode(int sourceId) {
-    ensureSourceIdToKeyCode();
-    return sourceIdToKeyCode.get().get(sourceId, Integer.MIN_VALUE);
-  }
-
-  private void ensureSourceIdToKeyCode() {
-    if (sourceIdToKeyCode.isPresent()) {
-      return;
-    }
-    SparseIntArray result = new SparseIntArray();
-    for (Row row : getRowList()) {
-      for (Key key : row.getKeyList()) {
-        for (KeyState keyState : key.getKeyStates()) {
-          for (Direction direction : Direction.values()) {
-            Flick flick = keyState.getFlick(direction);
-            if (flick != null) {
-              KeyEntity keyEntity = flick.getKeyEntity();
-              result.put(keyEntity.getSourceId(), keyEntity.getKeyCode());
-            }
-          }
-        }
-      }
-    }
-    sourceIdToKeyCode = Optional.of(result);
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java
deleted file mode 100644
index 106ea58..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.util.LeastRecentlyUsedCacheMap;
-
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * Factory of the keyboard data based on xml.
- *
- */
-public class JapaneseKeyboardFactory {
-
-  /**
-   * Key for the cache map of keyboard.
-   *
-   * Currently the keyboard is depending on its specification and display's size.
-   */
-  private static class CacheKey {
-    private final KeyboardSpecification specification;
-    private final int width;
-    private final int height;
-
-    CacheKey(KeyboardSpecification specification, int width, int height) {
-      this.specification = specification;
-      this.width = width;
-      this.height = height;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (obj instanceof CacheKey) {
-        CacheKey other = CacheKey.class.cast(obj);
-        return specification == other.specification &&
-               width == other.width &&
-               height == other.height;
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return (specification.hashCode() * 31 ^ width) * 31 ^ height;
-    }
-  }
-
-  /**
-   * The max size of cached keyboards. This is based on the max number of keyboard variation
-   * for a configuration.
-   */
-  private static final int CACHE_SIZE = 6;
-
-  private final Map<CacheKey, JapaneseKeyboard> cache =
-      new LeastRecentlyUsedCacheMap<CacheKey, JapaneseKeyboard>(CACHE_SIZE);
-
-  /**
-   * @return JapaneseKeyboard instance based on given resources and specification.
-   *         If it is already parsed, just returns cached one. Otherwise, tries to parse
-   *         corresponding xml data, then caches and returns it.
-   *         Returns {@code null} if parsing is failed.
-   * @throws NullPointerException if given {@code resources} or {@code specification} is
-   *         {@code null}.
-   */
-  public JapaneseKeyboard get(Resources resources, KeyboardSpecification specification,
-                              int keyboardWidth, int keyboardHeight) {
-    if (resources == null) {
-      throw new NullPointerException("resources is null.");
-    }
-    if (specification == null) {
-      throw new NullPointerException("specification is null.");
-    }
-
-    CacheKey cacheKey =
-        new CacheKey(specification, keyboardWidth, keyboardHeight);
-
-    // First, look up from the cache.
-    JapaneseKeyboard keyboard = cache.get(cacheKey);
-    if (keyboard == null) {
-      // If not found, parse keyboard from a xml resource file. The result will be cached in
-      // the cache map.
-      keyboard = parseKeyboard(resources, specification, keyboardWidth, keyboardHeight);
-      if (keyboard != null) {
-        cache.put(cacheKey, keyboard);
-      }
-    }
-    return keyboard;
-  }
-
-  private static JapaneseKeyboard parseKeyboard(
-      Resources resources, KeyboardSpecification specification,
-      int keyboardWidth, int keyboardHeight) {
-    JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
-        resources, resources.getXml(specification.getXmlLayoutResourceId()), specification,
-        keyboardWidth, keyboardHeight);
-    try {
-      return parser.parseKeyboard();
-    } catch (NotFoundException e) {
-      MozcLog.e(e.getMessage());
-    } catch (XmlPullParserException e) {
-      MozcLog.e(e.getMessage());
-    } catch (IOException e) {
-      MozcLog.e(e.getMessage());
-    }
-
-    // Returns null if failed.
-    return null;
-  }
-
-  /**
-   * Clears cached keyboards.
-   */
-  public void clear() {
-    cache.clear();
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java
deleted file mode 100644
index 19cde71..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser;
-import org.mozc.android.inputmethod.japanese.keyboard.Row;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboardParser extends KeyboardParser {
-  private final KeyboardSpecification specification;
-
-  public JapaneseKeyboardParser(
-      Resources resources, XmlResourceParser parser, KeyboardSpecification specification,
-      int keyboardWidth, int keyboardHeight) {
-    super(resources, parser, keyboardWidth, keyboardHeight);
-    if (specification == null) {
-      throw new NullPointerException("specification is null.");
-    }
-    this.specification = specification;
-  }
-
-  /**
-   * Parses a XML file and returns the keyboard instance.
-   * @return JapaneseKeyboard instance parsed from the resource.
-   * @throws XmlPullParserException is thrown if parsing is failed.
-   * @throws IOException is thrown if there is trouble to read data.
-   */
-  @Override
-  public JapaneseKeyboard parseKeyboard() throws XmlPullParserException, IOException {
-    return JapaneseKeyboard.class.cast(super.parseKeyboard());
-  }
-
-  @Override
-  protected Keyboard buildKeyboard(Optional<String> contentDescription,
-                                   List<Row> rowList, float flickThreshold) {
-    return new JapaneseKeyboard(Preconditions.checkNotNull(contentDescription),
-                                Preconditions.checkNotNull(rowList), flickThreshold,
-                                specification);
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java
deleted file mode 100644
index 8b0e81d..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-/**
- * Keyboard view for Japanese.
- *
- * The features dedicated to Japanese input are implemented in this class.
- *
- */
-public class JapaneseKeyboardView extends KeyboardView {
-  public JapaneseKeyboardView(Context context) {
-    super(context);
-  }
-
-  public JapaneseKeyboardView(Context context, AttributeSet attrs) {
-    super(context, attrs);
-  }
-
-  public JapaneseKeyboardView(Context context, AttributeSet attrs, int defStyle) {
-    super(context, attrs, defStyle);
-  }
-
-  /**
-   * Sets a Keyboard.
-   *
-   * Internally this method delegates to super.setKeyboard(), which is protected scope.
-   * TODO(hidehiko): Rename following methods to {set,get}Keyboard, as covariant
-   * return value should be supported Java 1.5 or later.
-   * @param keyboard a keyboard instance to be set
-   */
-  public void setJapaneseKeyboard(JapaneseKeyboard keyboard) {
-    super.setKeyboard(keyboard);
-  }
-
-  public JapaneseKeyboard getJapaneseKeyboard() {
-    return JapaneseKeyboard.class.cast(super.getKeyboard());
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java b/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
index 8316583..a43c9c5 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
@@ -29,6 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
@@ -37,8 +38,10 @@
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 
 import android.view.MotionEvent;
 import android.view.View;
@@ -54,6 +57,7 @@
  *
  */
 public class KeyEventButtonTouchListener implements OnTouchListener {
+
   private final int sourceId;
   private final int keyCode;
   private KeyEventHandler keyEventHandler = null;
@@ -95,9 +99,11 @@
    * {@code keyCode}.
    * This is exported as package private for testing.
    */
-  static Key createKey(View button, int sourceId, int keyCode) {
-    KeyEntity keyEntity =
-        new KeyEntity(sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, null, false, null);
+  @VisibleForTesting static Key createKey(View button, int sourceId, int keyCode) {
+    KeyEntity keyEntity = new KeyEntity(
+            sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, 0,
+            Optional.<String>absent(), false,
+            Optional.<PopUp>absent(), 0, 0, 0, 0);
     Flick flick = new Flick(Direction.CENTER, keyEntity);
     KeyState keyState =
         new KeyState("",
@@ -105,9 +111,10 @@
                      Collections.<KeyState.MetaState>emptySet(),
                      Collections.<KeyState.MetaState>emptySet(),
                      Collections.singletonList(flick));
-    // Now, we support repetable keys only.
+    // Now, we support repeatable keys only.
     return new Key(0, 0, button.getWidth(), button.getHeight(), 0, 0,
-                   true, false, false, Stick.EVEN, Collections.singletonList(keyState));
+                   true, false, Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                   Collections.singletonList(keyState));
   }
 
   private static KeyEventContext createKeyEventContext(
@@ -157,8 +164,9 @@
     if (keyEventHandler != null && keyEventContext != null) {
       keyEventContext.update(x, y, TouchAction.TOUCH_UP, timestamp);
       keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+      // TODO(hsumita): Confirm that we can put null as a touch event or not.
       keyEventHandler.sendKey(keyEventContext.getKeyCode(),
-                              Collections.singletonList(keyEventContext.getTouchEvent()));
+                              Collections.singletonList(keyEventContext.getTouchEvent().orNull()));
       keyEventHandler.sendRelease(keyEventContext.getPressedKeyCode());
     }
     this.keyEventContext = null;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java b/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
index c42e6d3..f7e3e7b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
@@ -32,6 +32,8 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ModifierKey;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.SpecialKey;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 /**
  * Converts Androids's KeyEvent to Mozc's KeyEvent.
@@ -52,7 +54,7 @@
    */
   public interface KeyEventInterface {
     int getKeyCode();
-    android.view.KeyEvent getNativeEvent();
+    Optional<android.view.KeyEvent> getNativeEvent();
   }
 
   private static final int ASCII_MIN = 32; // Space.
@@ -112,6 +114,7 @@
   }
 
   public static KeyEventInterface getKeyEventInterface(final android.view.KeyEvent keyEvent) {
+    Preconditions.checkNotNull(keyEvent);
     return new KeyEventInterface() {
 
       @Override
@@ -120,8 +123,8 @@
       }
 
       @Override
-      public android.view.KeyEvent getNativeEvent() {
-        return keyEvent;
+      public Optional<android.view.KeyEvent> getNativeEvent() {
+        return Optional.of(keyEvent);
       }
     };
   }
@@ -135,14 +138,14 @@
       }
 
       @Override
-      public android.view.KeyEvent getNativeEvent() {
-        return null;
+      public Optional<android.view.KeyEvent> getNativeEvent() {
+        return Optional.<android.view.KeyEvent>absent();
       }
     };
   }
 
   public static boolean isMetaKey(android.view.KeyEvent keyEvent) {
-    int keyCode = keyEvent.getKeyCode();
+    int keyCode = Preconditions.checkNotNull(keyEvent).getKeyCode();
     return keyCode == android.view.KeyEvent.KEYCODE_SHIFT_LEFT ||
         keyCode == android.view.KeyEvent.KEYCODE_SHIFT_RIGHT ||
         keyCode == android.view.KeyEvent.KEYCODE_CTRL_LEFT ||
diff --git a/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java b/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java
new file mode 100644
index 0000000..b8063cf
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java
@@ -0,0 +1,49 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.preference.MozcProxyActivity;
+import org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity;
+
+import android.content.Intent;
+
+/**
+ * Activity to show launcher icon on the home screen.
+ *
+ * <p>MozcProxyPreferenceActivity is always active because it is invoked from system preference.
+ * This class might be deactivated to hide launcher icon.
+ */
+public class LauncherActivity extends MozcProxyActivity {
+
+  @Override
+  protected Intent getForwardIntent() {
+    return new Intent(this, MozcProxyPreferenceActivity.class);
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java b/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java
new file mode 100644
index 0000000..c7b6bca
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java
@@ -0,0 +1,56 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * A broadcast receiver to initialize launcher icon's visibility.
+ */
+public class LauncherIconVisibilityInitializer extends BroadcastReceiver {
+
+  @Override
+  public void onReceive(Context context, Intent intent) {
+    if (shouldHandle(intent)) {
+      LauncherIconManagerFactory.getDefaultInstance().updateLauncherIconVisibility(context);
+    }
+  }
+
+  private boolean shouldHandle(Intent intent) {
+    String action = intent.getAction();
+    return "android.intent.action.BOOT_COMPLETED".equals(action)
+           || "android.intent.action.MY_PACKAGE_REPLACED".equals(action)
+           || "android.intent.action.USER_INITIALIZE".equals(action);
+  }
+}
\ No newline at end of file
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java b/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
index e5dd770..189f2fe 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
@@ -31,7 +31,6 @@
 
 import org.mozc.android.inputmethod.japanese.mushroom.MushroomUtil;
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
-import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
 import com.google.common.base.Preconditions;
 
 import android.content.Context;
@@ -45,12 +44,10 @@
  */
 class MozcMenuDialogListenerImpl implements MenuDialogListener {
   private final InputMethodService inputMethodService;
-  private final ImeSwitcher imeSwitcher;
   private boolean showInputMethodPicker = false;
 
-  MozcMenuDialogListenerImpl(InputMethodService inputMethodService, ImeSwitcher imeSwitcher) {
+  MozcMenuDialogListenerImpl(InputMethodService inputMethodService) {
     this.inputMethodService = Preconditions.checkNotNull(inputMethodService);
-    this.imeSwitcher = Preconditions.checkNotNull(imeSwitcher);
   }
 
   @Override
@@ -86,13 +83,6 @@
   }
 
   @Override
-  public void onLaunchVoiceInputActivitySelected(Context context) {
-    if (!imeSwitcher.switchToVoiceIme("ja")) {
-      MozcLog.e("Voice IME for ja locale is not found.");
-    }
-  }
-
-  @Override
   public void onShowMushroomSelectionDialogSelected(Context context) {
     // Reset the composing text, otherwise the composing text will be committed automatically
     // and as the result the user would see the duplicated committing.
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcService.java b/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
index 0cfa18e..17439b0 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
@@ -31,22 +31,21 @@
 
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.model.SelectionTracker;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
 import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.mushroom.MushroomResultProxy;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Context.InputFieldType;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.DeletionRange;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.GenericStorageEntry.StorageType;
@@ -56,9 +55,6 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment.Annotation;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand.UsageStatsEvent;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config;
@@ -69,11 +65,13 @@
 import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
 import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory;
 import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.protobuf.ByteString;
 
+import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
@@ -97,6 +95,7 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputBinding;
 import android.view.inputmethod.InputConnection;
@@ -209,6 +208,8 @@
 
     @Override
     public void addHistory(SymbolMajorCategory majorCategory, String value) {
+      Preconditions.checkNotNull(majorCategory);
+      Preconditions.checkNotNull(value);
       sessionExecutor.insertToStorage(
           STORAGE_TYPE_MAP.get(majorCategory),
           value,
@@ -217,8 +218,7 @@
   }
 
   // Called back from ViewManager
-  // Package private for testing.
-  class MozcEventListener implements ViewEventListener {
+  @VisibleForTesting class MozcEventListener implements ViewEventListener {
     @Override
     public void onConversionCandidateSelected(int candidateId, Optional<Integer> rowIndex) {
       sessionExecutor.submitCandidate(candidateId, rowIndex, renderResultCallback);
@@ -226,8 +226,23 @@
     }
 
     @Override
+    public void onPageUp() {
+      sessionExecutor.pageUp(renderResultCallback);
+      feedbackManager.fireFeedback(FeedbackEvent.KEY_DOWN);
+    }
+
+    @Override
+    public void onPageDown() {
+      sessionExecutor.pageDown(renderResultCallback);
+      feedbackManager.fireFeedback(FeedbackEvent.KEY_DOWN);
+    }
+
+    @Override
     public void onSymbolCandidateSelected(SymbolMajorCategory majorCategory, String candidate,
                                           boolean updateHistory) {
+      Preconditions.checkNotNull(majorCategory);
+      Preconditions.checkNotNull(candidate);
+
       // Directly commit the text.
       commitText(candidate);
 
@@ -252,8 +267,8 @@
 
     @Override
     public void onKeyEvent(
-        ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
-        KeyboardSpecification keyboardSpecification, List<? extends TouchEvent> touchEventList) {
+        @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface keyEvent,
+        @Nullable KeyboardSpecification keyboardSpecification, List<TouchEvent> touchEventList) {
       if (mozcKeyEvent == null && keyboardSpecification == null) {
         // We don't send a key event to Mozc native layer since {@code mozcKeyEvent} is null, and we
         // don't need to update the keyboard specification since {@code keyboardSpecification} is
@@ -275,7 +290,7 @@
     }
 
     @Override
-    public void onUndo(List<? extends TouchEvent> touchEventList) {
+    public void onUndo(List<TouchEvent> touchEventList) {
       sessionExecutor.undoOrRewind(touchEventList, renderResultCallback);
     }
 
@@ -300,57 +315,73 @@
     }
 
     @Override
-    public void onShowMenuDialog(List<? extends TouchEvent> touchEventList) {
+    public void onShowMenuDialog(List<TouchEvent> touchEventList) {
       sessionExecutor.touchEventUsageStatsEvent(touchEventList);
     }
 
     @Override
-    public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList) {
-      // Send request with (only) keyboard name for logging usage stats.
-      sessionExecutor.updateRequest(
-          MozcUtil.getRequestForKeyboard(
-              SymbolInputView.SPEC_NAME,
-              Optional.<SpecialRomanjiTable>absent(),
-              Optional.<SpaceOnAlphanumeric>absent(),
-              Optional.<Boolean>absent(),
-              Optional.<CrossingEdgeBehavior>absent(),
-              getConfiguration()),
-          touchEventList);
+    public void onShowSymbolInputView(List<TouchEvent> touchEventList) {
+      changeKeyboardSpecificationAndSendKey(
+          null, null, KeyboardSpecification.SYMBOL_NUMBER, getConfiguration(),
+          Collections.<TouchEvent>emptyList());
+      viewManager.onShowSymbolInputView();
     }
 
     @Override
     public void onCloseSymbolInputView() {
-      KeyboardSpecification specification = viewManager.getJapaneseKeyboardSpecification();
-      sessionExecutor.updateRequest(
-          MozcUtil.getRequestForKeyboard(
-              specification.getKeyboardSpecificationName(),
-              Optional.of(specification.getSpecialRomanjiTable()),
-              Optional.of(specification.getSpaceOnAlphanumeric()),
-              Optional.of(specification.isKanaModifierInsensitiveConversion()),
-              Optional.of(specification.getCrossingEdgeBehavior()),
-              getConfiguration()),
-          Collections.<TouchEvent>emptyList());
-    }
-
-    @Override
-    public void onHardwareKeyboardCompositionModeChange(CompositionSwitchMode mode) {
-      CompositionMode oldMode = hardwareKeyboard.getCompositionMode();
-      hardwareKeyboard.setCompositionMode(mode);
-      CompositionMode newMode = hardwareKeyboard.getCompositionMode();
-      if (oldMode != newMode) {
-        viewManager.setHardwareKeyboardCompositionMode(newMode);
-        sendKeyWithKeyboardSpecification(
-            null, null,
-            hardwareKeyboard.getKeyboardSpecification(),
-            getConfiguration(),
+      viewManager.onCloseSymbolInputView();
+      // This callback is called in two ways: one is from touch event on symbol input view.
+      // The other is from onKeyDown event by hardware keyboard.  ViewManager.isNarrowMode()
+      // is abused to distinguish these two triggers where its true value indicates that
+      // onCloseSymbolInputView() is called on hardware keyboard event.  In the case of hardware
+      // keyboard event, keyboard specification has been already updated so we shouldn't update it.
+      if (!viewManager.isNarrowMode()) {
+        changeKeyboardSpecificationAndSendKey(
+            null, null, viewManager.getKeyboardSpecification(), getConfiguration(),
             Collections.<TouchEvent>emptyList());
       }
     }
 
     @Override
+    public void onHardwareKeyboardCompositionModeChange(CompositionSwitchMode mode) {
+      viewManager.switchHardwareKeyboardCompositionMode(mode);
+    }
+
+    @Override
     public void onActionKey() {
       // false means that the key is for Action and not ENTER.
-      sendDefaultEditorAction(false);
+      sendEditorAction(false);
+    }
+
+    @Override
+    public void onNarrowModeChanged(boolean newNarrowMode) {
+      if (!newNarrowMode) {
+        // Hardware keyboard to software keyboard transition: Submit composition.
+        sessionExecutor.submit(renderResultCallback);
+      }
+      updateImposedConfig();
+    }
+
+    @Override
+    public void onUpdateKeyboardLayoutAdjustment(
+        ViewManagerInterface.LayoutAdjustment layoutAdjustment) {
+      Preconditions.checkNotNull(layoutAdjustment);
+      Configuration configuration = getConfiguration();
+      if (sharedPreferences == null || configuration == null) {
+        return;
+      }
+      boolean isLandscapeKeyboardSettingActive =
+          PreferenceUtil.isLandscapeKeyboardSettingActive(
+              sharedPreferences, configuration.orientation);
+      String key;
+      if (isLandscapeKeyboardSettingActive) {
+        key = PreferenceUtil.PREF_LANDSCAPE_LAYOUT_ADJUSTMENT_KEY;
+      } else {
+        key = PreferenceUtil.PREF_PORTRAIT_LAYOUT_ADJUSTMENT_KEY;
+      }
+      sharedPreferences.edit()
+          .putString(key, layoutAdjustment.toString())
+          .apply();
     }
   }
 
@@ -360,16 +391,18 @@
   private class RenderResultCallback implements SessionExecutor.EvaluationCallback {
 
     @Override
-    public void onCompleted(Command command, @Nullable KeyEventInterface triggeringKeyEvent) {
-      Preconditions.checkNotNull(command);
-      if (command.getInput().getCommand().getType() !=
-          SessionCommand.CommandType.EXPAND_SUGGESTION) {
+    public void onCompleted(
+        Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
+      Preconditions.checkArgument(Preconditions.checkNotNull(command).isPresent());
+      Preconditions.checkNotNull(triggeringKeyEvent);
+      if (command.get().getInput().getCommand().getType()
+          != SessionCommand.CommandType.EXPAND_SUGGESTION) {
         // For expanding suggestions, we don't need to update our rendering result.
-        renderInputConnection(command, triggeringKeyEvent);
+        renderInputConnection(command.get(), triggeringKeyEvent.orNull());
       }
       // Transit to narrow mode if required (e.g., Typed 'a' key from h/w keyboard).
-      viewManager.maybeTransitToNarrowMode(command, triggeringKeyEvent);
-      viewManager.render(command);
+      viewManager.maybeTransitToNarrowMode(command.get(), triggeringKeyEvent.orNull());
+      viewManager.render(command.get());
     }
   }
 
@@ -380,10 +413,10 @@
   class SendKeyToApplicationCallback implements SessionExecutor.EvaluationCallback {
 
     @Override
-    public void onCompleted(@Nullable Command command,
-                            @Nullable KeyEventInterface triggeringKeyEvent) {
-      Preconditions.checkArgument(command == null);
-      sendKeyEvent(triggeringKeyEvent);
+    public void onCompleted(Optional<Command> command,
+                            Optional<KeyEventInterface> triggeringKeyEvent) {
+      Preconditions.checkArgument(!Preconditions.checkNotNull(command).isPresent());
+      sendKeyEvent(triggeringKeyEvent.orNull());
     }
   }
 
@@ -393,10 +426,11 @@
   private class SendKeyToViewCallback implements SessionExecutor.EvaluationCallback {
 
     @Override
-    public void onCompleted(@Nullable Command command, KeyEventInterface triggeringKeyEvent) {
-      Preconditions.checkArgument(command == null);
-      Preconditions.checkNotNull(triggeringKeyEvent);
-      viewManager.consumeKeyOnViewSynchronously(triggeringKeyEvent.getNativeEvent());
+    public void onCompleted(
+        Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
+      Preconditions.checkArgument(!Preconditions.checkNotNull(command).isPresent());
+      Preconditions.checkArgument(Preconditions.checkNotNull(triggeringKeyEvent).isPresent());
+      viewManager.consumeKeyOnViewSynchronously(triggeringKeyEvent.get().getNativeEvent().orNull());
     }
   }
 
@@ -417,6 +451,7 @@
   /**
    * We need to send SYNC_DATA command periodically. This class handles it.
    */
+  @SuppressLint("HandlerLeak")
   private class SendSyncDataCommandHandler extends Handler {
     /**
      * The current period of sending SYNC_DATA is 15 mins (as same as desktop version).
@@ -439,6 +474,7 @@
    * This class handles callback operation.
    * Posting and removing messages should be done in appropriate point.
    */
+  @SuppressLint("HandlerLeak")
   private class MemoryTrimmingHandler extends Handler {
 
     /**
@@ -468,16 +504,21 @@
 
   // Focused segment's attribute.
   @VisibleForTesting static final CharacterStyle SPAN_CONVERT_HIGHLIGHT =
-      new BackgroundColorSpan(0x8888FFFF);
+      new BackgroundColorSpan(0x66EF3566);
+
+  // Background color span for non-focused conversion segment.
+  // We don't create a static CharacterStyle instance since there are multiple segments at the same
+  // time. Otherwise, segments except for the last one cannot have style.
+  @VisibleForTesting static final int CONVERT_NORMAL_COLOR = 0x19EF3566;
 
   // Cursor position.
   // Note that InputConnection seems not to be able to show cursor. This is a workaround.
   @VisibleForTesting static final CharacterStyle SPAN_BEFORE_CURSOR =
-      new BackgroundColorSpan(0x88FF88FF);
+      new BackgroundColorSpan(0x664DB6AC);
 
-  // To hide a caret, we use non-transparent background for partial conversion.
-  private static final CharacterStyle SPAN_PARTIAL_SUGGESTION_COLOR =
-      new BackgroundColorSpan(0xFFFFE0E0);
+  // Background color span for partial conversion.
+  @VisibleForTesting static final CharacterStyle SPAN_PARTIAL_SUGGESTION_COLOR =
+      new BackgroundColorSpan(0x194DB6AC);
 
   // Underline.
   @VisibleForTesting static final CharacterStyle SPAN_UNDERLINE = new UnderlineSpan();
@@ -535,10 +576,6 @@
   @VisibleForTesting KeyboardSpecification currentKeyboardSpecification =
       KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA;
 
-  // Non-final for testing
-  // TODO(matsuzakit): Setting this in onCreateInternal might be more consistent.
-  @VisibleForTesting HardwareKeyboard hardwareKeyboard = new HardwareKeyboard();
-
   // Current HardKeyboardHidden configuration value.
   // This is updated only when onConfigurationChanged is called and
   // Configuration.HARDKEYBOARDHIDDEN_* differs to this.
@@ -553,6 +590,15 @@
   // Held for testing.
   private ViewEventListener eventListener;
 
+  @SuppressWarnings("deprecation")
+  @SuppressLint("NewApi")
+  public MozcService() {
+    super();
+    if (Build.VERSION.SDK_INT >= 17) {
+      enableHardwareAcceleration();
+    }
+  }
+
   @Override
   public void onBindInput() {
     super.onBindInput();
@@ -566,6 +612,13 @@
   }
 
   @Override
+  public void onUpdateCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+    if (viewManager != null) {
+      viewManager.setCursorAnchorInfo(cursorAnchorInfo);
+    }
+  }
+
+  @Override
   public MozcInputMethod onCreateInputMethodInterface() {
     return new MozcInputMethod();
   }
@@ -579,9 +632,10 @@
     // Callback object mainly used by views.
     MozcEventListener eventListener = new MozcEventListener();
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+    Preconditions.checkNotNull(sharedPreferences);
     SessionExecutor sessionExecutor =
         SessionExecutor.getInstanceInitializedIfNecessary(
-            new SessionHandlerFactory(sharedPreferences), this);
+            new SessionHandlerFactory(Optional.of(sharedPreferences)), this);
     onCreateInternal(eventListener, null, sharedPreferences, getConfiguration(),
                      sessionExecutor);
 
@@ -598,9 +652,9 @@
   }
 
   @VisibleForTesting
-  void onCreateInternal(ViewEventListener eventListener, ViewManagerInterface viewManager,
-                        SharedPreferences sharedPreferences, Configuration deviceConfiguration,
-                        SessionExecutor sessionExecutor) {
+  void onCreateInternal(ViewEventListener eventListener, @Nullable ViewManagerInterface viewManager,
+                        @Nullable SharedPreferences sharedPreferences,
+                        Configuration deviceConfiguration, SessionExecutor sessionExecutor) {
     super.onCreate();
 
     Context context = getApplicationContext();
@@ -614,8 +668,8 @@
     prepareOnce(eventListener, symbolHistoryStorage, viewManager, sharedPreferences);
     prepareEveryTime(sharedPreferences, deviceConfiguration);
 
-    if (propagatedClientSidePreference == null ||
-        propagatedClientSidePreference.getHardwareKeyMap() == null) {
+    if (propagatedClientSidePreference == null
+        || propagatedClientSidePreference.getHardwareKeyMap() == null) {
       HardwareKeyboardSpecification.maybeSetDetectedHardwareKeyMap(
           sharedPreferences, deviceConfiguration, false);
     }
@@ -630,14 +684,15 @@
    * Prepares something which should be done every time when the session is newly created.
    */
   private void prepareEveryTime(
-      SharedPreferences sharedPreferences, Configuration deviceConfiguration) {
-    boolean isLogging = sharedPreferences != null &&
-            sharedPreferences.getBoolean(PREF_TWEAK_LOGGING_PROTOCOL_BUFFERS, false);
+      @Nullable SharedPreferences sharedPreferences, Configuration deviceConfiguration) {
+    boolean isLogging = sharedPreferences != null
+        && sharedPreferences.getBoolean(PREF_TWEAK_LOGGING_PROTOCOL_BUFFERS, false);
     // Force to initialize here.
-    sessionExecutor.reset(new SessionHandlerFactory(sharedPreferences), this);
+    sessionExecutor.reset(
+        new SessionHandlerFactory(Optional.fromNullable(sharedPreferences)), this);
     sessionExecutor.setLogging(isLogging);
 
-    updateImposedConfig(getConfiguration());
+    updateImposedConfig();
     viewManager.onConfigurationChanged(getConfiguration());
     // Make sure that the server and the client have the same keyboard specification.
     // User preference's keyboard will be set after this step.
@@ -646,11 +701,12 @@
         Collections.<TouchEvent>emptyList());
     if (sharedPreferences != null) {
       propagateClientSidePreference(
-          new ClientSidePreference(sharedPreferences, deviceConfiguration.orientation));
+          new ClientSidePreference(
+              sharedPreferences, getResources(), deviceConfiguration.orientation));
       // TODO(hidehiko): here we just set the config based on preferences. When we start
       //   to support sync on Android, we need to revisit the config related design.
       sessionExecutor.setConfig(ConfigUtil.toConfig(sharedPreferences));
-      sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+      sessionExecutor.preferenceUsageStatsEvent(sharedPreferences, getResources());
     }
 
     maybeSetNarrowMode(deviceConfiguration);
@@ -661,16 +717,17 @@
    */
   private void prepareOnce(ViewEventListener eventListener,
       SymbolHistoryStorage symbolHistoryStorage,
-      ViewManagerInterface viewManager,
-      SharedPreferences sharedPreferences) {
+      @Nullable ViewManagerInterface viewManager,
+      @Nullable SharedPreferences sharedPreferences) {
     Context context = getApplicationContext();
-    boolean omitWelcomeActivity = false;
     Optional<Intent> forwardIntent =
         ApplicationInitializerFactory.createInstance(this).initialize(
-            omitWelcomeActivity,
+            MozcUtil.isSystemApplication(context),
             MozcUtil.isDevChannel(context),
             DependencyFactory.getDependency(getApplicationContext()).isWelcomeActivityPreferrable(),
-            MozcUtil.getAbiIndependentVersionCode(context));
+            MozcUtil.getAbiIndependentVersionCode(context),
+            LauncherIconManagerFactory.getDefaultInstance(),
+            PreferenceUtil.getDefaultPreferenceManagerStatic());
     if (forwardIntent.isPresent()) {
       startActivity(forwardIntent.get());
     }
@@ -684,7 +741,7 @@
               eventListener,
               symbolHistoryStorage,
               imeSwitcher,
-              new MozcMenuDialogListenerImpl(this, imeSwitcher));
+              new MozcMenuDialogListenerImpl(this));
     }
 
     // Setup FeedbackManager.
@@ -714,7 +771,7 @@
     return inputView;
   }
 
-  void resetContext() {
+  private void resetContext() {
     if (sessionExecutor != null) {
       sessionExecutor.resetContext();
     }
@@ -740,16 +797,16 @@
 
     // Update full screen mode, because the application may be changed.
     viewManager.setFullscreenMode(
-        applicationCompatibility.isFullScreenModeSupported() &&
-        propagatedClientSidePreference != null &&
-        propagatedClientSidePreference.isFullscreenMode());
+        applicationCompatibility.isFullScreenModeSupported()
+        && propagatedClientSidePreference != null
+        && propagatedClientSidePreference.isFullscreenMode());
 
     // Some applications, e.g. gmail or maps, send onStartInput with restarting = true, when a user
     // rotates a device. In such cases, we don't want to update caret positions, nor reset
     // the context basically. However, some other applications, such as one with a webview widget
     // like a browser, send onStartInput with restarting = true, too. Unfortunately,
     // there seems no way to figure out which one causes this invocation.
-    // So, as a point of compromise, we reset the context everytime here. Also, we'll send
+    // So, as a point of compromise, we reset the context every time here. Also, we'll send
     // finishComposingText as well, in case the new attached field has already had composing text
     // (we hit such a situation on webview, too).
     // See also onConfigurationChanged for caret position handling on gmail-like applications'
@@ -778,7 +835,7 @@
    * field, commit it. Then, (regardless of whether there exists pending result,) clears
    * all remaining pending result.
    */
-  static void maybeCommitMushroomResult(EditorInfo attribute, InputConnection connection) {
+  private static void maybeCommitMushroomResult(EditorInfo attribute, InputConnection connection) {
     if (connection == null) {
       return;
     }
@@ -796,10 +853,20 @@
     }
   }
 
+  @SuppressLint("NewApi")
+  private static boolean enableCursorAnchorInfo(InputConnection connection) {
+    Preconditions.checkNotNull(connection);
+    if (Build.VERSION.SDK_INT < 21) {
+      return false;
+    }
+    return connection.requestCursorUpdates(
+        InputConnection.CURSOR_UPDATE_IMMEDIATE | InputConnection.CURSOR_UPDATE_MONITOR);
+  }
+
   /**
    * @return true if connected view is WebEditText (or the application pretends it)
    */
-  boolean isWebEditText(EditorInfo editorInfo) {
+  private boolean isWebEditText(EditorInfo editorInfo) {
     if (editorInfo == null) {
       return false;
     }
@@ -816,16 +883,26 @@
 
   @Override
   public void onStartInputView(EditorInfo attribute, boolean restarting) {
+    InputConnection inputConnection = getCurrentInputConnection();
+    if (inputConnection != null && Build.VERSION.SDK_INT >= 21) {
+      viewManager.setCursorAnchorInfoEnabled(enableCursorAnchorInfo(inputConnection));
+      updateImposedConfig();
+    }
+
     viewManager.setTextForActionButton(getTextForImeAction(attribute.imeOptions));
     viewManager.setEditorInfo(attribute);
+    // updateXxxxxButtonEnabled cannot be placed in onStartInput because
+    // the view might be created after onStartInput with *reset* status.
+    viewManager.updateGlobeButtonEnabled();
+    viewManager.updateMicrophoneButtonEnabled();
   }
 
   static InputFieldType getInputFieldType(EditorInfo attribute) {
     int inputType = attribute.inputType;
-    int inputClass = inputType & InputType.TYPE_MASK_CLASS;
-    if (MozcUtil.isPasswordField(attribute)) {
+    if (MozcUtil.isPasswordField(inputType)) {
       return InputFieldType.PASSWORD;
     }
+    int inputClass = inputType & InputType.TYPE_MASK_CLASS;
     if (inputClass == InputType.TYPE_CLASS_PHONE) {
       return InputFieldType.TEL;
     }
@@ -867,6 +944,8 @@
     return super.onGenericMotionEvent(event);
   }
 
+  @SuppressLint("DefaultLocale")
+  @VisibleForTesting
   boolean onKeyDownInternal(int keyCode, KeyEvent event, Configuration configuration) {
     if (MozcLog.isLoggable(Log.DEBUG)) {
       MozcLog.d(
@@ -893,7 +972,7 @@
       return super.onKeyDown(keyCode, event);
     }
 
-    // Push the event to the asyncronous execution queue if it should be processed
+    // Push the event to the asynchronous execution queue if it should be processed
     // directly in the view.
     if (viewManager.isKeyConsumedOnViewAsynchronously(event)) {
       sessionExecutor.sendKeyEvent(KeycodeConverter.getKeyEventInterface(event),
@@ -902,28 +981,17 @@
     }
 
     // Lazy evaluation.
-    // If hardware keybaord is not set in the preference screen,
+    // If hardware keyboard is not set in the preference screen,
     // set it based on the configuration.
-    if (propagatedClientSidePreference == null ||
-        propagatedClientSidePreference.getHardwareKeyMap() == null) {
+    if (propagatedClientSidePreference == null
+        || propagatedClientSidePreference.getHardwareKeyMap() == null) {
       HardwareKeyboardSpecification.maybeSetDetectedHardwareKeyMap(
           sharedPreferences, configuration, true);
     }
 
     // Here we decided to send the event to the server.
 
-    // Maybe update the composition mode based on the event.
-    // For example, zen/han key toggles the composition mode (hiragana <--> alphabet).
-    CompositionMode compositionMode = hardwareKeyboard.getCompositionMode();
-    hardwareKeyboard.setCompositionModeByKey(event);
-    CompositionMode currentCompositionMode = hardwareKeyboard.getCompositionMode();
-    if (currentCompositionMode != compositionMode) {
-      viewManager.setHardwareKeyboardCompositionMode(currentCompositionMode);
-    }
-    sendKeyWithKeyboardSpecification(
-        hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
-        hardwareKeyboard.getKeyboardSpecification(), configuration,
-        Collections.<TouchEvent>emptyList());
+    viewManager.onHardwareKeyEvent(event);
     return true;
   }
 
@@ -973,10 +1041,15 @@
    */
   @VisibleForTesting
   void sendKeyWithKeyboardSpecification(
-      ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface event,
-      KeyboardSpecification keyboardSpecification, Configuration configuration,
-      List<? extends TouchEvent> touchEventList) {
-    if (currentKeyboardSpecification != keyboardSpecification) {
+      @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface event,
+      @Nullable KeyboardSpecification keyboardSpecification, Configuration configuration,
+      List<TouchEvent> touchEventList) {
+    if (keyboardSpecification != null && currentKeyboardSpecification != keyboardSpecification) {
+      // Submit composition on the transition from software KB to hardware KB by key event.
+      if (!currentKeyboardSpecification.isHardwareKeyboard()
+          && keyboardSpecification.isHardwareKeyboard()) {
+        sessionExecutor.submit(renderResultCallback);
+      }
       changeKeyboardSpecificationAndSendKey(
           mozcKeyEvent, event, keyboardSpecification, configuration, touchEventList);
       updateStatusIcon();
@@ -991,31 +1064,26 @@
   }
 
   /**
-   * Sends Request for changing keybaord setting to mozc server and sends key.
+   * Sends Request for changing keyboard setting to mozc server and sends key.
    */
   private void changeKeyboardSpecificationAndSendKey(
-      ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface event,
+      @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface event,
       KeyboardSpecification keyboardSpecification, Configuration configuration,
-      List<? extends TouchEvent> touchEventList) {
+      List<TouchEvent> touchEventList) {
     // Send Request to change composition table.
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            keyboardSpecification.getKeyboardSpecificationName(),
-            Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
-            Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
-            configuration),
+        MozcUtil.getRequestBuilder(getResources(), keyboardSpecification, configuration).build(),
         touchEventList);
     if (mozcKeyEvent == null) {
       // Change composition mode.
-      sessionExecutor.switchInputMode(event, keyboardSpecification.getCompositionMode(),
-                                      renderResultCallback);
+      sessionExecutor.switchInputMode(
+          Optional.fromNullable(event), keyboardSpecification.getCompositionMode(),
+          renderResultCallback);
     } else {
       // Send key with composition mode change.
       sessionExecutor.sendKey(
           ProtoCommands.KeyEvent.newBuilder(mozcKeyEvent)
-          .setMode(keyboardSpecification.getCompositionMode()).build(),
+              .setMode(keyboardSpecification.getCompositionMode()).build(),
           event, touchEventList, renderResultCallback);
     }
     currentKeyboardSpecification = keyboardSpecification;
@@ -1035,7 +1103,7 @@
   /**
    * Shows the status icon basing on the current keyboard spec.
    */
-  void showStatusIcon() {
+  private void showStatusIcon() {
     switch (currentKeyboardSpecification.getCompositionMode()) {
       case HIRAGANA:
         showStatusIcon(R.drawable.status_icon_hiragana);
@@ -1052,6 +1120,17 @@
   }
 
   @Override
+  public boolean onShowInputRequested(int flags, boolean configChange) {
+    boolean result = super.onShowInputRequested(flags, configChange);
+    boolean isHardwareKeyboardConnected =
+        getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS;
+    // Original result becomes false when a hardware keyboard is connected.
+    // This means that the window won't be shown in such situation.
+    // We want to show it even with a hardware keyboard so override the result here.
+    return result || isHardwareKeyboardConnected;
+  }
+
+  @Override
   public void onWindowShown() {
     showStatusIcon();
     // Remove memory trimming message.
@@ -1070,7 +1149,7 @@
   public void onWindowHidden() {
     // "Hiding IME's window" is very similar to "Turning off IME" for PC.
     // Thus
-    // - Commiting composing text.
+    // - Committing composing text.
     // - Removing all pending messages.
     // - Resetting Mozc server
     // are needed.
@@ -1096,6 +1175,7 @@
    * @param keyEvent Trigger event for this calling. When direct input is
    *        needed, this event is sent to InputConnection.
    */
+  @VisibleForTesting
   void renderInputConnection(Command command, @Nullable KeyEventInterface keyEvent) {
     Preconditions.checkNotNull(command);
 
@@ -1115,8 +1195,8 @@
     // case, the command is consumed by Mozc server and the application cannot get the key event.
     // To avoid such situation, we should send the key event back to application. b/13238551
     // The command itself is consumed by Mozc server, so we should NOT put a return statement here.
-    if (keyEvent != null && keyEvent.getNativeEvent() != null &&
-        KeycodeConverter.isMetaKey(keyEvent.getNativeEvent())) {
+    if (keyEvent != null && keyEvent.getNativeEvent().isPresent()
+        && KeycodeConverter.isMetaKey(keyEvent.getNativeEvent().get())) {
       sendKeyEvent(keyEvent);
     }
 
@@ -1136,7 +1216,8 @@
     }
   }
 
-  static KeyEvent createKeyEvent(KeyEvent original, long eventTime, int action, int repeatCount) {
+  private static KeyEvent createKeyEvent(
+      KeyEvent original, long eventTime, int action, int repeatCount) {
     return new KeyEvent(
         original.getDownTime(), eventTime, action, original.getKeyCode(),
         repeatCount, original.getMetaState(), original.getDeviceId(), original.getScanCode(),
@@ -1146,7 +1227,7 @@
   /**
    * Sends the {@code KeyEvent}, which is not consumed by the mozc server.
    */
-  void sendKeyEvent(KeyEventInterface keyEvent) {
+  @VisibleForTesting void sendKeyEvent(KeyEventInterface keyEvent) {
     if (keyEvent == null) {
       return;
     }
@@ -1159,24 +1240,24 @@
     }
 
     // Following code is to fallback to target activity.
-    KeyEvent nativeKeyEvent = keyEvent.getNativeEvent();
+    Optional<KeyEvent> nativeKeyEvent = keyEvent.getNativeEvent();
     InputConnection inputConnection = getCurrentInputConnection();
 
-    if (nativeKeyEvent != null && inputConnection != null) {
+    if (nativeKeyEvent.isPresent() && inputConnection != null) {
       // Meta keys are from this.onKeyDown/Up so fallback each time.
-      if (KeycodeConverter.isMetaKey(nativeKeyEvent)) {
+      if (KeycodeConverter.isMetaKey(nativeKeyEvent.get())) {
         inputConnection.sendKeyEvent(createKeyEvent(
-            nativeKeyEvent, MozcUtil.getUptimeMillis(),
-            nativeKeyEvent.getAction(), nativeKeyEvent.getRepeatCount()));
+            nativeKeyEvent.get(), MozcUtil.getUptimeMillis(),
+            nativeKeyEvent.get().getAction(), nativeKeyEvent.get().getRepeatCount()));
         return;
       }
 
       // Other keys are from this.onKeyDown so create dummy Down/Up events.
       inputConnection.sendKeyEvent(createKeyEvent(
-          nativeKeyEvent, MozcUtil.getUptimeMillis(), KeyEvent.ACTION_DOWN, 0));
+          nativeKeyEvent.get(), MozcUtil.getUptimeMillis(), KeyEvent.ACTION_DOWN, 0));
 
       inputConnection.sendKeyEvent(createKeyEvent(
-          nativeKeyEvent, MozcUtil.getUptimeMillis(), KeyEvent.ACTION_UP, 0));
+          nativeKeyEvent.get(), MozcUtil.getUptimeMillis(), KeyEvent.ACTION_UP, 0));
       return;
     }
 
@@ -1206,13 +1287,33 @@
     if (keyCode != KeyEvent.KEYCODE_ENTER || !isInputViewShown()) {
       return false;
     }
-
-    // Fall back to EditorAction. Note that the keyCode is ENTER here, so set the fromEnterKey
-    // argument true.
-    return sendDefaultEditorAction(true);
+    return sendEditorAction(true);
   }
 
-  static void maybeDeleteSurroundingText(Output output, InputConnection inputConnection) {
+  /**
+   * Sends editor action to {@code InputConnection}.
+   * <p>
+   * The difference from {@link InputMethodService#sendDefaultEditorAction(boolean)} is
+   * that if custom action label is specified {@code EditorInfo#actionId} is sent instead.
+   */
+  private boolean sendEditorAction(boolean fromEnterKey) {
+    // If custom action label is specified (=non-null), special action id is also specified.
+    // If there is no IME_FLAG_NO_ENTER_ACTION option, we should send the id to the InputConnection.
+    EditorInfo editorInfo = getCurrentInputEditorInfo();
+    if (editorInfo != null
+        && (editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0
+        && editorInfo.actionLabel != null) {
+      InputConnection inputConnection = getCurrentInputConnection();
+      if (inputConnection != null) {
+        inputConnection.performEditorAction(editorInfo.actionId);
+        return true;
+      }
+    }
+    // No custom action label is specified. Fall back to default EditorAction.
+    return sendDefaultEditorAction(fromEnterKey);
+  }
+
+  private static void maybeDeleteSurroundingText(Output output, InputConnection inputConnection) {
     if (!output.hasDeletionRange()) {
       return;
     }
@@ -1232,7 +1333,7 @@
     }
   }
 
-  static void maybeCommitText(Output output, InputConnection inputConnection) {
+  private static void maybeCommitText(Output output, InputConnection inputConnection) {
     if (!output.hasResult()) {
       return;
     }
@@ -1245,8 +1346,8 @@
 
     int position = MozcUtil.CURSOR_POSITION_TAIL;
     if (output.getResult().hasCursorOffset()) {
-      if (output.getResult().getCursorOffset() ==
-          -outputText.codePointCount(0, outputText.length())) {
+      if (output.getResult().getCursorOffset()
+          == -outputText.codePointCount(0, outputText.length())) {
         position = MozcUtil.CURSOR_POSITION_HEAD;
       } else {
         MozcLog.e("Unsupported position: " + output.getResult().toString());
@@ -1258,7 +1359,7 @@
     }
   }
 
-  void setComposingText(Command command, InputConnection inputConnection) {
+  private void setComposingText(Command command, InputConnection inputConnection) {
     Preconditions.checkNotNull(command);
     Preconditions.checkNotNull(inputConnection);
 
@@ -1274,8 +1375,8 @@
       // To avoid from this issue, we don't clear the composing text if the input
       // is SWITCH_INPUT_MODE.
       Input input = command.getInput();
-      if (input.getType() != Input.CommandType.SEND_COMMAND ||
-          input.getCommand().getType() != SessionCommand.CommandType.SWITCH_INPUT_MODE) {
+      if (input.getType() != Input.CommandType.SEND_COMMAND
+          || input.getCommand().getType() != SessionCommand.CommandType.SWITCH_INPUT_MODE) {
         if (!inputConnection.setComposingText("", 0)) {
           MozcLog.e("Failed to set composing text.");
         }
@@ -1289,14 +1390,6 @@
     SpannableStringBuilder builder = new SpannableStringBuilder();
     for (Segment segment : preedit.getSegmentList()) {
       builder.append(segment.getValue());
-      if (segment.hasAnnotation() && segment.getAnnotation() == Annotation.HIGHLIGHT) {
-        // Highlight for the focused conversion part.
-        builder.setSpan(
-            SPAN_CONVERT_HIGHLIGHT,
-            builder.length() - segment.getValue().length(),
-            builder.length(),
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-      }
     }
 
     // Set underline for all the preedit text.
@@ -1304,18 +1397,30 @@
 
     // Draw cursor if in composition mode.
     int cursor = preedit.getCursor();
-    if (!(output.hasAllCandidateWords() &&
-          output.getAllCandidateWords().hasCategory() &&
-          output.getAllCandidateWords().getCategory() == ProtoCandidates.Category.CONVERSION)) {
+    int spanFlags = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING;
+    if (output.hasAllCandidateWords()
+        && output.getAllCandidateWords().hasCategory()
+        && output.getAllCandidateWords().getCategory() == ProtoCandidates.Category.CONVERSION) {
+      int offsetInString = 0;
+      for (Segment segment : preedit.getSegmentList()) {
+        int length = segment.getValue().length();
+        builder.setSpan(
+            segment.hasAnnotation() && segment.getAnnotation() == Annotation.HIGHLIGHT
+                ? SPAN_CONVERT_HIGHLIGHT
+                : CharacterStyle.class.cast(new BackgroundColorSpan(CONVERT_NORMAL_COLOR)),
+            offsetInString, offsetInString + length, spanFlags);
+        offsetInString += length;
+      }
+    } else {
       // We cannot show system cursor inside preedit here.
       // Instead we change text style before the preedit's cursor.
+      int cursorOffsetInString = builder.toString().offsetByCodePoints(0, cursor);
       if (cursor != builder.length()) {
-        // This condition is workaround not to show unexpected background color for EditText.
-        builder.setSpan(SPAN_PARTIAL_SUGGESTION_COLOR, cursor, builder.length(),
-                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        builder.setSpan(SPAN_PARTIAL_SUGGESTION_COLOR, cursorOffsetInString, builder.length(),
+                        spanFlags);
       }
       if (cursor > 0) {
-        builder.setSpan(SPAN_BEFORE_CURSOR, 0, cursor, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        builder.setSpan(SPAN_BEFORE_CURSOR, 0, cursorOffsetInString, spanFlags);
       }
     }
 
@@ -1327,7 +1432,7 @@
     }
   }
 
-  void maybeSetSelection(Output output, InputConnection inputConnection) {
+  private void maybeSetSelection(Output output, InputConnection inputConnection) {
     if (!output.hasPreedit()) {
       return;
     }
@@ -1382,68 +1487,71 @@
       return;
     }
     ClientSidePreference oldPreference = propagatedClientSidePreference;
-    if (oldPreference == null ||
-        oldPreference.isHapticFeedbackEnabled() != newPreference.isHapticFeedbackEnabled()) {
+    if (oldPreference == null
+        || oldPreference.isHapticFeedbackEnabled() != newPreference.isHapticFeedbackEnabled()) {
       feedbackManager.setHapticFeedbackEnabled(newPreference.isHapticFeedbackEnabled());
     }
-    if (oldPreference == null ||
-        oldPreference.getHapticFeedbackDuration() != newPreference.getHapticFeedbackDuration()) {
+    if (oldPreference == null
+        || oldPreference.getHapticFeedbackDuration() != newPreference.getHapticFeedbackDuration()) {
       feedbackManager.setHapticFeedbackDuration(newPreference.getHapticFeedbackDuration());
     }
-    if (oldPreference == null ||
-        oldPreference.isSoundFeedbackEnabled() != newPreference.isSoundFeedbackEnabled()) {
+    if (oldPreference == null
+        || oldPreference.isSoundFeedbackEnabled() != newPreference.isSoundFeedbackEnabled()) {
       feedbackManager.setSoundFeedbackEnabled(newPreference.isSoundFeedbackEnabled());
     }
-    if (oldPreference == null ||
-        oldPreference.getSoundFeedbackVolume() != newPreference.getSoundFeedbackVolume()) {
-      // The default value is 0.1f. In order to set the 50 to the default value, divide the
-      // preference value by 500f heuristically.
-      feedbackManager.setSoundFeedbackVolume(newPreference.getSoundFeedbackVolume() / 500f);
+    if (oldPreference == null
+        || oldPreference.getSoundFeedbackVolume() != newPreference.getSoundFeedbackVolume()) {
+      // The default value is 0.4f. In order to set the 50 to the default value, divide the
+      // preference value by 125f heuristically.
+      feedbackManager.setSoundFeedbackVolume(newPreference.getSoundFeedbackVolume() / 125f);
     }
-    if (oldPreference == null ||
-        oldPreference.isPopupFeedbackEnabled() != newPreference.isPopupFeedbackEnabled()) {
+    if (oldPreference == null
+        || oldPreference.isPopupFeedbackEnabled() != newPreference.isPopupFeedbackEnabled()) {
       viewManager.setPopupEnabled(newPreference.isPopupFeedbackEnabled());
     }
-    if (oldPreference == null ||
-        oldPreference.getKeyboardLayout() != newPreference.getKeyboardLayout()) {
+    if (oldPreference == null
+        || oldPreference.getKeyboardLayout() != newPreference.getKeyboardLayout()) {
       viewManager.setKeyboardLayout(newPreference.getKeyboardLayout());
     }
-    if (oldPreference == null ||
-        oldPreference.getInputStyle() != newPreference.getInputStyle()) {
+    if (oldPreference == null
+        || oldPreference.getInputStyle() != newPreference.getInputStyle()) {
       viewManager.setInputStyle(newPreference.getInputStyle());
     }
-    if (oldPreference == null ||
-        oldPreference.isQwertyLayoutForAlphabet() != newPreference.isQwertyLayoutForAlphabet()) {
+    if (oldPreference == null
+        || oldPreference.isQwertyLayoutForAlphabet() != newPreference.isQwertyLayoutForAlphabet()) {
       viewManager.setQwertyLayoutForAlphabet(newPreference.isQwertyLayoutForAlphabet());
     }
-    if (oldPreference == null ||
-        oldPreference.isFullscreenMode() != newPreference.isFullscreenMode()) {
+    if (oldPreference == null
+        || oldPreference.isFullscreenMode() != newPreference.isFullscreenMode()) {
       viewManager.setFullscreenMode(
-          applicationCompatibility.isFullScreenModeSupported() &&
-          newPreference.isFullscreenMode());
+          applicationCompatibility.isFullScreenModeSupported() && newPreference.isFullscreenMode());
     }
-    if (oldPreference == null ||
-        oldPreference.getFlickSensitivity() != newPreference.getFlickSensitivity()) {
+    if (oldPreference == null
+        || oldPreference.getFlickSensitivity() != newPreference.getFlickSensitivity()) {
       viewManager.setFlickSensitivity(newPreference.getFlickSensitivity());
     }
-    if (oldPreference == null ||
-        oldPreference.getEmojiProviderType() != newPreference.getEmojiProviderType()) {
+    if (oldPreference == null
+        || oldPreference.getEmojiProviderType() != newPreference.getEmojiProviderType()) {
       viewManager.setEmojiProviderType(newPreference.getEmojiProviderType());
     }
-    if (oldPreference == null ||
-        oldPreference.getHardwareKeyMap() != newPreference.getHardwareKeyMap()) {
-      hardwareKeyboard.setHardwareKeyMap(newPreference.getHardwareKeyMap());
+    if (oldPreference == null
+        || oldPreference.getHardwareKeyMap() != newPreference.getHardwareKeyMap()) {
+      viewManager.setHardwareKeyMap(newPreference.getHardwareKeyMap());
     }
-    if (oldPreference == null ||
-        oldPreference.getSkinType() != newPreference.getSkinType()) {
-      viewManager.setSkinType(newPreference.getSkinType());
+    if (oldPreference == null
+        || oldPreference.getSkinType() != newPreference.getSkinType()) {
+      viewManager.setSkin(newPreference.getSkinType().getSkin(getResources()));
     }
-    if (oldPreference == null ||
-        oldPreference.getLayoutAdjustment() != newPreference.getLayoutAdjustment()) {
-      viewManager.setLayoutAdjustment(getResources(), newPreference.getLayoutAdjustment());
+    if (oldPreference == null
+        || oldPreference.isMicrophoneButtonEnabled() != newPreference.isMicrophoneButtonEnabled()) {
+      viewManager.setMicrophoneButtonEnabledByPreference(newPreference.isMicrophoneButtonEnabled());
     }
-    if (oldPreference == null ||
-        oldPreference.getKeyboardHeightRatio() != newPreference.getKeyboardHeightRatio()) {
+    if (oldPreference == null
+        || oldPreference.getLayoutAdjustment() != newPreference.getLayoutAdjustment()) {
+      viewManager.setLayoutAdjustment(newPreference.getLayoutAdjustment());
+    }
+    if (oldPreference == null
+        || oldPreference.getKeyboardHeightRatio() != newPreference.getKeyboardHeightRatio()) {
       viewManager.setKeyboardHeightRatio(newPreference.getKeyboardHeightRatio());
     }
 
@@ -1455,18 +1563,17 @@
    *
    * Some config items should be mobile ones.
    * For example, "selection shortcut" should be disabled on software keyboard
-   * regardless of stored config.
-   * Imposed config should be based on device configuration
-   * but currently we ignore device config because we currently do not support
-   * hardware keyboard.
-   *
-   * @param deviceConfig the current device configuration
+   * regardless of stored config if there is no hardware keyboard.
    */
-  private void updateImposedConfig(Configuration deviceConfig) {
+  private void updateImposedConfig() {
+    // TODO(hsumita): Respect Config.SelectionShortcut.
+    SelectionShortcut shortcutMode = (viewManager != null && viewManager.isFloatingCandidateMode())
+        ? SelectionShortcut.SHORTCUT_123456789 : SelectionShortcut.NO_SHORTCUT;
+
     // TODO(matsuzakit): deviceConfig should be used to set following config items.
     sessionExecutor.setImposedConfig(Config.newBuilder()
         .setSessionKeymap(SessionKeymap.MOBILE)
-        .setSelectionShortcut(SelectionShortcut.NO_SHORTCUT)
+        .setSelectionShortcut(shortcutMode)
         .setUseEmojiConversion(true)
         .build());
   }
@@ -1487,20 +1594,21 @@
         return;
       }
       propagateClientSidePreference(
-          new ClientSidePreference(sharedPreferences, getConfiguration().orientation));
+          new ClientSidePreference(
+              sharedPreferences, getResources(), getConfiguration().orientation));
       sessionExecutor.setConfig(ConfigUtil.toConfig(sharedPreferences));
-      sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+      sessionExecutor.preferenceUsageStatsEvent(sharedPreferences, getResources());
     }
   }
 
-  void maybeSetNarrowMode(Configuration configuration) {
+  @VisibleForTesting void maybeSetNarrowMode(Configuration configuration) {
     // If given hardKeyboardHidden is equal to current one, skip updating narrow mode.
     // In other words, only hardKeyboardHidden flag changes narrow mode automatically.
     // This behavior is beneficial for a user who want to change narrow/full mode manually
-    // because this method keeps current narrow mode unless hardwarekeyboard connection is changed.
+    // because this method keeps current narrow mode unless hardware keyboard connection is changed.
     if (viewManager != null && configuration.hardKeyboardHidden != currentHardKeyboardHidden) {
       currentHardKeyboardHidden = configuration.hardKeyboardHidden;
-      switch(currentHardKeyboardHidden) {
+      switch (currentHardKeyboardHidden) {
         case Configuration.HARDKEYBOARDHIDDEN_NO:
           if (!viewManager.isNarrowMode()) {
             viewManager.hideSubInputView();
@@ -1518,7 +1626,7 @@
     }
   }
 
-  void onConfigurationChangedInternal(Configuration newConfig) {
+  @VisibleForTesting void onConfigurationChangedInternal(Configuration newConfig) {
     InputConnection inputConnection = getCurrentInputConnection();
     if (inputConnection != null) {
       if (inputBound) {
@@ -1544,12 +1652,16 @@
     resetContext();
     selectionTracker.onConfigurationChanged();
 
+    sessionExecutor.updateRequest(
+        MozcUtil.getRequestBuilder(getResources(), currentKeyboardSpecification, newConfig).build(),
+        Collections.<TouchEvent>emptyList());
+
     // NOTE : This method is not called at the time when the service is started.
-    // Based on newConfig, imposed config and client side prefereces should be sent
+    // Based on newConfig, client side preferences should be sent
     // because they change based on device config.
-    updateImposedConfig(newConfig);
     propagateClientSidePreference(new ClientSidePreference(
-        PreferenceManager.getDefaultSharedPreferences(this), newConfig.orientation));
+        Preconditions.checkNotNull(PreferenceManager.getDefaultSharedPreferences(this)),
+        getResources(), newConfig.orientation));
     maybeSetNarrowMode(newConfig);
     viewManager.onConfigurationChanged(newConfig);
   }
@@ -1562,6 +1674,7 @@
     super.onConfigurationChanged(newConfig);
   }
 
+  @VisibleForTesting
   void onUpdateSelectionInternal(int oldSelStart, int oldSelEnd,
                                  int newSelStart, int newSelEnd,
                                  int candidatesStart, int candidatesEnd) {
@@ -1643,11 +1756,6 @@
     return eventListener;
   }
 
-  /**
-   * attachBaseContext is defined with protected visibility in
-   * {@link android.content.ContextWrapper} but this is required for testing.
-   * Here just makes it public.
-   */
   @Override
   @VisibleForTesting
   public void attachBaseContext(Context base) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java b/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
index a65ec44..761250a 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
@@ -29,10 +29,8 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
 import org.mozc.android.inputmethod.japanese.util.ResourcesWrapper;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
@@ -182,6 +180,9 @@
   private static Optional<Boolean> isDevChannel = Optional.<Boolean>absent();
   private static Optional<Boolean> isMozcEnabled = Optional.<Boolean>absent();
   private static Optional<Boolean> isMozcDefaultIme = Optional.<Boolean>absent();
+  private static Optional<Boolean> isSystemApplication = Optional.<Boolean>absent();
+  private static Optional<Boolean> isTouchUI = Optional.<Boolean>absent();
+  private static Optional<Boolean> isUpdatedSystemApplication = Optional.<Boolean>absent();
   private static Optional<Integer> versionCode = Optional.<Integer>absent();
   private static Optional<Long> uptimeMillis = Optional.<Long>absent();
 
@@ -250,6 +251,38 @@
     return isDevChannelVersionName(getVersionName(context));
   }
 
+  public static final boolean isSystemApplication(Context context) {
+    Preconditions.checkNotNull(context);
+    if (isSystemApplication.isPresent()) {
+      return isSystemApplication.get();
+    }
+    return checkApplicationFlag(context, ApplicationInfo.FLAG_SYSTEM);
+  }
+
+  /**
+   * For testing purpose.
+   * @param isSystemApplication Optional.absent() if default behavior is preferable
+   */
+  public static final void setSystemApplication(Optional<Boolean> isSystemApplication) {
+    MozcUtil.isSystemApplication = Preconditions.checkNotNull(isSystemApplication);
+  }
+
+  public static final boolean isUpdatedSystemApplication(Context context) {
+    Preconditions.checkNotNull(context);
+    if (isUpdatedSystemApplication.isPresent()) {
+      return isUpdatedSystemApplication.get();
+    }
+    return checkApplicationFlag(context, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
+  }
+
+  /**
+   * For testing purpose.
+   * @param isUpdatedSystemApplication Optional.absent() if default behavior is preferable
+   */
+  public static final void setUpdatedSystemApplication(
+      Optional<Boolean> isUpdatedSystemApplication) {
+    MozcUtil.isUpdatedSystemApplication = Preconditions.checkNotNull(isUpdatedSystemApplication);
+  }
 
   /**
    * Gets version name.
@@ -437,6 +470,26 @@
     return Optional.absent();
   }
 
+  /**
+   * Returns true is touch UI should be shown.
+   */
+  public static boolean isTouchUI(Context context) {
+    Preconditions.checkNotNull(context);
+    if (isTouchUI.isPresent()) {
+      return isTouchUI.get();
+    }
+    return context.getResources().getConfiguration().touchscreen
+               != Configuration.TOUCHSCREEN_NOTOUCH;
+  }
+
+  /**
+   * For testing purpose.
+   *
+   * @param isTouchUI Optional.absent() if default behavior is preferable
+   */
+  public static final void setTouchUI(Optional<Boolean> isTouchUI) {
+    MozcUtil.isTouchUI = Preconditions.checkNotNull(isTouchUI);
+  }
 
   public static long getUptimeMillis() {
     if (uptimeMillis.isPresent()) {
@@ -557,69 +610,102 @@
     window.setAttributes(layoutParams);
   }
 
-  public static Request getRequestForKeyboard(
-      KeyboardSpecificationName specName,
-      Optional<SpecialRomanjiTable> romanjiTable,
-      Optional<SpaceOnAlphanumeric> spaceOnAlphanumeric,
-      Optional<Boolean> isKanaModifierInsensitiveConversion,
-      Optional<CrossingEdgeBehavior> crossingEdgeBehavior,
-      Configuration configuration) {
-    Preconditions.checkNotNull(specName);
-    Preconditions.checkNotNull(romanjiTable);
-    Preconditions.checkNotNull(spaceOnAlphanumeric);
-    Preconditions.checkNotNull(isKanaModifierInsensitiveConversion);
-    Preconditions.checkNotNull(crossingEdgeBehavior);
+  private static Request.Builder getRequestBuilderInternal(
+      KeyboardSpecification specification, Configuration configuration) {
+    return Request.newBuilder()
+        .setKeyboardName(
+            specification.getKeyboardSpecificationName().formattedKeyboardName(configuration))
+        .setSpecialRomanjiTable(specification.getSpecialRomanjiTable())
+        .setSpaceOnAlphanumeric(specification.getSpaceOnAlphanumeric())
+        .setKanaModifierInsensitiveConversion(
+            specification.isKanaModifierInsensitiveConversion())
+        .setCrossingEdgeBehavior(specification.getCrossingEdgeBehavior());
+  }
+
+  private static void setHardwareKeyboardRequest(Request.Builder builder, Resources resources) {
+    builder.setMixedConversion(false)
+        .setZeroQuerySuggestion(false)
+        .setUpdateInputModeFromSurroundingText(true)
+        .setAutoPartialSuggestion(false)
+        .setCandidatePageSize(resources.getInteger(R.integer.floating_candidate_candidate_num));
+  }
+
+  public static void setSoftwareKeyboardRequest(Request.Builder builder) {
+    builder.setMixedConversion(true)
+        .setZeroQuerySuggestion(true)
+        .setUpdateInputModeFromSurroundingText(false)
+        .setAutoPartialSuggestion(true);
+  }
+
+  public static Request.Builder getRequestBuilder(
+      Resources resources, KeyboardSpecification specification, Configuration configuration) {
+    Preconditions.checkNotNull(resources);
+    Preconditions.checkNotNull(specification);
     Preconditions.checkNotNull(configuration);
-    Request.Builder builder = Request.newBuilder();
-    builder.setKeyboardName(specName.formattedKeyboardName(configuration));
-    if (romanjiTable.isPresent()) {
-      builder.setSpecialRomanjiTable(romanjiTable.get());
+    Request.Builder builder = getRequestBuilderInternal(specification, configuration);
+    if (specification.isHardwareKeyboard()) {
+      setHardwareKeyboardRequest(builder, resources);
+    } else {
+      setSoftwareKeyboardRequest(builder);
     }
-    if (spaceOnAlphanumeric.isPresent()) {
-      builder.setSpaceOnAlphanumeric(spaceOnAlphanumeric.get());
-    }
-    if (isKanaModifierInsensitiveConversion.isPresent()) {
-      builder.setKanaModifierInsensitiveConversion(
-          isKanaModifierInsensitiveConversion.get().booleanValue());
-    }
-    if (crossingEdgeBehavior.isPresent()) {
-      builder.setCrossingEdgeBehavior(crossingEdgeBehavior.get());
-    }
-    return builder.build();
+    return builder;
   }
 
   @SuppressLint("InlinedApi")
-  public static boolean isPasswordField(EditorInfo editorInfo) {
-    Preconditions.checkNotNull(editorInfo);
-    int inputType = editorInfo.inputType;
+  public static boolean isPasswordField(int inputType) {
     int inputClass = inputType & InputType.TYPE_MASK_CLASS;
     int inputVariation = inputType & InputType.TYPE_MASK_VARIATION;
-    return inputClass == InputType.TYPE_CLASS_TEXT &&
-        (inputVariation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ||
-        inputVariation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
-        inputVariation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);
+    return inputClass == InputType.TYPE_CLASS_TEXT
+        && (inputVariation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+            || inputVariation == InputType.TYPE_TEXT_VARIATION_PASSWORD
+            || inputVariation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);
   }
 
   /**
-   * Returns true if the editor accepts microphone input.
+   * Returns true if voice input is preferred by EditorInfo.inputType.
    *
-   * <p>Some editors sends a special record in privateImeOptions. In such situation transition to
-   * Voice IME should be disabled.
+   * <p>Caller should check that voice input is allowed or not by isVoiceInputAllowed().
    */
-  public static boolean isVoiceInputAllowed(EditorInfo editorInfo) {
+  public static boolean isVoiceInputPreferred(EditorInfo editorInfo) {
     Preconditions.checkNotNull(editorInfo);
-    if (editorInfo.privateImeOptions == null) {
-      return true;
+
+    // Check privateImeOptions to ensure the text field supports voice input.
+    if (editorInfo.privateImeOptions != null) {
+      for (String option : editorInfo.privateImeOptions.split(",")) {
+        if (option.equals(IME_OPTION_NO_MICROPHONE)
+            || option.equals(IME_OPTION_NO_MICROPHONE_COMPAT)) {
+          return false;
+        }
+      }
     }
-    for (String option : editorInfo.privateImeOptions.split(",")) {
-      if (option.equals(IME_OPTION_NO_MICROPHONE) ||
-          option.equals(IME_OPTION_NO_MICROPHONE_COMPAT)) {
-        return false;
+
+    int inputType = editorInfo.inputType;
+    if (isNumberKeyboardPreferred(inputType) || isPasswordField(inputType)) {
+      return false;
+    }
+    if ((inputType & EditorInfo.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) {
+      switch (inputType & EditorInfo.TYPE_MASK_VARIATION) {
+        case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+        case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+        case InputType.TYPE_TEXT_VARIATION_URI:
+          return false;
+        default:
+          break;
       }
     }
     return true;
   }
 
+  /** Returns true if number keyboard is preferred by EditorInfo.inputType. */
+  public static boolean isNumberKeyboardPreferred(int inputType) {
+    int typeClass = inputType & InputType.TYPE_MASK_CLASS;
+    // As of API Level 21, following condition equals to "typeClass != InputType.TYPE_CLASS_TEXT".
+    // However type-class might be added in future so safer expression is employed here.
+    return typeClass == InputType.TYPE_CLASS_DATETIME
+        || typeClass == InputType.TYPE_CLASS_NUMBER
+        || typeClass == InputType.TYPE_CLASS_PHONE;
+  }
+
   public static String utf8CStyleByteStringToString(ByteString value) {
     Preconditions.checkNotNull(value);
     // Find '\0' terminator. (if value doesn't contain '\0', the size should be as same as
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
index 5bce6c6..e59f119 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
@@ -29,28 +29,33 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
 import org.mozc.android.inputmethod.japanese.LayoutParamsAnimator.InterpolationListener;
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
 import org.mozc.android.inputmethod.japanese.ui.SideFrameStubProxy;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.inputmethodservice.InputMethodService.Insets;
 import android.os.Handler;
@@ -63,48 +68,50 @@
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.view.animation.TranslateAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
 import android.view.inputmethod.EditorInfo;
 import android.widget.CompoundButton;
 import android.widget.FrameLayout;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 
 import java.util.Collections;
 import java.util.EnumSet;
 
+import javax.annotation.Nullable;
+
 /**
  * Root {@code View} of the MechaMozc.
  * It is expected that instance methods are used after inflation is done.
  *
  */
-public class MozcView extends LinearLayout implements MemoryManageable {
+public class MozcView extends FrameLayout implements MemoryManageable {
 
+  @VisibleForTesting
   static class DimensionPixelSize {
     final int imeWindowPartialWidth;
     final int imeWindowRegionInsetThreshold;
     final int narrowFrameHeight;
     final int narrowImeWindowHeight;
     final int sideFrameWidth;
-    final int translucentBorderHeight;
+    final int buttonFrameHeight;
     public DimensionPixelSize(Resources resources) {
       imeWindowPartialWidth = resources.getDimensionPixelSize(R.dimen.ime_window_partial_width);
       imeWindowRegionInsetThreshold = resources.getDimensionPixelSize(
           R.dimen.ime_window_region_inset_threshold);
       narrowFrameHeight = resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
       narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
-      translucentBorderHeight = resources.getDimensionPixelSize(
-          R.dimen.translucent_border_height);
       sideFrameWidth = resources.getDimensionPixelSize(R.dimen.side_frame_width);
+      buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
     }
   }
 
+  @VisibleForTesting
   static class HeightLinearInterpolationListener implements InterpolationListener {
-    @VisibleForTesting final int fromHeight;
-    @VisibleForTesting final int toHeight;
+    final int fromHeight;
+    final int toHeight;
 
     public HeightLinearInterpolationListener(int fromHeight, int toHeight) {
       this.fromHeight = fromHeight;
@@ -121,20 +128,20 @@
 
   // TODO(hidehiko): Refactor CandidateViewListener along with View structure refactoring.
   class InputFrameFoldButtonClickListener implements OnClickListener {
-    private final ViewEventListener eventListener;
     private final View keyboardView;
+    private final int originalHeight;
     private final long foldDuration;
     private final Interpolator foldKeyboardViewInterpolator;
     private final long expandDuration;
     private final Interpolator expandKeyboardViewInterpolator;
     private final LayoutParamsAnimator layoutParamsAnimator;
     InputFrameFoldButtonClickListener(
-        ViewEventListener eventListener, View keyboardView,
+        View keyboardView, int originalHeight,
         long foldDuration, Interpolator foldKeyboardViewInterpolator,
         long expandDuration, Interpolator expandKeyboardViewInterpolator,
         LayoutParamsAnimator layoutParamsAnimator) {
-      this.eventListener = eventListener;
       this.keyboardView = keyboardView;
+      this.originalHeight = originalHeight;
       this.foldDuration = foldDuration;
       this.foldKeyboardViewInterpolator = foldKeyboardViewInterpolator;
       this.expandDuration = expandDuration;
@@ -144,30 +151,45 @@
 
     @Override
     public void onClick(View v) {
-      if (keyboardView.getHeight() == getInputFrameHeight()) {
-        eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+      if (keyboardView.getHeight() == originalHeight) {
+        if (viewEventListener != null) {
+          viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+        }
         layoutParamsAnimator.startAnimation(
             keyboardView,
             new HeightLinearInterpolationListener(keyboardView.getHeight(), 0),
             foldKeyboardViewInterpolator, foldDuration, 0);
         CompoundButton.class.cast(v).setChecked(true);
       } else {
-        eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+        if (viewEventListener != null) {
+          viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+        }
         layoutParamsAnimator.startAnimation(
             keyboardView,
-            new HeightLinearInterpolationListener(keyboardView.getHeight(), getInputFrameHeight()),
+            new HeightLinearInterpolationListener(keyboardView.getHeight(), originalHeight),
             expandKeyboardViewInterpolator, expandDuration, 0);
         CompoundButton.class.cast(v).setChecked(false);
       }
     }
   }
 
-  // TODO(hidehiko): Move hard coded parameters to dimens.xml or skin.
-  private static final float NARROW_MODE_BUTTON_CORNOR_RADIUS = 3.5f;  // in dip.
-  private static final float NARROW_MODE_BUTTON_LEFT_OFFSET = 2.0f;
-  private static final float NARROW_MODE_BUTTON_TOP_OFFSET = 1.0f;
-  private static final float NARROW_MODE_BUTTON_RIGHT_OFFSET = 2.0f;
-  private static final float NARROW_MODE_BUTTON_BOTTOM_OFFSET = 3.0f;
+  /** Manages background view height. */
+  @VisibleForTesting
+  class SoftwareKeyboardHeightListener implements KeyboardCandidateViewHeightListener {
+    @Override
+    public void onExpanded() {
+      if (!isNarrowMode()) {
+        changeBottomBackgroundHeight(imeWindowHeight);
+      }
+    }
+
+    @Override
+    public void onCollapse() {
+      if (!isNarrowMode() && getSymbolInputView().getVisibility() != VISIBLE) {
+        resetBottomBackgroundHeight();
+      }
+    }
+  }
 
   @VisibleForTesting
   final InOutAnimatedFrameLayout.VisibilityChangeListener onVisibilityChangeListener =
@@ -181,23 +203,22 @@
   private final DimensionPixelSize dimensionPixelSize = new DimensionPixelSize(getResources());
   private final SideFrameStubProxy leftFrameStubProxy = new SideFrameStubProxy();
   private final SideFrameStubProxy rightFrameStubProxy = new SideFrameStubProxy();
-  private final MozcDrawableFactory mozcDrawableFactory = new MozcDrawableFactory(getResources());
 
+  @VisibleForTesting ViewEventListener viewEventListener;
   @VisibleForTesting boolean fullscreenMode = false;
-  boolean narrowMode = false;
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+  @VisibleForTesting boolean narrowMode = false;
+  private boolean buttonFrameVisible = true;
+  private Skin skin = Skin.getFallbackInstance();
   @VisibleForTesting LayoutAdjustment layoutAdjustment = LayoutAdjustment.FILL;
   private int inputFrameHeight = 0;
   @VisibleForTesting int imeWindowHeight = 0;
-  @VisibleForTesting Animation candidateViewInAnimation;
-  @VisibleForTesting Animation candidateViewOutAnimation;
+  @VisibleForTesting int symbolInputViewHeight = 0;
   @VisibleForTesting Animation symbolInputViewInAnimation;
   @VisibleForTesting Animation symbolInputViewOutAnimation;
-  @VisibleForTesting Animation dropShadowCandidateViewInAnimation;
-  @VisibleForTesting Animation dropShadowCandidateViewOutAnimation;
-  @VisibleForTesting Animation dropShadowSymbolInputViewInAnimation;
-  @VisibleForTesting Animation dropShadowSymbolInputViewOutAnimation;
-  @VisibleForTesting boolean isDropShadowExpanded = false;
+  @VisibleForTesting SoftwareKeyboardHeightListener softwareKeyboardHeightListener =
+      new SoftwareKeyboardHeightListener();
+  @VisibleForTesting CandidateViewManager candidateViewManager;
+  @VisibleForTesting boolean allowFloatingCandidateMode;
 
   public MozcView(Context context) {
     super(context);
@@ -207,82 +228,29 @@
     super(context, attrSet);
   }
 
-  private static Drawable createButtonBackgroundDrawable(float density) {
-    return BackgroundDrawableFactory.createPressableDrawable(
-        new RoundRectKeyDrawable(
-            (int) (NARROW_MODE_BUTTON_LEFT_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_TOP_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_RIGHT_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_BOTTOM_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_CORNOR_RADIUS * density),
-            0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E),
-        new RoundRectKeyDrawable(
-            (int) (NARROW_MODE_BUTTON_LEFT_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_TOP_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_RIGHT_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_BOTTOM_OFFSET * density),
-            (int) (NARROW_MODE_BUTTON_CORNOR_RADIUS * density),
-            0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E));
-  }
-
-  @SuppressWarnings("deprecation")
-  private void setupImageButton(ImageView view, int resourceID) {
-    float density = getResources().getDisplayMetrics().density;
-    view.setImageDrawable(mozcDrawableFactory.getDrawable(resourceID).orNull());
-    view.setBackgroundDrawable(createButtonBackgroundDrawable(density));
-    view.setPadding(0, 0, 0, 0);
-  }
-
   private static Animation createAlphaAnimation(float fromAlpha, float toAlpha, long duration) {
     AlphaAnimation animation = new AlphaAnimation(fromAlpha, toAlpha);
     animation.setDuration(duration);
     return animation;
   }
 
-  private static Animation createCandidateViewTransitionAnimation(int fromY, int toY,
-                                                                  float fromAlpha, float toAlpha,
-                                                                  long duration) {
-    AnimationSet animation = new AnimationSet(false);
-    animation.setDuration(duration);
-
-    AlphaAnimation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
-    alphaAnimation.setDuration(duration);
-    animation.addAnimation(alphaAnimation);
-
-    TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, fromY, toY);
-    translateAnimation.setInterpolator(new DecelerateInterpolator());
-    translateAnimation.setDuration(duration);
-    animation.addAnimation(translateAnimation);
-    return animation;
-  }
-
   @Override
   public void onFinishInflate() {
     setKeyboardHeightRatio(100);
 
-    setupImageButton(getWidenButton(), R.raw.hardware__function__close);
-    setupImageButton(getHardwareCompositionButton(), R.raw.qwerty__function__kana__icon);
-
     leftFrameStubProxy.initialize(this,
-                                  R.id.stub_left_frame, R.id.dropshadow_left_short_top,
-                                  R.id.dropshadow_left_long_top, R.id.left_adjust_button,
-                                  R.raw.adjust_arrow_left, 1.0f, R.id.left_dropshadow_short,
-                                  R.id.left_dropshadow_long);
+                                  R.id.stub_left_frame, R.id.left_adjust_button,
+                                  R.raw.adjust_arrow_left);
     rightFrameStubProxy.initialize(this,
-                                   R.id.stub_right_frame, R.id.dropshadow_right_short_top,
-                                   R.id.dropshadow_right_long_top, R.id.right_adjust_button,
-                                   R.raw.adjust_arrow_right, 0.0f, R.id.right_dropshadow_short,
-                                   R.id.right_dropshadow_long);
+                                   R.id.stub_right_frame, R.id.right_adjust_button,
+                                   R.raw.adjust_arrow_right);
+
+    candidateViewManager = new CandidateViewManager(
+        getKeyboardCandidateView(),
+        FloatingCandidateView.class.cast(findViewById(R.id.floating_candidate_view)));
   }
 
-  public void setEventListener(final ViewEventListener viewEventListener,
-                               OnClickListener widenButtonClickListener,
-                               OnClickListener leftAdjustButtonClickListener,
-                               OnClickListener rightAdjustButtonClickListener) {
-    checkInflated();
-
-    // Propagate the given listener into the child views.
-    // Set CandidateViewListener as well here, because it uses viewEventListener.
+  private InputFrameFoldButtonClickListener createFoldButtonListener(View view, int height) {
     Resources resources = getResources();
     int foldOvershootDurationRate =
         resources.getInteger(R.integer.input_frame_fold_overshoot_duration_rate);
@@ -292,50 +260,60 @@
         resources.getInteger(R.integer.input_frame_expand_overshoot_duration_rate);
     int expandOvershootRate =
         resources.getInteger(R.integer.input_frame_expand_overshoot_rate);
-    getCandidateView().setViewEventListener(
-        viewEventListener,
-        new InputFrameFoldButtonClickListener(
-            viewEventListener, getKeyboardFrame(),
-            resources.getInteger(R.integer.input_frame_fold_duration),
-            SequentialInterpolator.newBuilder()
-                .add(new DecelerateInterpolator(),
-                    foldOvershootDurationRate, -foldOvershootRate / 1e6f)
-                .add(new AccelerateInterpolator(), 1e6f - foldOvershootDurationRate, 1)
-                .build(),
-            resources.getInteger(R.integer.input_frame_expand_duration),
-            SequentialInterpolator.newBuilder()
-                .add(new DecelerateInterpolator(),
-                    expandOvershootDurationRate, 1 + expandOvershootRate / 1e6f)
-                .add(new AccelerateDecelerateInterpolator(), 1e6f - expandOvershootDurationRate, 1)
-                .build(),
-        new LayoutParamsAnimator(new Handler(Looper.myLooper()))));
 
-    getSymbolInputView().setViewEventListener(
+    return new InputFrameFoldButtonClickListener(
+        view, height, resources.getInteger(R.integer.input_frame_fold_duration),
+        SequentialInterpolator.newBuilder()
+            .add(new DecelerateInterpolator(),
+                foldOvershootDurationRate, -foldOvershootRate / 1e6f)
+            .add(new AccelerateInterpolator(), 1e6f - foldOvershootDurationRate, 1)
+            .build(),
+        resources.getInteger(R.integer.input_frame_expand_duration),
+        SequentialInterpolator.newBuilder()
+            .add(new DecelerateInterpolator(),
+                expandOvershootDurationRate, 1 + expandOvershootRate / 1e6f)
+            .add(new AccelerateDecelerateInterpolator(), 1e6f - expandOvershootDurationRate, 1)
+            .build(),
+        new LayoutParamsAnimator(new Handler(Looper.myLooper())));
+  }
+
+  public void setEventListener(final ViewEventListener viewEventListener,
+                               OnClickListener widenButtonClickListener,
+                               OnClickListener leftAdjustButtonClickListener,
+                               OnClickListener rightAdjustButtonClickListener,
+                               OnClickListener microphoneButtonClickListener) {
+    Preconditions.checkNotNull(viewEventListener);
+    Preconditions.checkNotNull(widenButtonClickListener);
+    Preconditions.checkNotNull(leftAdjustButtonClickListener);
+    Preconditions.checkNotNull(rightAdjustButtonClickListener);
+    Preconditions.checkNotNull(microphoneButtonClickListener);
+
+    checkInflated();
+
+    this.viewEventListener = viewEventListener;
+
+    // Propagate the given listener into the child views.
+    // Set CandidateViewListener as well here, because it uses viewEventListener.
+    candidateViewManager.setEventListener(viewEventListener, softwareKeyboardHeightListener);
+
+    getSymbolInputView().setEventListener(
         viewEventListener,
-        /**
-         * Click handler of the close button.
-         */
+        /** Click handler of the close button. */
         new OnClickListener() {
           @Override
           public void onClick(View v) {
             if (viewEventListener != null) {
-              viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+              viewEventListener.onFireFeedbackEvent(FeedbackEvent.SYMBOL_INPUTVIEW_CLOSED);
             }
-            startSymbolInputViewOutAnimation();
+            hideSymbolInputView();
           }
-        });
+        },
+        microphoneButtonClickListener);
 
-    getHardwareCompositionButton().setOnClickListener(new OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
-      }
-    });
-
-    getWidenButton().setOnClickListener(widenButtonClickListener);
-
+    getNarrowFrame().setEventListener(viewEventListener, widenButtonClickListener);
     leftFrameStubProxy.setButtonOnClickListener(leftAdjustButtonClickListener);
     rightFrameStubProxy.setButtonOnClickListener(rightAdjustButtonClickListener);
+    getMicrophoneButton().setOnClickListener(microphoneButtonClickListener);
   }
 
   public void setKeyEventHandler(KeyEventHandler keyEventHandler) {
@@ -347,14 +325,17 @@
   }
 
   // TODO(hidehiko): Probably we'd like to remove this method when we decide to move MVC model.
-  public JapaneseKeyboard getJapaneseKeyboard() {
+  @Nullable public Keyboard getKeyboard() {
     checkInflated();
-    return getKeyboardView().getJapaneseKeyboard();
+    return getKeyboardView().getKeyboard().orNull();
   }
 
-  public void setJapaneseKeyboard(JapaneseKeyboard keyboard) {
+  public void setKeyboard(Keyboard keyboard) {
     checkInflated();
-    getKeyboardView().setJapaneseKeyboard(keyboard);
+    getKeyboardView().setKeyboard(keyboard);
+    CompositionMode compositionMode = keyboard.getSpecification().getCompositionMode();
+    getNarrowFrame().setHardwareCompositionButtonImage(compositionMode);
+    candidateViewManager.setHardwareCompositionMode(compositionMode);
   }
 
   public void setEmojiEnabled(boolean unicodeEmojiEnabled, boolean carrierEmojiEnabled) {
@@ -371,6 +352,7 @@
   public void setEditorInfo(EditorInfo editorInfo) {
     checkInflated();
     getKeyboardView().setEditorInfo(editorInfo);
+    candidateViewManager.setEditorInfo(editorInfo);
   }
 
   public void setFlickSensitivity(int flickSensitivity) {
@@ -393,6 +375,7 @@
   public void setPopupEnabled(boolean popupEnabled) {
     checkInflated();
     getKeyboardView().setPopupEnabled(popupEnabled);
+    getSymbolInputView().setPopupEnabled(popupEnabled);
   }
 
   public boolean isPopupEnabled() {
@@ -400,16 +383,28 @@
     return getKeyboardView().isPopupEnabled();
   }
 
-  public void setSkinType(SkinType skinType) {
+  @SuppressWarnings("deprecation")
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
     checkInflated();
-    this.skinType = skinType;
-    getKeyboardView().setSkinType(skinType);
-    getSymbolInputView().setSkinType(skinType);
-    getCandidateView().setSkinType(skinType);
+    this.skin = skin;
+    getKeyboardView().setSkin(skin);
+    getSymbolInputView().setSkin(skin);
+    candidateViewManager.setSkin(skin);
+    getMicrophoneButton().setBackgroundDrawable(BackgroundDrawableFactory.createPressableDrawable(
+        new ColorDrawable(skin.buttonFrameButtonPressedColor), Optional.<Drawable>absent()));
+    getMicrophoneButton().setSkin(skin);
+    leftFrameStubProxy.setSkin(skin);
+    rightFrameStubProxy.setSkin(skin);
+    getButtonFrame().setBackgroundDrawable(
+        skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
+    getNarrowFrame().setSkin(skin);
+    getKeyboardFrameSeparator().setBackgroundDrawable(
+        skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
   }
 
-  public SkinType getSkinType() {
-    return skinType;
+  public Skin getSkin() {
+    return skin;
   }
 
   /**
@@ -417,6 +412,7 @@
    * or do nothing otherwise.
    * Exposed as a package private method for testing purpose.
    */
+  @VisibleForTesting
   void checkInflated() {
     if (getChildCount() == 0) {
       throw new IllegalStateException("It is necessary to inflate mozc_view.xml");
@@ -425,22 +421,36 @@
 
   public void setCommand(Command outCommand) {
     checkInflated();
+    candidateViewManager.update(outCommand);
+    updateMetaStatesBasedOnOutput(outCommand.getOutput());
+  }
 
-    CandidateView candidateView = getCandidateView();
-    if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() > 0) {
-      // Call CandidateView#update only if there are some candidates in the output.
-      // In such case the candidate view will clear its canvas.
-      candidateView.update(outCommand);
-      startCandidateViewInAnimation();
+  // Update COMPOSING metastate.
+  @VisibleForTesting
+  void updateMetaStatesBasedOnOutput(Output output) {
+    Preconditions.checkNotNull(output);
 
+    boolean hasPreedit = output.hasPreedit()
+        && output.getPreedit().getSegmentCount() > 0;
+    if (hasPreedit) {
+      getKeyboardView().updateMetaStates(EnumSet.of(MetaState.COMPOSING),
+                                         Collections.<MetaState>emptySet());
     } else {
-      // We don't call update method here, because it will clear the view's contents during the
-      // animation.
-      // TODO(hidehiko): Clear the candidates when the animation is finished.
-      startCandidateViewOutAnimation();
+      getKeyboardView().updateMetaStates(Collections.<MetaState>emptySet(),
+                                         EnumSet.of(MetaState.COMPOSING));
     }
   }
 
+  @TargetApi(21)
+  public void setCursorAnchorInfo(CursorAnchorInfo info) {
+    candidateViewManager.setCursorAnchorInfo(info);
+  }
+
+  public void setCursorAnchorInfoEnabled(boolean enabled) {
+    allowFloatingCandidateMode = enabled;
+    candidateViewManager.setAllowFloatingMode(enabled);
+  }
+
   public void reset() {
     checkInflated();
 
@@ -449,24 +459,21 @@
     resetKeyboardViewState();
 
     // Reset candidate view.
-    CandidateView candidateView = getCandidateView();
-    candidateView.clearAnimation();
-    candidateView.setVisibility(View.GONE);
-    candidateView.reset();
+    candidateViewManager.reset();
 
     // Reset symbol input view visibility. Set Visibility directly (without animation).
     SymbolInputView symbolInputView = getSymbolInputView();
     symbolInputView.clearAnimation();
     symbolInputView.setVisibility(View.GONE);
 
-    // Reset *all* metastates.
+    // Reset *all* metastates (and set NO_GLOBE as default value).
     // Expecting metastates will be set next initialization.
-    getKeyboardView().updateMetaStates(Collections.<MetaState>emptySet(),
+    getKeyboardView().updateMetaStates(EnumSet.of(MetaState.NO_GLOBE),
                                        EnumSet.allOf(MetaState.class));
 
     resetFullscreenMode();
     setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
-    collapseDropShadowAndBackground();
+    resetBottomBackgroundHeight();
     updateBackgroundColor();
   }
 
@@ -477,29 +484,38 @@
       return;
     }
 
-    View keyboardFrame = getKeyboardFrame();
+    SymbolInputView symbolInputView = getSymbolInputView();
+    View keyboardFrame;
+    int keyboardFrameHeight;
+    if (symbolInputView.isInflated() && symbolInputView.getVisibility() == View.VISIBLE) {
+      keyboardFrame = getNumberKeyboardFrame();
+      keyboardFrameHeight = symbolInputView.getNumberKeyboardHeight();
+    } else {
+      keyboardFrame = getKeyboardFrame();
+      keyboardFrameHeight = getInputFrameHeight();
+    }
+
     keyboardFrame.setVisibility(View.VISIBLE);
 
     // The height may be changed so reset it here.
     ViewGroup.LayoutParams layoutParams = keyboardFrame.getLayoutParams();
-    int keyboardFrameHeight = getInputFrameHeight();
     if (layoutParams.height != keyboardFrameHeight) {
       layoutParams.height = keyboardFrameHeight;
       keyboardFrame.setLayoutParams(layoutParams);
 
       // Also reset the state of the folding button, which is "conceptually" a part of
       // the keyboard.
-      getCandidateView().setInputFrameFoldButtonChecked(false);
+      candidateViewManager.setInputFrameFoldButtonChecked(false);
     }
   }
 
   public void resetKeyboardViewState() {
     checkInflated();
-
     getKeyboardView().resetState();
   }
 
-  public boolean showSymbolInputView() {
+  public boolean showSymbolInputView(Optional<SymbolMajorCategory> category) {
+    Preconditions.checkNotNull(category);
     checkInflated();
 
     SymbolInputView view = getSymbolInputView();
@@ -509,10 +525,17 @@
 
     if (!view.isInflated()) {
       view.inflateSelf();
+      CandidateView numberCandidateView =
+          CandidateView.class.cast(view.findViewById(R.id.candidate_view_in_symbol_view));
+      numberCandidateView.setInputFrameFoldButtonOnClickListener(createFoldButtonListener(
+          getNumberKeyboardFrame(), view.getNumberKeyboardHeight()));
+      candidateViewManager.setNumberCandidateView(numberCandidateView);
     }
 
-    view.reset();
+    view.resetToMajorCategory(category);
     startSymbolInputViewInAnimation();
+    candidateViewManager.setNumberMode(true);
+
     return true;
   }
 
@@ -524,41 +547,51 @@
       return false;
     }
 
+    candidateViewManager.setNumberMode(false);
     startSymbolInputViewOutAnimation();
     return true;
   }
 
+  private int getButtonFrameHeightIfVisible() {
+    return buttonFrameVisible ? dimensionPixelSize.buttonFrameHeight : 0;
+  }
+
   /**
    * Decides input frame height in not fullscreen mode.
    */
-  public int getVisibleViewHeight() {
+  @VisibleForTesting
+  int getVisibleViewHeight() {
     checkInflated();
 
+    boolean isSymbolInputViewVisible = getSymbolInputView().getVisibility() == View.VISIBLE;
     // Means only software keyboard or narrow frame
-    boolean isDefaultView = getCandidateView().getVisibility() != View.VISIBLE
-        && getSymbolInputView().getVisibility() != View.VISIBLE;
+    boolean isDefaultView =
+        !candidateViewManager.isKeyboardCandidateViewVisible() && !isSymbolInputViewVisible;
 
     if (narrowMode) {
       if (isDefaultView) {
         return dimensionPixelSize.narrowFrameHeight;
       } else {
-        return dimensionPixelSize.narrowImeWindowHeight
-            - dimensionPixelSize.translucentBorderHeight;
+        return dimensionPixelSize.narrowImeWindowHeight;
       }
     } else {
       if (isDefaultView) {
-        return getInputFrameHeight();
+        return getInputFrameHeight() + getButtonFrameHeightIfVisible();
       } else {
-        return imeWindowHeight - dimensionPixelSize.translucentBorderHeight;
+        if (isSymbolInputViewVisible) {
+          return symbolInputViewHeight;
+        } else {
+          return imeWindowHeight;
+        }
       }
     }
   }
 
+  @VisibleForTesting
   void updateInputFrameHeight() {
     // input_frame's height depends on fullscreen mode, narrow mode and Candidate/Symbol views.
     if (fullscreenMode) {
-      setLayoutHeight(getBottomFrame(), getVisibleViewHeight()
-          + dimensionPixelSize.translucentBorderHeight);
+      setLayoutHeight(getBottomFrame(), getVisibleViewHeight());
       setLayoutHeight(getKeyboardFrame(), getInputFrameHeight());
     } else {
       if (narrowMode) {
@@ -570,6 +603,7 @@
     }
   }
 
+  @VisibleForTesting
   int getSideAdjustedWidth() {
     return dimensionPixelSize.imeWindowPartialWidth + dimensionPixelSize.sideFrameWidth;
   }
@@ -582,27 +616,29 @@
     return fullscreenMode;
   }
 
+  @VisibleForTesting
   void resetFullscreenMode() {
     if (fullscreenMode) {
       // In fullscreen mode, InputMethodService shows extract view which height is 0 and
       // weight is 0. So our MozcView height should be fixed.
       // If CandidateView or SymbolInputView appears, MozcView height is enlarged to fix them.
-      setLayoutHeight(getOverlayView(), 0);
+      getOverlayView().setVisibility(View.GONE);
       setLayoutHeight(getTextInputFrame(), LayoutParams.WRAP_CONTENT);
-      getCandidateView().setOnVisibilityChangeListener(onVisibilityChangeListener);
+      candidateViewManager.setOnVisibilityChangeListener(Optional.of(onVisibilityChangeListener));
       getSymbolInputView().setOnVisibilityChangeListener(onVisibilityChangeListener);
     } else {
-      setLayoutHeight(getOverlayView(), LayoutParams.MATCH_PARENT);
+      getOverlayView().setVisibility(View.VISIBLE);
       setLayoutHeight(getTextInputFrame(), LayoutParams.MATCH_PARENT);
-      getCandidateView().setOnVisibilityChangeListener(null);
+      candidateViewManager.setOnVisibilityChangeListener(
+          Optional.<InOutAnimatedFrameLayout.VisibilityChangeListener>absent());
       getSymbolInputView().setOnVisibilityChangeListener(null);
     }
-
+    candidateViewManager.setExtractedMode(fullscreenMode);
     updateInputFrameHeight();
     updateBackgroundColor();
   }
 
-  static void setLayoutHeight(View view, int height) {
+  private static void setLayoutHeight(View view, int height) {
     ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
     layoutParams.height = height;
     view.setLayoutParams(layoutParams);
@@ -612,17 +648,8 @@
     return narrowMode;
   }
 
-  public void setHardwareCompositionButtonImage(CompositionMode compositionMode) {
-    switch (compositionMode) {
-      case HIRAGANA:
-        getHardwareCompositionButton().setImageDrawable(
-            mozcDrawableFactory.getDrawable(R.raw.qwerty__function__kana__icon).orNull());
-        break;
-      default:
-        getHardwareCompositionButton().setImageDrawable(
-            mozcDrawableFactory.getDrawable(R.raw.qwerty__function__alphabet__icon).orNull());
-        break;
-    }
+  public boolean isFloatingCandidateMode() {
+    return candidateViewManager.isFloatingMode();
   }
 
   public Rect getKeyboardSize() {
@@ -678,17 +705,18 @@
     float descriptionTextSize = layoutAdjustment == LayoutAdjustment.FILL
         ? resources.getDimension(R.dimen.candidate_description_text_size)
         : resources.getDimension(R.dimen.candidate_description_text_size_aligned_layout);
-    getCandidateView().setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+    candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
     getSymbolInputView().setCandidateTextDimension(candidateTextSize, descriptionTextSize);
-    getConversionCandidateWordContainerView().setCandidateTextDimension(candidateTextSize);
 
     // In narrow mode, hide software keyboard and show narrow status bar.
-    getCandidateView().setNarrowMode(narrowMode);
+    candidateViewManager.setNarrowMode(narrowMode);
     if (narrowMode) {
       getKeyboardFrame().setVisibility(GONE);
+      getButtonFrame().setVisibility(GONE);
       getNarrowFrame().setVisibility(VISIBLE);
     } else {
       getKeyboardFrame().setVisibility(VISIBLE);
+      getButtonFrame().setVisibility(buttonFrameVisible ? VISIBLE : GONE);
       getNarrowFrame().setVisibility(GONE);
       resetKeyboardFrameVisibility();
     }
@@ -709,12 +737,13 @@
     getForegroundFrame().startAnimation(translateAnimation);
   }
 
+  @VisibleForTesting
   void updateBackgroundColor() {
     // If fullscreenMode, background should not show original window.
     // If narrowMode, it is always full-width.
     // If isFloatingMode, background should be transparent.
-    int resourceId = (fullscreenMode || (!narrowMode && !isFloatingMode())) ?
-        R.color.input_frame_background : 0;
+    int resourceId = (fullscreenMode || (!narrowMode && !isFloatingMode()))
+        ? R.color.input_frame_background : 0;
     getBottomBackground().setBackgroundResource(resourceId);
   }
 
@@ -748,62 +777,29 @@
     return;
   }
 
-  void expandDropShadowAndBackground() {
-    leftFrameStubProxy.flipDropShadowVisibility(INVISIBLE);
-    rightFrameStubProxy.flipDropShadowVisibility(INVISIBLE);
-    getDropShadowTop().setVisibility(VISIBLE);
-    getResources();
-    setLayoutHeight(getBottomBackground(), imeWindowHeight
-        - (fullscreenMode ? 0 : dimensionPixelSize.translucentBorderHeight));
-    isDropShadowExpanded = true;
-  }
-
-  void collapseDropShadowAndBackground() {
-    leftFrameStubProxy.flipDropShadowVisibility(VISIBLE);
-    rightFrameStubProxy.flipDropShadowVisibility(VISIBLE);
-    getDropShadowTop().setVisibility(fullscreenMode ? VISIBLE : INVISIBLE);
-    getResources();
-    setLayoutHeight(getBottomBackground(), getInputFrameHeight()
-        + (fullscreenMode ? dimensionPixelSize.translucentBorderHeight : 0));
-    isDropShadowExpanded = false;
-  }
-
-  void startDropShadowAnimation(Animation mainAnimation, Animation subAnimation) {
-    leftFrameStubProxy.startDropShadowAnimation(subAnimation, mainAnimation);
-    rightFrameStubProxy.startDropShadowAnimation(subAnimation, mainAnimation);
-    getDropShadowTop().startAnimation(mainAnimation);
-  }
-
-  void startCandidateViewInAnimation() {
-    getCandidateView().startInAnimation();
-    if (!isDropShadowExpanded) {
-      expandDropShadowAndBackground();
-      startDropShadowAnimation(candidateViewInAnimation, dropShadowCandidateViewInAnimation);
+  @VisibleForTesting
+  void changeBottomBackgroundHeight(int targetHeight) {
+    if (getBottomBackground().getHeight() != targetHeight) {
+      setLayoutHeight(getBottomBackground(), targetHeight);
     }
   }
 
-  void startCandidateViewOutAnimation() {
-    getCandidateView().startOutAnimation();
-    if (getSymbolInputView().getVisibility() != VISIBLE && isDropShadowExpanded) {
-      collapseDropShadowAndBackground();
-      startDropShadowAnimation(candidateViewOutAnimation, dropShadowCandidateViewOutAnimation);
-    }
+  @VisibleForTesting
+  void resetBottomBackgroundHeight() {
+    setLayoutHeight(getBottomBackground(), getInputFrameHeight() + getButtonFrameHeightIfVisible());
   }
 
+  @VisibleForTesting
   void startSymbolInputViewInAnimation() {
     getSymbolInputView().startInAnimation();
-    if (!isDropShadowExpanded) {
-      expandDropShadowAndBackground();
-      startDropShadowAnimation(symbolInputViewInAnimation, dropShadowSymbolInputViewInAnimation);
-    }
+    changeBottomBackgroundHeight(symbolInputViewHeight);
   }
 
+  @VisibleForTesting
   void startSymbolInputViewOutAnimation() {
     getSymbolInputView().startOutAnimation();
-    if (getCandidateView().getVisibility() != VISIBLE && isDropShadowExpanded) {
-      collapseDropShadowAndBackground();
-      startDropShadowAnimation(symbolInputViewOutAnimation,
-                               dropShadowSymbolInputViewOutAnimation);
+    if (!candidateViewManager.isKeyboardCandidateViewVisible()) {
+      resetBottomBackgroundHeight();
     }
   }
 
@@ -811,52 +807,34 @@
    * Reset components depending inputFrameHeight or imeWindowHeight.
    * This should be called when inputFrameHeight and/or imeWindowHeight are updated.
    */
+  @VisibleForTesting
   void resetHeightDependingComponents() {
-    // Create In/Out animation which dropshadows share between CandidateView and SymbolInputView.
-    {
-      CandidateView candidateView = getCandidateView();
-      int windowHeight = imeWindowHeight;
-      int inputFrameHeight = getInputFrameHeight();
-      int candidateViewHeight = windowHeight - inputFrameHeight;
-      long duration = getResources().getInteger(R.integer.candidate_frame_transition_duration);
-      float fromAlpha = 0.0f;
-      float toAlpha = 1.0f;
+    getKeyboardCandidateView().setInputFrameFoldButtonOnClickListener(
+        createFoldButtonListener(getKeyboardFrame(), getInputFrameHeight()));
 
-      candidateViewInAnimation = createCandidateViewTransitionAnimation(
-          candidateViewHeight, 0, fromAlpha, toAlpha, duration);
-      candidateView.setInAnimation(candidateViewInAnimation);
-      dropShadowCandidateViewInAnimation = createAlphaAnimation(
-          1.0f - fromAlpha, 1.0f - toAlpha, duration);
-
-      candidateViewOutAnimation = createCandidateViewTransitionAnimation(
-          0, candidateViewHeight, toAlpha, fromAlpha, duration);
-      candidateView.setOutAnimation(candidateViewOutAnimation);
-      dropShadowCandidateViewOutAnimation = createAlphaAnimation(
-          1.0f - toAlpha, 1.0f - fromAlpha, duration);
+    if (candidateViewManager != null) {
+      candidateViewManager.resetHeightDependingComponents(
+          getResources(), imeWindowHeight, inputFrameHeight);
     }
 
     SymbolInputView symbolInputView = getSymbolInputView();
     {
-      long duration = getResources().getInteger(R.integer.symbol_input_transition_duration_in);
+      long duration = getResources().getInteger(R.integer.symbol_input_transition_duration);
       float fromAlpha = 0.3f;
       float toAlpha = 1.0f;
 
       symbolInputViewInAnimation = createAlphaAnimation(fromAlpha, toAlpha, duration);
       symbolInputView.setInAnimation(symbolInputViewInAnimation);
-      dropShadowSymbolInputViewInAnimation = createAlphaAnimation(
-          1.0f - fromAlpha, 1.0f - toAlpha, duration);
-
       symbolInputViewOutAnimation = createAlphaAnimation(toAlpha, fromAlpha, duration);
       symbolInputView.setOutAnimation(symbolInputViewOutAnimation);
-      dropShadowSymbolInputViewOutAnimation = createAlphaAnimation(
-          1.0f - toAlpha, 1.0f - fromAlpha, duration);
     }
 
-    // Reset drop shadow height.
-    int shortHeight = getInputFrameHeight() + dimensionPixelSize.translucentBorderHeight;
-    int longHeight = imeWindowHeight;
-    leftFrameStubProxy.setDropShadowHeight(shortHeight, longHeight);
-    rightFrameStubProxy.setDropShadowHeight(shortHeight, longHeight);
+    if (symbolInputView.isInflated()) {
+      CandidateView numberCandidateView = CandidateView.class.cast(
+          symbolInputView.findViewById(R.id.candidate_view_in_symbol_view));
+      numberCandidateView.setInputFrameFoldButtonOnClickListener(createFoldButtonListener(
+          getNumberKeyboardFrame(), symbolInputView.getNumberKeyboardHeight()));
+    }
 
     // Reset side adjust buttons height.
     leftFrameStubProxy.resetAdjustButtonBottomMargin(getInputFrameHeight());
@@ -872,85 +850,112 @@
 
     Resources resources = getResources();
     float heightScale = keyboardHeightRatio * 0.01f;
-    int originalImeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
-    int originalInputFrameHeight = resources.getDimensionPixelSize(R.dimen.input_frame_height);
-    imeWindowHeight = Math.round(originalImeWindowHeight * heightScale);
+    float originalImeWindowHeight = resources.getDimension(R.dimen.ime_window_height);
+    float originalInputFrameHeight = resources.getDimension(R.dimen.input_frame_height);
     inputFrameHeight = Math.round(originalInputFrameHeight * heightScale);
-    // TODO(yoichio): Update SymbolInputView height scale.
-    // getSymbolInputView().setHeightScale(heightScale);
+    int minImeWindowHeight = inputFrameHeight + dimensionPixelSize.buttonFrameHeight;
+    imeWindowHeight =
+        Math.max(Math.round(originalImeWindowHeight * heightScale), minImeWindowHeight);
+    symbolInputViewHeight = Math.min(imeWindowHeight, minImeWindowHeight);
 
     updateInputFrameHeight();
+    getSymbolInputView().setVerticalDimension(symbolInputViewHeight, heightScale);
     resetHeightDependingComponents();
   }
 
-  public int getInputFrameHeight() {
+  @VisibleForTesting
+  int getInputFrameHeight() {
     return inputFrameHeight;
   }
 
-  // Getters of child views.
-  // TODO(hidehiko): Remove (or hide) following methods, in order to split the dependencies to
-  //   those child views from other components.
-  public CandidateView getCandidateView() {
-    return CandidateView.class.cast(findViewById(R.id.candidate_view));
-  }
-
-  public ConversionCandidateWordContainerView getConversionCandidateWordContainerView() {
-    return ConversionCandidateWordContainerView.class.cast(
-        findViewById(R.id.conversion_candidate_word_container_view));
-  }
-
-  public View getKeyboardFrame() {
+  @VisibleForTesting
+  View getKeyboardFrame() {
     return findViewById(R.id.keyboard_frame);
   }
 
-  public JapaneseKeyboardView getKeyboardView() {
-    return JapaneseKeyboardView.class.cast(findViewById(R.id.keyboard_view));
+  View getKeyboardFrameSeparator() {
+    return findViewById(R.id.keyboard_frame_separator);
   }
 
-  public SymbolInputView getSymbolInputView() {
+  private View getNumberKeyboardFrame() {
+    return findViewById(R.id.number_keyboard_frame);
+  }
+
+  @VisibleForTesting
+  KeyboardView getKeyboardView() {
+    return KeyboardView.class.cast(findViewById(R.id.keyboard_view));
+  }
+
+  private CandidateView getKeyboardCandidateView() {
+    return CandidateView.class.cast(findViewById(R.id.candidate_view));
+  }
+
+  @VisibleForTesting
+  SymbolInputView getSymbolInputView() {
     return SymbolInputView.class.cast(findViewById(R.id.symbol_input_view));
   }
 
+  @VisibleForTesting
   View getOverlayView() {
     return findViewById(R.id.overlay_view);
   }
 
+  @VisibleForTesting
   LinearLayout getTextInputFrame() {
     return LinearLayout.class.cast(findViewById(R.id.textinput_frame));
   }
 
-  FrameLayout getNarrowFrame() {
-    return FrameLayout.class.cast(findViewById(R.id.narrow_frame));
+  @VisibleForTesting
+  NarrowFrameView getNarrowFrame() {
+    return NarrowFrameView.class.cast(findViewById(R.id.narrow_frame));
   }
 
-  ImageView getHardwareCompositionButton() {
-    return ImageView.class.cast(findViewById(R.id.hardware_composition_button));
-  }
-
-  ImageView getWidenButton() {
-    return ImageView.class.cast(findViewById(R.id.widen_button));
-  }
-
+  @VisibleForTesting
   View getForegroundFrame() {
     return findViewById(R.id.foreground_frame);
   }
 
-  View getDropShadowTop() {
-    return findViewById(R.id.dropshadow_top);
-  }
-
+  @VisibleForTesting
   View getBottomFrame() {
     return findViewById(R.id.bottom_frame);
   }
 
+  @VisibleForTesting
   View getBottomBackground() {
     return findViewById(R.id.bottom_background);
   }
 
+  @VisibleForTesting
+  View getButtonFrame() {
+    return findViewById(R.id.button_frame);
+  }
+
+  @VisibleForTesting
+  MozcImageView getMicrophoneButton() {
+    return MozcImageView.class.cast(findViewById(R.id.microphone_button));
+  }
+
   @Override
   public void trimMemory() {
     getKeyboardView().trimMemory();
-    getCandidateView().trimMemory();
     getSymbolInputView().trimMemory();
+    candidateViewManager.trimMemory();
+  }
+
+  void setGlobeButtonEnabled(boolean globeButtonEnabled) {
+    getKeyboardView().setGlobeButtonEnabled(globeButtonEnabled);
+  }
+
+  void setMicrophoneButtonEnabled(boolean microphoneButtonEnabled) {
+    if (narrowMode) {
+      buttonFrameVisible = false;
+    } else {
+      buttonFrameVisible = microphoneButtonEnabled;
+      int visibility = buttonFrameVisible ? View.VISIBLE : View.GONE;
+      getButtonFrame().setVisibility(visibility);
+      getMicrophoneButton().setVisibility(visibility);
+      getSymbolInputView().setMicrophoneButtonEnabled(microphoneButtonEnabled);
+      resetBottomBackgroundHeight();
+    }
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java b/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java
new file mode 100644
index 0000000..8434aa4
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java
@@ -0,0 +1,170 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * Narrow frame view.
+ */
+public class NarrowFrameView extends LinearLayout {
+
+  // TODO(hsumita): Move hard coded parameters to dimens.xml or skin.
+  private static final float BUTTON_CORNOR_RADIUS = 3.5f;  // in dip.
+  private static final float BUTTON_LEFT_OFFSET = 2.0f;
+  private static final float BUTTON_TOP_OFFSET = 2.0f;
+  private static final float BUTTON_RIGHT_OFFSET = 2.0f;
+  private static final float BUTTON_BOTTOM_OFFSET = 2.0f;
+
+  private Skin skin = Skin.getFallbackInstance();
+  private CompositionMode hardwareKeyboardCompositionMode = CompositionMode.HIRAGANA;
+
+  public NarrowFrameView(Context context) {
+    super(context);
+  }
+
+  public NarrowFrameView(Context context, AttributeSet attrSet) {
+    super(context, attrSet);
+  }
+
+  @Override
+  public void onFinishInflate() {
+    // Disable h/w acceleration to use a PictureDrawable.
+    getHardwareCompositionButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+    getWidenButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+
+    setSkin(skin);
+  }
+
+  private static Drawable createButtonBackgroundDrawable(float density, Skin skin) {
+    return BackgroundDrawableFactory.createPressableDrawable(
+        new RoundRectKeyDrawable(
+            (int) (BUTTON_LEFT_OFFSET * density),
+            (int) (BUTTON_TOP_OFFSET * density),
+            (int) (BUTTON_RIGHT_OFFSET * density),
+            (int) (BUTTON_BOTTOM_OFFSET * density),
+            (int) (BUTTON_CORNOR_RADIUS * density),
+            skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+            skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+            skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+            skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+        Optional.<Drawable>of(new RoundRectKeyDrawable(
+            (int) (BUTTON_LEFT_OFFSET * density),
+            (int) (BUTTON_TOP_OFFSET * density),
+            (int) (BUTTON_RIGHT_OFFSET * density),
+            (int) (BUTTON_BOTTOM_OFFSET * density),
+            (int) (BUTTON_CORNOR_RADIUS * density),
+            skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+            skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+            skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+            skin.twelvekeysLayoutReleasedFunctionKeyShadowColor)));
+  }
+
+  @SuppressWarnings("deprecation")
+  private void setupImageButton(MozcImageView view, int resourceID) {
+    float density = getResources().getDisplayMetrics().density;
+    view.setImageDrawable(skin.getDrawable(getResources(), resourceID));
+    view.setBackgroundDrawable(createButtonBackgroundDrawable(density, skin));
+  }
+
+  private void updateImageButton() {
+    setupImageButton(getWidenButton(), R.raw.hardware__function__close);
+    MozcImageView hardwareCompositionButton = getHardwareCompositionButton();
+    if (hardwareKeyboardCompositionMode == CompositionMode.HIRAGANA) {
+      setupImageButton(hardwareCompositionButton, R.raw.qwerty__function__kana__icon);
+      hardwareCompositionButton.setContentDescription(
+          getResources().getString(R.string.cd_key_chartype_to_abc));
+    } else {
+      setupImageButton(hardwareCompositionButton, R.raw.qwerty__function__alphabet__icon);
+      hardwareCompositionButton.setContentDescription(
+          getResources().getString(R.string.cd_key_chartype_to_kana));
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  public void setSkin(Skin skin) {
+    this.skin = Preconditions.checkNotNull(skin);
+    setBackgroundDrawable(skin.narrowFrameBackgroundDrawable);
+    getNarrowFrameSeparator().setBackgroundDrawable(
+        skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
+    updateImageButton();
+  }
+
+  public void setEventListener(
+      final ViewEventListener viewEventListener, OnClickListener widenButtonClickListener) {
+    Preconditions.checkNotNull(viewEventListener);
+    Preconditions.checkNotNull(widenButtonClickListener);
+
+    getHardwareCompositionButton().setOnClickListener(new OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        viewEventListener.onFireFeedbackEvent(
+            FeedbackEvent.NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN);
+        viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
+      }
+    });
+    getWidenButton().setOnClickListener(widenButtonClickListener);
+  }
+
+  public void setHardwareCompositionButtonImage(CompositionMode compositionMode) {
+    this.hardwareKeyboardCompositionMode = Preconditions.checkNotNull(compositionMode);
+    updateImageButton();
+  }
+
+  @VisibleForTesting
+  MozcImageView getHardwareCompositionButton() {
+    return MozcImageView.class.cast(findViewById(R.id.hardware_composition_button));
+  }
+
+  @VisibleForTesting
+  MozcImageView getWidenButton() {
+    return MozcImageView.class.cast(findViewById(R.id.widen_button));
+  }
+
+  @VisibleForTesting
+  View getNarrowFrameSeparator() {
+    return findViewById(R.id.narrow_frame_separator);
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java b/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
index aeb8f8f..ed51f35 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
@@ -30,11 +30,13 @@
 package org.mozc.android.inputmethod.japanese;
 
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ProbableKeyEvent;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.content.Context;
@@ -44,8 +46,6 @@
 
 import java.util.List;
 
-import javax.annotation.Nullable;
-
 /**
  * Converter from primary key code (≒ code point) to Mozc's key event.
  *
@@ -60,10 +60,7 @@
   public final int keyCodeBackspace;
   public final int keyCodeEnter;
   public final int keyCodeChartypeToKana;
-  public final int keyCodeChartypeTo123;
   public final int keyCodeChartypeToAbc;
-  public final int keyCodeChartypeToKana123;
-  public final int keyCodeChartypeToAbc123;
   public final int keyCodeSymbol;
   public final int keyCodeUndo;
   public final int keyCodeCapslock;
@@ -90,10 +87,7 @@
     keyCodeBackspace = res.getInteger(R.integer.key_backspace);
     keyCodeEnter = res.getInteger(R.integer.key_enter);
     keyCodeChartypeToKana = res.getInteger(R.integer.key_chartype_to_kana);
-    keyCodeChartypeTo123 = res.getInteger(R.integer.key_chartype_to_123);
     keyCodeChartypeToAbc = res.getInteger(R.integer.key_chartype_to_abc);
-    keyCodeChartypeToKana123 = res.getInteger(R.integer.key_chartype_to_kana_123);
-    keyCodeChartypeToAbc123 = res.getInteger(R.integer.key_chartype_to_abc_123);
     keyCodeSymbol = res.getInteger(R.integer.key_symbol);
     keyCodeUndo = res.getInteger(R.integer.key_undo);
     keyCodeCapslock = res.getInteger(R.integer.key_capslock);
@@ -103,63 +97,63 @@
     this.guesser = Preconditions.checkNotNull(guesser);
   }
 
-  public void setJapaneseKeyboard(@Nullable JapaneseKeyboard japaneseKeyboard) {
-    guesser.setJapaneseKeyboard(japaneseKeyboard);
+  public void setKeyboard(Keyboard keyboard) {
+    guesser.setKeyboard(Preconditions.checkNotNull(keyboard));
   }
 
   public void setConfiguration(Configuration newConfig) {
-    guesser.setConfiguration(Preconditions.checkNotNull(newConfig));
+    guesser.setConfiguration(Optional.of(newConfig));
   }
 
-  public ProtoCommands.KeyEvent createMozcKeyEvent(
-      int primaryCode, List<? extends TouchEvent> touchEventList) {
+  public Optional<ProtoCommands.KeyEvent> createMozcKeyEvent(
+      int primaryCode, List<TouchEvent> touchEventList) {
+    Preconditions.checkNotNull(touchEventList);
+
     // Space
     if (primaryCode == ' ') {
-      return KeycodeConverter.SPECIALKEY_SPACE;
+      return Optional.of(KeycodeConverter.SPECIALKEY_SPACE);
     }
 
     // Enter
     if (primaryCode == keyCodeEnter) {
-      return KeycodeConverter.SPECIALKEY_VIRTUAL_ENTER;
+      return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_ENTER);
     }
 
     // Backspace
     if (primaryCode == keyCodeBackspace) {
-      return KeycodeConverter.SPECIALKEY_BACKSPACE;
+      return Optional.of(KeycodeConverter.SPECIALKEY_BACKSPACE);
     }
 
     // Up arrow.
     if (primaryCode == keyCodeUp) {
-      return KeycodeConverter.SPECIALKEY_UP;
+      return Optional.of(KeycodeConverter.SPECIALKEY_UP);
     }
 
     // Left arrow.
     if (primaryCode == keyCodeLeft) {
-      return KeycodeConverter.SPECIALKEY_VIRTUAL_LEFT;
+      return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_LEFT);
     }
 
     // Right arrow.
     if (primaryCode == keyCodeRight) {
-      return KeycodeConverter.SPECIALKEY_VIRTUAL_RIGHT;
+      return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_RIGHT);
     }
 
     // Down arrow.
     if (primaryCode == keyCodeDown) {
-      return KeycodeConverter.SPECIALKEY_DOWN;
+      return Optional.of(KeycodeConverter.SPECIALKEY_DOWN);
     }
 
     if (primaryCode > 0) {
       ProtoCommands.KeyEvent.Builder builder =
           ProtoCommands.KeyEvent.newBuilder().setKeyCode(primaryCode);
-      if (guesser != null && touchEventList != null) {
+      if (!touchEventList.isEmpty()) {
         List<ProbableKeyEvent> probableKeyEvents = guesser.getProbableKeyEvents(touchEventList);
-        if (probableKeyEvents != null) {
-          builder.addAllProbableKeyEvent(probableKeyEvents);
-        }
+        builder.addAllProbableKeyEvent(probableKeyEvents);
       }
-      return builder.build();
+      return Optional.of(builder.build());
     }
-    return null;
+    return Optional.<ProtoCommands.KeyEvent>absent();
   }
 
   public KeyEventInterface getPrimaryCodeKeyEvent(int primaryCode) {
@@ -268,8 +262,8 @@
     }
 
     @Override
-    public KeyEvent getNativeEvent() {
-      return null;
+    public Optional<KeyEvent> getNativeEvent() {
+      return Optional.<KeyEvent>absent();
     }
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java b/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
index 5dbc0bb..5265cdf 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
@@ -34,21 +34,27 @@
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardFactory;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
 import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.model.SymbolMinorCategory;
 import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
 import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
 import org.mozc.android.inputmethod.japanese.ui.SpanFactory;
 import org.mozc.android.inputmethod.japanese.ui.SymbolCandidateLayouter;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
+import org.mozc.android.inputmethod.japanese.view.MozcImageButton;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
 import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import org.mozc.android.inputmethod.japanese.view.SymbolMajorCategoryButtonDrawableFactory;
 import org.mozc.android.inputmethod.japanese.view.TabSelectedBackgroundDrawable;
 import com.google.common.annotations.VisibleForTesting;
@@ -62,36 +68,31 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Typeface;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
 import android.graphics.drawable.LayerDrawable;
 import android.os.IBinder;
+import android.os.Looper;
 import android.preference.PreferenceManager;
 import android.support.v4.view.PagerAdapter;
 import android.support.v4.view.ViewPager;
 import android.support.v4.view.ViewPager.OnPageChangeListener;
 import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnGestureListener;
-import android.view.Gravity;
 import android.view.InflateException;
 import android.view.LayoutInflater;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.Animation;
-import android.widget.ImageButton;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.TabHost;
 import android.widget.TabHost.OnTabChangeListener;
 import android.widget.TabHost.TabSpec;
 import android.widget.TabWidget;
 import android.widget.TextView;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -113,15 +114,18 @@
 
   /**
    * Adapter for symbol candidate selection.
-   * Exposed as package private for testing.
    */
   // TODO(hidehiko): make this class static.
-  class SymbolCandidateSelectListener implements CandidateSelectListener {
+  @VisibleForTesting class SymbolCandidateSelectListener implements CandidateSelectListener {
     @Override
     public void onCandidateSelected(CandidateWord candidateWord, Optional<Integer> row) {
-      if (viewEventListener != null) {
+      Preconditions.checkNotNull(candidateWord);
+      // When current major category is NUMBER, CandidateView.ConversionCandidateSelectListener
+      // should handle candidate selection event.
+      Preconditions.checkState(currentMajorCategory != SymbolMajorCategory.NUMBER);
+      if (viewEventListener.isPresent()) {
         // If we are on password field, history shouldn't be updated to protect privacy.
-        viewEventListener.onSymbolCandidateSelected(
+        viewEventListener.get().onSymbolCandidateSelected(
             currentMajorCategory, candidateWord.getValue(), !isPasswordField);
       }
     }
@@ -130,20 +134,18 @@
   /**
    * Click handler of major category buttons.
    */
-  class MajorCategoryButtonClickListener implements OnClickListener {
+  @VisibleForTesting class MajorCategoryButtonClickListener implements OnClickListener {
     private final SymbolMajorCategory majorCategory;
 
     MajorCategoryButtonClickListener(SymbolMajorCategory majorCategory) {
-      if (majorCategory == null) {
-        throw new NullPointerException("majorCategory should not be null.");
-      }
-      this.majorCategory = majorCategory;
+      this.majorCategory = Preconditions.checkNotNull(majorCategory);
     }
 
     @Override
     public void onClick(View majorCategorySelectorButton) {
-      if (viewEventListener != null) {
-        viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+      if (viewEventListener.isPresent()) {
+        viewEventListener.get().onFireFeedbackEvent(
+            FeedbackEvent.SYMBOL_INPUTVIEW_MAJOR_CATEGORY_SELECTED);
       }
 
       if (emojiEnabled
@@ -152,17 +154,17 @@
         // Ask the user which emoji provider s/he'd like to use.
         // If the user cancels the dialog, do nothing.
         maybeInitializeEmojiProviderDialog(getContext());
-        if (emojiProviderDialog != null) {
+        if (emojiProviderDialog.isPresent()) {
           IBinder token = getWindowToken();
           if (token != null) {
-            MozcUtil.setWindowToken(token, emojiProviderDialog);
+            MozcUtil.setWindowToken(token, emojiProviderDialog.get());
           } else {
             MozcLog.w("Unknown window token.");
           }
 
           // If a user selects a provider, the dialog handler will set major category
           // to EMOJI automatically. If s/he cancels, nothing will be happened.
-          emojiProviderDialog.show();
+          emojiProviderDialog.get().show();
           return;
         }
       }
@@ -171,65 +173,77 @@
     }
   }
 
-  // Manages the relationship between.
-  static class SymbolTabWidgetViewPagerAdapter extends PagerAdapter
+  private static class SymbolTabWidgetViewPagerAdapter extends PagerAdapter
       implements OnTabChangeListener, OnPageChangeListener {
 
     private static final int HISTORY_INDEX = 0;
 
     private final Context context;
     private final SymbolCandidateStorage symbolCandidateStorage;
-    private final ViewEventListener viewEventListener;
+    private final Optional<ViewEventListener> viewEventListener;
     private final CandidateSelectListener candidateSelectListener;
     private final SymbolMajorCategory majorCategory;
-    private final SkinType skinType;
+    private Skin skin;
     private final EmojiProviderType emojiProviderType;
     private final TabHost tabHost;
     private final ViewPager viewPager;
     private final float candidateTextSize;
     private final float descriptionTextSize;
 
-    private View historyViewCache = null;
+    private Optional<View> historyViewCache = Optional.absent();
     private int scrollState = ViewPager.SCROLL_STATE_IDLE;
+    private boolean feedbackEnabled = true;
 
     SymbolTabWidgetViewPagerAdapter(
         Context context, SymbolCandidateStorage symbolCandidateStorage,
-        ViewEventListener viewEventListener, CandidateSelectListener candidateSelectListener,
-        SymbolMajorCategory majorCategory,
-        SkinType skinType, EmojiProviderType emojiProviderType,
-        TabHost tabHost, ViewPager viewPager,
+        Optional<ViewEventListener> viewEventListener,
+        CandidateSelectListener candidateSelectListener, SymbolMajorCategory majorCategory,
+        Skin skin, EmojiProviderType emojiProviderType, TabHost tabHost, ViewPager viewPager,
         float candidateTextSize, float descriptionTextSize) {
-      Preconditions.checkNotNull(emojiProviderType);
+      this.context = Preconditions.checkNotNull(context);
+      this.symbolCandidateStorage = Preconditions.checkNotNull(symbolCandidateStorage);
+      this.viewEventListener = Preconditions.checkNotNull(viewEventListener);
+      this.candidateSelectListener = Preconditions.checkNotNull(candidateSelectListener);
+      this.majorCategory = Preconditions.checkNotNull(majorCategory);
+      this.skin = Preconditions.checkNotNull(skin);
+      this.emojiProviderType = Preconditions.checkNotNull(emojiProviderType);
+      this.tabHost = Preconditions.checkNotNull(tabHost);
+      this.viewPager = Preconditions.checkNotNull(viewPager);
+      this.candidateTextSize = Preconditions.checkNotNull(candidateTextSize);
+      this.descriptionTextSize = Preconditions.checkNotNull(descriptionTextSize);
+    }
 
-      this.context = context;
-      this.symbolCandidateStorage = symbolCandidateStorage;
-      this.viewEventListener = viewEventListener;
-      this.candidateSelectListener = candidateSelectListener;
-      this.majorCategory = majorCategory;
-      this.skinType = skinType;
-      this.emojiProviderType = emojiProviderType;
-      this.tabHost = tabHost;
-      this.viewPager = viewPager;
-      this.candidateTextSize = candidateTextSize;
-      this.descriptionTextSize = descriptionTextSize;
+    public void setSkin(Skin skin) {
+      Preconditions.checkNotNull(skin);
+      this.skin = skin;
+    }
+
+    public void setFeedbackEnabled(boolean enabled) {
+      feedbackEnabled = enabled;
     }
 
     private void maybeResetHistoryView() {
-      if (viewPager.getCurrentItem() != HISTORY_INDEX && historyViewCache != null) {
+      if (viewPager.getCurrentItem() != HISTORY_INDEX && historyViewCache.isPresent()) {
         resetHistoryView();
       }
     }
 
     private void resetHistoryView() {
+      if (!historyViewCache.isPresent()) {
+        return;
+      }
       CandidateList candidateList =
           symbolCandidateStorage.getCandidateList(majorCategory.minorCategories.get(0));
+      View noHistoryView = historyViewCache.get().findViewById(R.id.symbol_input_no_history);
       if (candidateList.getCandidatesCount() == 0) {
-        historyViewCache.findViewById(R.id.symbol_input_no_history).setVisibility(View.VISIBLE);
+        noHistoryView.setVisibility(View.VISIBLE);
+        TextView.class.cast(historyViewCache.get().findViewById(R.id.symbol_input_no_history_text))
+            .setTextColor(skin.candidateValueTextColor);
       } else {
-        historyViewCache.findViewById(R.id.symbol_input_no_history).setVisibility(View.GONE);
+        noHistoryView.setVisibility(View.GONE);
       }
-      SymbolCandidateView.class.cast(
-          historyViewCache.findViewById(R.id.symbol_input_candidate_view)).update(candidateList);
+      SymbolCandidateView.class.cast(historyViewCache.get().findViewById(
+          R.id.symbol_input_candidate_view)).update(candidateList);
     }
 
     @Override
@@ -250,10 +264,6 @@
       tabHost.setOnTabChangedListener(null);
       tabHost.setCurrentTab(position);
       tabHost.setOnTabChangedListener(this);
-
-      if (viewEventListener != null) {
-        viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
-      }
     }
 
     @Override
@@ -265,8 +275,9 @@
       }
       viewPager.setCurrentItem(position, false);
 
-      if (viewEventListener != null) {
-        viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+      if (feedbackEnabled && viewEventListener.isPresent()) {
+        viewEventListener.get().onFireFeedbackEvent(
+            FeedbackEvent.SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED);
       }
     }
 
@@ -293,13 +304,21 @@
       symbolCandidateView.setCandidateSelectListener(candidateSelectListener);
       symbolCandidateView.setMinColumnWidth(
           context.getResources().getDimension(majorCategory.minColumnWidthResourceId));
-      symbolCandidateView.setSkinType(skinType);
+      symbolCandidateView.setSkin(skin);
       symbolCandidateView.setEmojiProviderType(emojiProviderType);
-      symbolCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      if (majorCategory.layoutPolicy == DescriptionLayoutPolicy.GONE) {
+        // As it's guaranteed for descriptions not to be shown,
+        // show values using additional space where is reserved for descriptions.
+        // This makes Emoji bigger.
+        symbolCandidateView.setCandidateTextDimension(candidateTextSize + descriptionTextSize, 0);
+      } else {
+        symbolCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      }
+      symbolCandidateView.setDescriptionLayoutPolicy(majorCategory.layoutPolicy);
 
       // Set candidate contents.
       if (position == HISTORY_INDEX) {
-        historyViewCache = view;
+        historyViewCache = Optional.of(view);
         resetHistoryView();
       } else {
         symbolCandidateView.update(symbolCandidateStorage.getCandidateList(
@@ -309,7 +328,7 @@
 
       ScrollGuideView scrollGuideView =
           ScrollGuideView.class.cast(view.findViewById(R.id.symbol_input_scroll_guide_view));
-      scrollGuideView.setSkinType(skinType);
+      scrollGuideView.setSkin(skin);
 
       // Connect guide and candidate view.
       scrollGuideView.setScroller(symbolCandidateView.scroller);
@@ -322,81 +341,20 @@
     @Override
     public void destroyItem(ViewGroup collection, int position, Object view) {
       if (position == HISTORY_INDEX) {
-        historyViewCache = null;
+        historyViewCache = Optional.absent();
       }
       collection.removeView(View.class.cast(view));
     }
   }
 
   /**
-   * The text view for the minor category tab.
-   * The most thing is as same as base TextView, but if the text is too long to fit in
-   * the view, this view automatically scales the text horizontally. (If there is enough
-   * space, doesn't widen.)
-   */
-  private static class TabTextView extends TextView {
-
-    /** Cached Paint instance to measure the text. */
-    private final Paint paint = new Paint();
-
-    TabTextView(Context context) {
-      super(context);
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-      super.onLayout(changed, left, top, right, bottom);
-      resetTextXSize();
-    }
-
-    private void resetTextXSize() {
-      // Reset the paint instance.
-      Paint paint = this.paint;
-      paint.reset();
-      paint.setAntiAlias(true);
-      paint.setTextSize(getTextSize());
-      paint.setTypeface(getTypeface());
-
-      // Measure the width for each line.
-      CharSequence text = getText().toString();
-      float maxTextWidth = 0;
-      int beginIndex = 0;
-      for (int i = beginIndex; i < text.length(); ++i) {
-        if (text.charAt(i) == '\n') {
-          // Split the line.
-          float textWidth = paint.measureText(text, beginIndex, i);
-          if (textWidth > maxTextWidth) {
-            maxTextWidth = textWidth;
-          }
-          // Exclude '\n'.
-          beginIndex = i + 1;
-        }
-      }
-      {
-        // Last line.
-        float textWidth = paint.measureText(text, beginIndex, text.length());
-        if (textWidth > maxTextWidth) {
-          maxTextWidth = textWidth;
-        }
-      }
-
-      // Calculate scale factory. Note that 0.98f is the heuristic value,
-      // in order to avoid wrapping lines by sub px calculations just in case.
-      float scaleX = (getWidth() - getPaddingLeft() - getPaddingRight()) * 0.98f / maxTextWidth;
-
-      // Cap the scaleX by 1f not to widen.
-      setTextScaleX(Math.min(scaleX, 1f));
-    }
-  }
-
-  /**
    * An event listener for the menu dialog window.
    */
   private class EmojiProviderDialogListener implements DialogInterface.OnClickListener {
     private final Context context;
 
     EmojiProviderDialogListener(Context context) {
-      this.context = context;
+      this.context = Preconditions.checkNotNull(context);
     }
 
     @Override
@@ -422,11 +380,10 @@
    * The differences from CandidateView.CandidateWordViewForConversion are
    * 1) this class scrolls horizontally 2) the layout algorithm is simpler.
    */
-  static class SymbolCandidateView extends CandidateWordView {
+  private static class SymbolCandidateView extends CandidateWordView {
     private static final String DESCRIPTION_DELIMITER = "\n";
 
-    private View scrollGuideView = null;
-    private GestureDetector gestureDetector = null;
+    private Optional<View> scrollGuideView = Optional.absent();
 
     public SymbolCandidateView(Context context) {
       super(context, Orientation.VERTICAL);
@@ -442,7 +399,7 @@
 
     // Shared instance initializer.
     {
-      setBackgroundDrawableType(DrawableType.SYMBOL_CANDIDATE_BACKGROUND);
+      setSpanBackgroundDrawableType(DrawableType.SYMBOL_CANDIDATE_BACKGROUND);
       Resources resources = getResources();
       scroller.setDecayRate(
           resources.getInteger(R.integer.symbol_input_scroller_velocity_decay_rate) / 1000000f);
@@ -452,25 +409,27 @@
     }
 
     void setCandidateTextDimension(float textSize, float descriptionTextSize) {
-      Preconditions.checkArgument(textSize > 0);
-      Preconditions.checkArgument(descriptionTextSize > 0);
+      Preconditions.checkArgument(textSize >= 0);
+      Preconditions.checkArgument(descriptionTextSize >= 0);
 
       Resources resources = getResources();
 
       float valueHorizontalPadding =
-          resources.getDimension(R.dimen.candidate_horizontal_padding_size);
+          resources.getDimension(R.dimen.symbol_candidate_horizontal_padding_size);
       float descriptionHorizontalPadding =
           resources.getDimension(R.dimen.symbol_description_right_padding);
       float descriptionVerticalPadding =
           resources.getDimension(R.dimen.symbol_description_bottom_padding);
+      float separatorWidth = resources.getDimensionPixelSize(R.dimen.candidate_separator_width);
 
+      carrierEmojiRenderHelper.setCandidateTextSize(textSize);
       candidateLayoutRenderer.setValueTextSize(textSize);
       candidateLayoutRenderer.setValueHorizontalPadding(valueHorizontalPadding);
       candidateLayoutRenderer.setValueScalingPolicy(ValueScalingPolicy.UNIFORM);
       candidateLayoutRenderer.setDescriptionTextSize(descriptionTextSize);
       candidateLayoutRenderer.setDescriptionHorizontalPadding(descriptionHorizontalPadding);
       candidateLayoutRenderer.setDescriptionVerticalPadding(descriptionVerticalPadding);
-      candidateLayoutRenderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.OVERLAY);
+      candidateLayoutRenderer.setSeparatorWidth(separatorWidth);
 
       SpanFactory spanFactory = new SpanFactory();
       spanFactory.setValueTextSize(textSize);
@@ -492,32 +451,31 @@
       updateLayouter();
     }
 
-    void setOnGestureListener(OnGestureListener gestureListener) {
-      if (gestureListener == null) {
-        gestureDetector = null;
-      } else {
-        gestureDetector = new GestureDetector(getContext(), gestureListener);
-      }
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-      if (gestureDetector != null && gestureDetector.onTouchEvent(event)) {
-        return true;
-      }
-      return super.onTouchEvent(event);
-    }
-
     @Override
     protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
-      if (scrollGuideView != null) {
-        scrollGuideView.invalidate();
+      if (scrollGuideView.isPresent()) {
+        scrollGuideView.get().invalidate();
       }
     }
 
     void setScrollIndicator(View scrollGuideView) {
-      this.scrollGuideView = scrollGuideView;
+      this.scrollGuideView = Optional.of(scrollGuideView);
+    }
+
+    @Override
+    protected Drawable getViewBackgroundDrawable(Skin skin) {
+      return Preconditions.checkNotNull(skin).symbolCandidateViewBackgroundDrawable;
+    }
+
+    @Override
+    public void setSkin(Skin skin) {
+      super.setSkin(skin);
+      candidateLayoutRenderer.setSeparatorColor(skin.symbolCandidateBackgroundSeparatorColor);
+    }
+
+    public void setDescriptionLayoutPolicy(DescriptionLayoutPolicy policy) {
+      candidateLayoutRenderer.setDescriptionLayoutPolicy(Preconditions.checkNotNull(policy));
     }
   }
 
@@ -539,59 +497,46 @@
    */
   static final KeyboardSpecificationName SPEC_NAME =
       new KeyboardSpecificationName("SYMBOL_INPUT_VIEW", 0, 1, 0);
-  // Source ID of the delete button for logging usage stats.
+  // Source ID of the delete/enter button for logging usage stats.
   private static final int DELETE_BUTTON_SOURCE_ID = 1;
-
-  // TODO(hidehiko): move these parameters to skin instance.
-  private static final float BUTTON_CORNOR_RADIUS = 3.5f;  // in dip.
-  private static final float BUTTON_LEFT_OFFSET = 2.0f;
-  private static final float BUTTON_TOP_OFFSET = 2.0f;
-  private static final float BUTTON_RIGHT_OFFSET = 2.0f;
-  private static final float BUTTON_BOTTOM_OFFSET = 2.0f;
-
-  private static final int MAJOR_CATEGORY_TOP_COLOR = 0xFFF5F5F5;
-  private static final int MAJOR_CATEGORY_BOTTOM_COLOR = 0xFFD2D2D2;
-  private static final int MAJOR_CATEGORY_PRESSED_TOP_COLOR = 0xFFAAAAAA;
-  private static final int MAJOR_CATEGORY_PRESSED_BOTTOM_COLOR = 0xFF828282;
-  private static final int MAJOR_CATEGORY_SHADOW_COLOR = 0x57000000;
-
-  // TODO(hidehiko): This parameter is not fixed yet. Needs to revisit again.
-  private static final float SYMBOL_VIEW_MINOR_CATEGORY_TAB_SELECTED_HEIGHT = 6f;
+  private static final int ENTER_BUTTON_SOURCE_ID = 2;
 
   private static final int NUM_TABS = 6;
 
-  private SymbolCandidateStorage symbolCandidateStorage;
+  private Optional<Integer> viewHeight = Optional.absent();
+  private Optional<Integer> numberKeyboardHeight = Optional.absent();
+  private Optional<Float> keyboardHeightScale = Optional.absent();
 
-  @VisibleForTesting SymbolMajorCategory currentMajorCategory;
+  private Optional<SymbolCandidateStorage> symbolCandidateStorage = Optional.absent();
+
+  @VisibleForTesting SymbolMajorCategory currentMajorCategory = SymbolMajorCategory.NUMBER;
   @VisibleForTesting boolean emojiEnabled;
   private boolean isPasswordField;
   @VisibleForTesting EmojiProviderType emojiProviderType = EmojiProviderType.NONE;
 
   @VisibleForTesting SharedPreferences sharedPreferences;
-  @VisibleForTesting AlertDialog emojiProviderDialog;
+  @VisibleForTesting Optional<AlertDialog> emojiProviderDialog = Optional.absent();
 
-  private ViewEventListener viewEventListener;
+  private Optional<ViewEventListener> viewEventListener = Optional.absent();
   private final KeyEventButtonTouchListener deleteKeyEventButtonTouchListener =
       createDeleteKeyEventButtonTouchListener(getResources());
-  private OnClickListener closeButtonClickListener = null;
+  private final KeyEventButtonTouchListener enterKeyEventButtonTouchListener =
+      createEnterKeyEventButtonTouchListener(getResources());
+  private Optional<OnClickListener> closeButtonClickListener = Optional.absent();
+  private Optional<OnClickListener> microphoneButtonClickListener = Optional.absent();
   private final SymbolCandidateSelectListener symbolCandidateSelectListener =
       new SymbolCandidateSelectListener();
 
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
-  private final MozcDrawableFactory mozcDrawableFactory = new MozcDrawableFactory(getResources());
+  private Skin skin = Skin.getFallbackInstance();
   private final SymbolMajorCategoryButtonDrawableFactory majorCategoryButtonDrawableFactory =
-      new SymbolMajorCategoryButtonDrawableFactory(
-          mozcDrawableFactory,
-          MAJOR_CATEGORY_TOP_COLOR,
-          MAJOR_CATEGORY_BOTTOM_COLOR,
-          MAJOR_CATEGORY_PRESSED_TOP_COLOR,
-          MAJOR_CATEGORY_PRESSED_BOTTOM_COLOR,
-          MAJOR_CATEGORY_SHADOW_COLOR,
-          BUTTON_CORNOR_RADIUS * getResources().getDisplayMetrics().density);
+      new SymbolMajorCategoryButtonDrawableFactory(getResources());
   // Candidate text size in dip.
   private float candidateTextSize;
   // Description text size in dip.
   private float desciptionTextSize;
+  private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
+  private boolean isMicrophoneButtonEnabled;
+  private boolean popupEnabled;
 
   public SymbolInputView(Context context, AttributeSet attrs, int defStyle) {
     super(context, attrs, defStyle);
@@ -607,27 +552,28 @@
 
   {
     setOutAnimationListener(new OutAnimationAdapter());
-    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+    sharedPreferences =
+        Preconditions.checkNotNull(PreferenceManager.getDefaultSharedPreferences(getContext()));
   }
 
   private static KeyEventButtonTouchListener createDeleteKeyEventButtonTouchListener(
       Resources resources) {
-    // Use 8 as default value of backspace key code (only for testing).
-    // This code is introduced just for testing purpose due to AndroidMock's limitation.
-    // When we move to EasyMock, we can remove this method.
-    int ucharBackspace = resources == null ? 8 : resources.getInteger(R.integer.uchar_backspace);
-    return new KeyEventButtonTouchListener(DELETE_BUTTON_SOURCE_ID, ucharBackspace);
+    return new KeyEventButtonTouchListener(
+        DELETE_BUTTON_SOURCE_ID, resources.getInteger(R.integer.uchar_backspace));
   }
 
+  private static KeyEventButtonTouchListener createEnterKeyEventButtonTouchListener(
+      Resources resources) {
+    return new KeyEventButtonTouchListener(
+        ENTER_BUTTON_SOURCE_ID, resources.getInteger(R.integer.uchar_linefeed));
+  }
 
   boolean isInflated() {
     return getChildCount() > 0;
   }
 
   void inflateSelf() {
-    if (isInflated()) {
-      throw new IllegalStateException("The symbol input view is already inflated.");
-    }
+    Preconditions.checkState(!isInflated(), "The symbol input view is already inflated.");
 
     // Hack: Because we wrap the real context to inject "retrying" for Drawable loading,
     // LayoutInflater.from(getContext()).getContext() may be different from getContext().
@@ -649,17 +595,112 @@
    * So, instead, we define another onFinishInflate method and invoke this manually.
    */
   protected void onFinishInflateSelf() {
-    initializeMajorCategoryButtons();
+    if (viewHeight.isPresent() && keyboardHeightScale.isPresent()) {
+      setVerticalDimension(viewHeight.get(), keyboardHeightScale.get());
+    }
+
     initializeMinorCategoryTab();
     initializeCloseButton();
     initializeDeleteButton();
+    initializeEnterButton();
+    initializeMicrophoneButton();
 
-    resetMajorCategoryBackground();
-    resetTabBackground();
+    // Set TouchListener that does nothing. Without this hack, state_pressed event
+    // will be propagated to close / enter key and the drawable will be changed to
+    // state_pressed one unexpectedly. Note that those keys are NOT children of this view.
+    // Setting ClickListener to the key seems to suppress this unexpected highlight, too,
+    // but we want to keep the current TouchListener for the enter key.
+    OnTouchListener doNothingOnTouchListener = new OnTouchListener() {
+      @Override
+      public boolean onTouch(View button, android.view.MotionEvent event) {
+        return true;
+      }
+    };
+    for (int id : new int[] {R.id.button_frame_in_symbol_view,
+                             R.id.symbol_view_backspace_separator,
+                             R.id.symbol_major_category,
+                             R.id.symbol_separator_1,
+                             R.id.symbol_separator_2,
+                             R.id.symbol_separator_3,
+                             R.id.symbol_view_close_button_separator,
+                             R.id.symbol_view_enter_button_separator}) {
+      findViewById(id).setOnTouchListener(doNothingOnTouchListener);
+    }
+
+    KeyboardView keyboardView = KeyboardView.class.cast(findViewById(R.id.number_keyboard));
+    keyboardView.setPopupEnabled(popupEnabled);
+    keyboardView.setKeyEventHandler(new KeyEventHandler(
+        Looper.getMainLooper(),
+        new KeyboardActionListener() {
+          @Override
+          public void onRelease(int keycode) {
+          }
+
+          @Override
+          public void onPress(int keycode) {
+            if (viewEventListener.isPresent()) {
+              viewEventListener.get().onFireFeedbackEvent(FeedbackEvent.KEY_DOWN);
+            }
+          }
+
+          @Override
+          public void onKey(int primaryCode, List<TouchEvent> touchEventList) {
+            if (keyEventHandler.isPresent()) {
+              keyEventHandler.get().sendKey(primaryCode, touchEventList);
+            }
+          }
+
+          @Override
+          public void onCancel() {
+          }
+        },
+        getResources().getInteger(R.integer.config_repeat_key_delay),
+        getResources().getInteger(R.integer.config_repeat_key_interval),
+        getResources().getInteger(R.integer.config_long_press_key_delay)));
+
     enableEmoji(emojiEnabled);
+
+    // Disable h/w acceleration to use a PictureDrawable.
+    for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
+      getMajorCategoryButton(majorCategory).setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+    }
+
+    updateSkinAwareDrawable();
     reset();
   }
 
+  private static void setLayoutHeight(View view, int height) {
+    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
+    layoutParams.height = height;
+    view.setLayoutParams(layoutParams);
+  }
+
+  public void setVerticalDimension(int symbolInputViewHeight, float keyboardHeightScale) {
+    this.viewHeight = Optional.of(symbolInputViewHeight);
+    this.keyboardHeightScale = Optional.of(keyboardHeightScale);
+
+    Resources resources = getResources();
+    float originalMajorCategoryHeight =
+        resources.getDimension(R.dimen.symbol_view_major_category_height);
+    int majorCategoryHeight = Math.round(originalMajorCategoryHeight * keyboardHeightScale);
+    this.numberKeyboardHeight = Optional.of(
+        symbolInputViewHeight - majorCategoryHeight
+        - resources.getDimensionPixelSize(R.dimen.button_frame_height));
+
+    if (!isInflated()) {
+      return;
+    }
+
+    setLayoutHeight(this, symbolInputViewHeight);
+    setLayoutHeight(getMajorCategoryFrame(), majorCategoryHeight);
+    setLayoutHeight(findViewById(R.id.number_keyboard), numberKeyboardHeight.get());
+    setLayoutHeight(findViewById(R.id.number_keyboard_frame), LayoutParams.WRAP_CONTENT);
+  }
+
+  public int getNumberKeyboardHeight() {
+    return numberKeyboardHeight.get();
+  }
+
   private void resetCandidateViewPager() {
     if (!isInflated()) {
       return;
@@ -667,52 +708,59 @@
 
     ViewPager candidateViewPager = getCandidateViewPager();
     TabHost tabHost = getTabHost();
+    Preconditions.checkState(symbolCandidateStorage.isPresent());
 
     SymbolTabWidgetViewPagerAdapter adapter = new SymbolTabWidgetViewPagerAdapter(
         getContext(),
-        symbolCandidateStorage, viewEventListener, symbolCandidateSelectListener,
-        currentMajorCategory, skinType, emojiProviderType, tabHost, candidateViewPager,
+        symbolCandidateStorage.get(), viewEventListener, symbolCandidateSelectListener,
+        currentMajorCategory, skin, emojiProviderType, tabHost, candidateViewPager,
         candidateTextSize, desciptionTextSize);
     candidateViewPager.setAdapter(adapter);
     candidateViewPager.setOnPageChangeListener(adapter);
     tabHost.setOnTabChangedListener(adapter);
   }
 
-  private void resetMajorCategoryBackground() {
-    View view = findViewById(R.id.symbol_major_category);
+  @SuppressWarnings("deprecation")
+  private void updateMajorCategoryBackgroundSkin() {
+    View view = getMajorCategoryFrame();
     if (view != null) {
-      if (skinType == null) {
-        view.setBackgroundColor(Color.BLACK);
-      } else {
-        view.setBackgroundResource(skinType.windowBackgroundResourceId);
-      }
+      view.setBackgroundDrawable(
+          skin.symbolMajorCategoryBackgroundDrawable.getConstantState().newDrawable());
     }
   }
 
-  private void setMozcDrawable(ImageView imageView, int resourceId) {
-    Optional<Drawable> drawable = mozcDrawableFactory.getDrawable(resourceId);
-    if (drawable.isPresent()) {
-      imageView.setImageDrawable(drawable.get());
+  @SuppressWarnings("deprecation")
+  private void updateMinorCategoryBackgroundSkin() {
+    View view = getMinorCategoryFrame();
+    if (view != null) {
+      view.setBackgroundDrawable(
+          skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
     }
   }
 
+  @SuppressWarnings("deprecation")
+  private void updateNumberKeyboardSkin() {
+    getNumberKeyboardView().setSkin(skin);
+    findViewById(R.id.number_frame).setBackgroundDrawable(
+        skin.windowBackgroundDrawable.getConstantState().newDrawable());
+    findViewById(R.id.button_frame_in_symbol_view).setBackgroundDrawable(
+        skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
+  }
+
   /**
    * Sets click event handlers to each major category button.
    * It is necessary that the inflation has been done before this method invocation.
    */
   @SuppressWarnings("deprecation")
-  private void initializeMajorCategoryButtons() {
+  private void updateMajorCategoryButtonsSkin() {
+    Resources resources = getResources();
     for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
-      ImageView view = ImageView.class.cast(findViewById(majorCategory.buttonResourceId));
-      if (view == null) {
-        throw new IllegalStateException(
-            "The view corresponding to " + majorCategory.name() + " is not found.");
-      }
+      MozcImageButton view = getMajorCategoryButton(majorCategory);
+      Preconditions.checkState(
+          view != null, "The view corresponding to " + majorCategory.name() + " is not found.");
       view.setOnClickListener(new MajorCategoryButtonClickListener(majorCategory));
-      setMozcDrawable(view, majorCategory.buttonImageResourceId);
-
       switch (majorCategory) {
-        case SYMBOL:
+        case NUMBER:
           view.setBackgroundDrawable(
               majorCategoryButtonDrawableFactory.createLeftButtonDrawable());
           break;
@@ -725,16 +773,16 @@
               majorCategoryButtonDrawableFactory.createCenterButtonDrawable());
           break;
       }
+      view.setImageDrawable(skin.getDrawable(resources, majorCategory.buttonImageResourceId));
+      // Update the padding since setBackgroundDrawable() overwrites it.
+      view.setMaxImageHeight(
+          resources.getDimensionPixelSize(majorCategory.maxImageHeightResourceId));
     }
   }
 
   private void initializeMinorCategoryTab() {
-    TabHost tabhost = TabHost.class.cast(findViewById(android.R.id.tabhost));
+    TabHost tabhost = getTabHost();
     tabhost.setup();
-
-    float textSize = getResources().getDimension(R.dimen.symbol_view_minor_category_text_size);
-    int textColor = getResources().getColor(android.R.color.black);
-
     // Create NUM_TABS (= 6) tabs.
     // Note that we may want to change the number of tabs, however due to the limitation of
     // the current TabHost implementation, it is difficult. Fortunately, all major categories
@@ -742,12 +790,9 @@
     for (int i = 0; i < NUM_TABS; ++i) {
       // The tab's id is the index of the tab.
       TabSpec tab = tabhost.newTabSpec(String.valueOf(i));
-      TextView textView = new TabTextView(getContext());
-      textView.setTypeface(Typeface.DEFAULT_BOLD);
-      textView.setTextColor(textColor);
-      textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-      textView.setGravity(Gravity.CENTER);
-      tab.setIndicator(textView);
+      MozcImageView view = new MozcImageView(getContext());
+      view.setSoundEffectsEnabled(false);
+      tab.setIndicator(view);
       // Set dummy view for the content. The actual content will be managed by ViewPager.
       tab.setContent(R.id.symbol_input_dummy);
       tabhost.addTab(tab);
@@ -759,79 +804,84 @@
   }
 
   @SuppressWarnings("deprecation")
-  private void resetTabBackground() {
+  private void updateTabBackgroundSkin() {
     if (!isInflated()) {
       return;
     }
-
-    float density = getResources().getDisplayMetrics().density;
-
-    TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+    getTabHost().setBackgroundDrawable(
+        skin.windowBackgroundDrawable.getConstantState().newDrawable());
+    TabWidget tabWidget = getTabWidget();
     for (int i = 0; i < tabWidget.getTabCount(); ++i) {
       View view = tabWidget.getChildTabViewAt(i);
-      view.setBackgroundDrawable(createTabBackgroundDrawable(skinType, density));
+      view.setBackgroundDrawable(createTabBackgroundDrawable(skin));
     }
   }
 
-  private static Drawable createTabBackgroundDrawable(SkinType skinType, float density) {
+  private static Drawable createTabBackgroundDrawable(Skin skin) {
+    Preconditions.checkNotNull(skin);
     return new LayerDrawable(new Drawable[] {
         BackgroundDrawableFactory.createSelectableDrawable(
             new TabSelectedBackgroundDrawable(
-                (int) (SYMBOL_VIEW_MINOR_CATEGORY_TAB_SELECTED_HEIGHT * density),
-                skinType.symbolMinorCategoryTabSelectedColor),
-            null),
-        BackgroundDrawableFactory.createPressableDrawable(
-            new ColorDrawable(skinType.symbolMinorCategoryTabPressedColor), null),
+                Math.round(skin.symbolMinorIndicatorHeightDimension),
+                skin.symbolMinorCategoryTabSelectedColor),
+            Optional.<Drawable>absent()),
+        createMinorButtonBackgroundDrawable(skin)
     });
   }
 
-  private void resetTabText() {
+  private void resetTabImageForMinorCategory() {
     if (!isInflated()) {
       return;
     }
-
-    TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+    TabWidget tabWidget = getTabWidget();
     List<SymbolMinorCategory> minorCategoryList = currentMajorCategory.minorCategories;
-    for (int i = 0; i < tabWidget.getChildCount(); ++i) {
-      TextView textView = TextView.class.cast(tabWidget.getChildTabViewAt(i));
-      textView.setText(minorCategoryList.get(i).textResourceId);
+    int definedTabSize = Math.min(minorCategoryList.size(), tabWidget.getChildCount());
+    for (int i = 0; i < definedTabSize; ++i) {
+      MozcImageView view = MozcImageView.class.cast(tabWidget.getChildTabViewAt(i));
+      SymbolMinorCategory symbolMinorCategory = minorCategoryList.get(i);
+      view.setRawId(symbolMinorCategory.drawableResourceId);
+      if (symbolMinorCategory.maxImageHeightResourceId != SymbolMinorCategory.INVALID_RESOURCE_ID) {
+        view.setMaxImageHeight(
+            getResources().getDimensionPixelSize(symbolMinorCategory.maxImageHeightResourceId));
+      }
+      if (symbolMinorCategory.contentDescriptionResourceId
+          != SymbolMinorCategory.INVALID_RESOURCE_ID) {
+        view.setContentDescription(
+            getResources().getString(symbolMinorCategory.contentDescriptionResourceId));
+      }
     }
   }
 
-  private static Drawable createButtonBackgroundDrawable(SkinType skinType, float density) {
+  private static Drawable createMajorButtonBackgroundDrawable(Skin skin) {
+    int padding = Math.round(skin.symbolMajorButtonPaddingDimension);
+    int round = Math.round(skin.symbolMajorButtonRoundDimension);
     return BackgroundDrawableFactory.createPressableDrawable(
         new RoundRectKeyDrawable(
-            (int) (BUTTON_LEFT_OFFSET * density),
-            (int) (BUTTON_TOP_OFFSET * density),
-            (int) (BUTTON_RIGHT_OFFSET * density),
-            (int) (BUTTON_BOTTOM_OFFSET * density),
-            (int) (BUTTON_CORNOR_RADIUS * density),
-            skinType.symbolPressedFunctionKeyTopColor,
-            skinType.symbolPressedFunctionKeyBottomColor,
-            skinType.symbolPressedFunctionKeyHighlightColor,
-            skinType.symbolPressedFunctionKeyShadowColor),
-        new RoundRectKeyDrawable(
-            (int) (BUTTON_LEFT_OFFSET * density),
-            (int) (BUTTON_TOP_OFFSET * density),
-            (int) (BUTTON_RIGHT_OFFSET * density),
-            (int) (BUTTON_BOTTOM_OFFSET * density),
-            (int) (BUTTON_CORNOR_RADIUS * density),
-            skinType.symbolReleasedFunctionKeyTopColor,
-            skinType.symbolReleasedFunctionKeyBottomColor,
-            skinType.symbolReleasedFunctionKeyHighlightColor,
-            skinType.symbolReleasedFunctionKeyShadowColor));
+            padding, padding, padding, padding, round,
+            skin.symbolPressedFunctionKeyTopColor,
+            skin.symbolPressedFunctionKeyBottomColor,
+            skin.symbolPressedFunctionKeyHighlightColor,
+            skin.symbolPressedFunctionKeyShadowColor),
+        Optional.<Drawable>of(new RoundRectKeyDrawable(
+            padding, padding, padding, padding, round,
+            skin.symbolReleasedFunctionKeyTopColor,
+            skin.symbolReleasedFunctionKeyBottomColor,
+            skin.symbolReleasedFunctionKeyHighlightColor,
+            skin.symbolReleasedFunctionKeyShadowColor)));
+  }
+
+  private static Drawable createMinorButtonBackgroundDrawable(Skin skin) {
+    return BackgroundDrawableFactory.createPressableDrawable(
+        new ColorDrawable(skin.symbolMinorCategoryTabPressedColor),
+        Optional.<Drawable>absent());
   }
 
   @SuppressWarnings("deprecation")
   private void initializeCloseButton() {
     ImageView closeButton = ImageView.class.cast(findViewById(R.id.symbol_view_close_button));
-    if (closeButtonClickListener != null) {
-      closeButton.setOnClickListener(closeButtonClickListener);
+    if (closeButtonClickListener.isPresent()) {
+      closeButton.setOnClickListener(closeButtonClickListener.get());
     }
-    closeButton.setBackgroundDrawable(
-        createButtonBackgroundDrawable(skinType, getResources().getDisplayMetrics().density));
-    setMozcDrawable(closeButton, R.raw.symbol__function__close);
-    closeButton.setPadding(2, 2, 2, 2);
   }
 
   /**
@@ -840,37 +890,77 @@
    */
   @SuppressWarnings("deprecation")
   private void initializeDeleteButton() {
-    ImageView deleteButton = ImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
+    MozcImageView deleteButton =
+        MozcImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
     deleteButton.setOnTouchListener(deleteKeyEventButtonTouchListener);
-    deleteButton.setBackgroundDrawable(
-        createButtonBackgroundDrawable(skinType, getResources().getDisplayMetrics().density));
-    setMozcDrawable(deleteButton, R.raw.symbol__function__delete);
-    deleteButton.setPadding(0, 0, 0, 0);
   }
 
-  TabHost getTabHost() {
+  /** c.f., {@code initializeDeleteButton}. */
+  @SuppressWarnings("deprecation")
+  private void initializeEnterButton() {
+    ImageView enterButton = ImageView.class.cast(findViewById(R.id.symbol_view_enter_button));
+    enterButton.setOnTouchListener(enterKeyEventButtonTouchListener);
+  }
+
+  private void initializeMicrophoneButton() {
+    MozcImageView microphoneButton = getMicrophoneButton();
+    if (microphoneButtonClickListener.isPresent()) {
+      microphoneButton.setOnClickListener(microphoneButtonClickListener.get());
+    }
+    microphoneButton.setVisibility(isMicrophoneButtonEnabled ? VISIBLE : GONE);
+  }
+
+  @SuppressWarnings("deprecation")
+  private void updateSeparatorsSkin() {
+    Resources resources = getResources();
+    int minorPaddingSize = (int) resources.getFraction(
+        R.fraction.symbol_separator_padding_fraction,
+        resources.getDimensionPixelSize(R.dimen.button_frame_height), 0);
+    findViewById(R.id.symbol_view_backspace_separator).setBackgroundDrawable(
+        new InsetDrawable(new ColorDrawable(skin.symbolSeparatorColor),
+                          0, minorPaddingSize, 0, minorPaddingSize));
+    int majorPaddingSize = (int) resources.getFraction(
+        R.fraction.symbol_separator_padding_fraction,
+        resources.getDimensionPixelSize(R.dimen.symbol_view_major_category_height), 0);
+    InsetDrawable separator = new InsetDrawable(
+        new ColorDrawable(skin.symbolSeparatorColor), 0, majorPaddingSize, 0, majorPaddingSize);
+    for (int id : new int[] {R.id.symbol_view_close_button_separator,
+                             R.id.symbol_view_enter_button_separator}) {
+      findViewById(id).setBackgroundDrawable(separator.getConstantState().newDrawable());
+    }
+
+    for (int id : new int[] {R.id.symbol_separator_1,
+                             R.id.symbol_separator_3}) {
+      findViewById(id).setBackgroundDrawable(
+          skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
+    }
+    findViewById(R.id.symbol_separator_2).setBackgroundDrawable(
+        skin.symbolSeparatorAboveMajorCategoryBackgroundDrawable
+            .getConstantState().newDrawable());
+  }
+
+  @VisibleForTesting TabHost getTabHost() {
     return TabHost.class.cast(findViewById(android.R.id.tabhost));
   }
 
-  ViewPager getCandidateViewPager() {
+  private ViewPager getCandidateViewPager() {
     return ViewPager.class.cast(findViewById(R.id.symbol_input_candidate_view_pager));
   }
 
-  ImageButton getMajorCategoryButton(SymbolMajorCategory majorCategory) {
-    if (majorCategory == null) {
-      throw new NullPointerException("majorCategory shouldn't be null.");
-    }
-    return ImageButton.class.cast(findViewById(majorCategory.buttonResourceId));
+  @VisibleForTesting MozcImageButton getMajorCategoryButton(SymbolMajorCategory majorCategory) {
+    Preconditions.checkNotNull(majorCategory);
+    return MozcImageButton.class.cast(findViewById(majorCategory.buttonResourceId));
   }
 
-  View getEmojiDisabledMessageView() {
+  @VisibleForTesting View getEmojiDisabledMessageView() {
     return findViewById(R.id.symbol_emoji_disabled_message_view);
   }
 
   public void setEmojiEnabled(boolean unicodeEmojiEnabled, boolean carrierEmojiEnabled) {
     this.emojiEnabled = unicodeEmojiEnabled || carrierEmojiEnabled;
     enableEmoji(this.emojiEnabled);
-    symbolCandidateStorage.setEmojiEnabled(unicodeEmojiEnabled, carrierEmojiEnabled);
+    Preconditions.checkState(symbolCandidateStorage.isPresent());
+    symbolCandidateStorage.get().setEmojiEnabled(unicodeEmojiEnabled, carrierEmojiEnabled);
   }
 
   public void setPasswordField(boolean isPasswordField) {
@@ -883,36 +973,47 @@
       return;
     }
 
-    ImageButton imageButton = getMajorCategoryButton(SymbolMajorCategory.EMOJI);
+    MozcImageButton imageButton = getMajorCategoryButton(SymbolMajorCategory.EMOJI);
     imageButton.setBackgroundDrawable(
         majorCategoryButtonDrawableFactory.createRightButtonDrawable(enableEmoji));
+    // Update the padding since setBackgroundDrawable() overwrites it.
+    imageButton.setMaxImageHeight(getResources().getDimensionPixelSize(
+        SymbolMajorCategory.EMOJI.maxImageHeightResourceId));
   }
 
-  /**
-   * Resets the status.
-   */
-  void reset() {
-    // the current minor category is also updated in setMajorCategory.
-    setMajorCategory(SymbolMajorCategory.SYMBOL);
+  void resetToMajorCategory(Optional<SymbolMajorCategory> category) {
+    Preconditions.checkNotNull(category);
+    setMajorCategory(category.or(currentMajorCategory));
     deleteKeyEventButtonTouchListener.reset();
+    enterKeyEventButtonTouchListener.reset();
+  }
+
+  @VisibleForTesting void reset() {
+    // the current minor category is also updated in setMajorCategory.
+    resetToMajorCategory(Optional.of(SymbolMajorCategory.NUMBER));
   }
 
   @Override
   public void setVisibility(int visibility) {
     int previousVisibility = getVisibility();
     super.setVisibility(visibility);
-    if (viewEventListener != null
-        && previousVisibility == View.VISIBLE && visibility != View.VISIBLE) {
-      viewEventListener.onCloseSymbolInputView();
+    if (viewEventListener.isPresent()) {
+      if (previousVisibility == View.VISIBLE && visibility != View.VISIBLE) {
+        viewEventListener.get().onCloseSymbolInputView();
+      } else if (previousVisibility != View.VISIBLE && visibility == View.VISIBLE) {
+        viewEventListener.get().onShowSymbolInputView(Collections.<TouchEvent>emptyList());
+      }
     }
   }
 
   void setSymbolCandidateStorage(SymbolCandidateStorage symbolCandidateStorage) {
-    this.symbolCandidateStorage = symbolCandidateStorage;
+    this.symbolCandidateStorage = Optional.of(symbolCandidateStorage);
   }
 
   void setKeyEventHandler(KeyEventHandler keyEventHandler) {
+    this.keyEventHandler = Optional.of(keyEventHandler);
     deleteKeyEventButtonTouchListener.setKeyEventHandler(keyEventHandler);
+    enterKeyEventButtonTouchListener.setKeyEventHandler(keyEventHandler);
   }
 
   void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
@@ -923,12 +1024,19 @@
     this.desciptionTextSize = descriptionTextSize;
   }
 
+  void setPopupEnabled(boolean popupEnabled) {
+    this.popupEnabled = popupEnabled;
+    if (!isInflated()) {
+      return;
+    }
+    getNumberKeyboardView().setPopupEnabled(popupEnabled);
+  }
+
   /**
    * Initializes EmojiProvider selection dialog, if necessary.
-   * Exposed as protected for testing purpose.
    */
-  protected void maybeInitializeEmojiProviderDialog(Context context) {
-    if (emojiProviderDialog != null) {
+  @VisibleForTesting void maybeInitializeEmojiProviderDialog(Context context) {
+    if (emojiProviderDialog.isPresent()) {
       return;
     }
 
@@ -938,7 +1046,7 @@
           .setTitle(R.string.pref_emoji_provider_type_title)
           .setItems(R.array.pref_emoji_provider_type_entries, listener)
           .create();
-      this.emojiProviderDialog = dialog;
+      this.emojiProviderDialog = Optional.of(dialog);
     } catch (InflateException e) {
       // Ignore the exception.
     }
@@ -950,32 +1058,66 @@
    * The view is updated.
    * The active minor category is also updated.
    *
+   * This method submit a preedit text except for a {@link SymbolMajorCategory#NUMBER} major
+   * category since this class commit a candidate directly.
+   *
    * @param newCategory the major category to show.
    */
-  protected void setMajorCategory(SymbolMajorCategory newCategory) {
-    if (newCategory == null) {
-      throw new NullPointerException("newCategory must be non-null.");
+  @VisibleForTesting void setMajorCategory(SymbolMajorCategory newCategory) {
+    Preconditions.checkNotNull(newCategory);
+
+    {
+      SymbolCandidateView symbolCandidateView =
+          SymbolCandidateView.class.cast(findViewById(R.id.symbol_input_candidate_view));
+      if (symbolCandidateView != null) {
+        symbolCandidateView.reset();
+      }
     }
+
+    if (newCategory != SymbolMajorCategory.NUMBER && viewEventListener.isPresent()) {
+      viewEventListener.get().onSubmitPreedit();
+    }
+
+    if (newCategory == SymbolMajorCategory.NUMBER) {
+      CandidateView candidateView =
+          CandidateView.class.cast(findViewById(R.id.candidate_view_in_symbol_view));
+      candidateView.clearAnimation();
+      candidateView.setVisibility(View.GONE);
+      candidateView.reset();
+    }
+
     currentMajorCategory = newCategory;
 
-    // Reset the minor category to the default value.
-    resetTabText();
-    resetCandidateViewPager();
-    SymbolMinorCategory minorCategory = currentMajorCategory.getDefaultMinorCategory();
-    if (symbolCandidateStorage.getCandidateList(minorCategory).getCandidatesCount() == 0) {
-      minorCategory = currentMajorCategory.getMinorCategoryByRelativeIndex(minorCategory, 1);
+    if (currentMajorCategory == SymbolMajorCategory.NUMBER) {
+      findViewById(android.R.id.tabhost).setVisibility(View.GONE);
+      findViewById(R.id.number_frame).setVisibility(View.VISIBLE);
+      setNumberKeyboard();
+    } else {
+      findViewById(android.R.id.tabhost).setVisibility(View.VISIBLE);
+      findViewById(R.id.number_frame).setVisibility(View.GONE);
+      updateMinorCategory();
     }
-    int index = newCategory.minorCategories.indexOf(minorCategory);
-    getCandidateViewPager().setCurrentItem(index);
-    getTabHost().setCurrentTab(index);
+
+    // Hide overlapping separator
+    if (currentMajorCategory == SymbolMajorCategory.NUMBER) {
+      findViewById(R.id.symbol_view_close_button_separator).setVisibility(View.INVISIBLE);
+    } else {
+      findViewById(R.id.symbol_view_close_button_separator).setVisibility(View.VISIBLE);
+    }
+
+    if (currentMajorCategory == SymbolMajorCategory.EMOJI) {
+      findViewById(R.id.symbol_view_enter_button_separator).setVisibility(View.INVISIBLE);
+    } else {
+      findViewById(R.id.symbol_view_enter_button_separator).setVisibility(View.VISIBLE);
+    }
 
     // Update visibility relating attributes.
     for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
       // Update major category selector button's look and feel.
-      ImageButton button = getMajorCategoryButton(majorCategory);
+      MozcImageButton button = getMajorCategoryButton(majorCategory);
       if (button != null) {
-        button.setSelected(majorCategory == newCategory);
-        button.setEnabled(majorCategory != newCategory);
+        button.setSelected(majorCategory == currentMajorCategory);
+        button.setEnabled(majorCategory != currentMajorCategory);
       }
     }
 
@@ -983,15 +1125,62 @@
     if (emojiDisabledMessageView != null) {
       // Show messages about emoji-disabling, if necessary.
       emojiDisabledMessageView.setVisibility(
-          newCategory == SymbolMajorCategory.EMOJI && !emojiEnabled ? View.VISIBLE : View.GONE);
+          currentMajorCategory == SymbolMajorCategory.EMOJI
+          && !emojiEnabled ? View.VISIBLE : View.GONE);
     }
   }
 
+  private void setNumberKeyboard() {
+    final KeyboardSpecification spec = KeyboardSpecification.SYMBOL_NUMBER;
+    final KeyboardFactory factory = new KeyboardFactory();
+
+    getNumberKeyboardView().addOnLayoutChangeListener(new OnLayoutChangeListener() {
+      @Override
+      public void onLayoutChange(
+          View view, int left, int top, int right, int bottom,
+          int oldLeft, int oldTop, int oldRight, int oldBottom) {
+        if (right - left == 0 || bottom - top == 0) {
+          return;
+        }
+        KeyboardView keyboardView = KeyboardView.class.cast(view);
+        Keyboard keyboard = factory.get(getResources(), spec, right - left, bottom - top);
+        keyboardView.setKeyboard(keyboard);
+        keyboardView.invalidate();
+      }
+    });
+  }
+
+  private void updateMinorCategory() {
+    // Reset the minor category to the default value.
+    resetTabImageForMinorCategory();
+    resetCandidateViewPager();
+    SymbolMinorCategory minorCategory = currentMajorCategory.getDefaultMinorCategory();
+    Preconditions.checkState(symbolCandidateStorage.isPresent());
+    if (symbolCandidateStorage.get().getCandidateList(minorCategory).getCandidatesCount() == 0) {
+      minorCategory = currentMajorCategory.getMinorCategoryByRelativeIndex(minorCategory, 1);
+    }
+    int index = currentMajorCategory.minorCategories.indexOf(minorCategory);
+    getCandidateViewPager().setCurrentItem(index);
+
+    // Disable feedback before setting the current tab programatically.
+    // Background: TabHost.setCurrentTab calls back onTabChanged, in which feedback event is fired.
+    // However, we don't have ways to distinguish if onTabChanged is called through user click
+    // event or by the call of setCurrentTab.  If we don't disable feedback here, the click sound
+    // effect is fired twice; one is from the onClick event on major category tab and the other is
+    // by the call of setCurrentTab here.  See b/17119766.
+    SymbolTabWidgetViewPagerAdapter adapter =
+        SymbolTabWidgetViewPagerAdapter.class.cast(getCandidateViewPager().getAdapter());
+    adapter.setFeedbackEnabled(false);
+    getTabHost().setCurrentTab(index);
+    adapter.setFeedbackEnabled(true);
+  }
+
   void setEmojiProviderType(EmojiProviderType emojiProviderType) {
     Preconditions.checkNotNull(emojiProviderType);
 
+    Preconditions.checkState(symbolCandidateStorage.isPresent());
     this.emojiProviderType = emojiProviderType;
-    this.symbolCandidateStorage.setEmojiProviderType(emojiProviderType);
+    this.symbolCandidateStorage.get().setEmojiProviderType(emojiProviderType);
     if (!isInflated()) {
       return;
     }
@@ -999,29 +1188,99 @@
     resetCandidateViewPager();
   }
 
-  void setViewEventListener(ViewEventListener listener, OnClickListener closeButtonClickListener) {
-    if (listener == null) {
-      throw new NullPointerException("lister must be non-null.");
-    }
-    viewEventListener = listener;
-    this.closeButtonClickListener = closeButtonClickListener;
+  void setEventListener(
+      ViewEventListener viewEventListener, OnClickListener closeButtonClickListener,
+      OnClickListener microphoneButtonClickListener) {
+    this.viewEventListener = Optional.of(viewEventListener);
+    this.closeButtonClickListener = Optional.of(closeButtonClickListener);
+    this.microphoneButtonClickListener = Optional.of(microphoneButtonClickListener);
   }
 
-  void setSkinType(SkinType skinType) {
-    if (this.skinType == skinType) {
+  void setMicrophoneButtonEnabled(boolean enabled) {
+    isMicrophoneButtonEnabled = enabled;
+    if (isInflated()) {
+      getMicrophoneButton().setVisibility(enabled ? VISIBLE : GONE);
+    }
+  }
+
+  void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    if (this.skin.equals(skin)) {
       return;
     }
-
-    this.skinType = skinType;
-    mozcDrawableFactory.setSkinType(skinType);
+    this.skin = skin;
+    majorCategoryButtonDrawableFactory.setSkin(skin);
     if (!isInflated()) {
       return;
     }
+    updateSkinAwareDrawable();
+  }
 
-    // Reset the minor category tab, candidate view and major category buttons.
-    resetTabBackground();
-    resetCandidateViewPager();
-    resetMajorCategoryBackground();
+  @SuppressWarnings("deprecation")
+  private void updateSkinAwareDrawable() {
+    updateTabBackgroundSkin();
+    resetTabImageForMinorCategory();
+
+    SymbolTabWidgetViewPagerAdapter adapter =
+        SymbolTabWidgetViewPagerAdapter.class.cast(getCandidateViewPager().getAdapter());
+    if (adapter != null) {
+      adapter.setSkin(skin);
+    }
+    updateMajorCategoryBackgroundSkin();
+    updateMajorCategoryButtonsSkin();
+    updateMinorCategoryBackgroundSkin();
+    updateNumberKeyboardSkin();
+    updateSeparatorsSkin();
+    getMicrophoneButton().setSkin(skin);
+
+    TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+    for (int i = 0; i < tabWidget.getChildCount(); ++i) {
+      MozcImageView.class.cast(tabWidget.getChildTabViewAt(i)).setSkin(skin);
+    }
+
+    // Note delete button shouldn't be applied createMajorButtonBackgroundDrawable as background
+    // as it should show different background (same as minor categories).
+    for (int id : new int[] {R.id.symbol_view_close_button,
+                             R.id.symbol_view_enter_button}) {
+      MozcImageView view = MozcImageView.class.cast(findViewById(id));
+      view.setSkin(skin);
+      view.setBackgroundDrawable(createMajorButtonBackgroundDrawable(skin));
+    }
+    MozcImageView deleteKeyView =
+        MozcImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
+    deleteKeyView.setSkin(skin);
+    deleteKeyView.setBackgroundDrawable(createMinorButtonBackgroundDrawable(skin));
+  }
+
+  private KeyboardView getNumberKeyboardView() {
+    return KeyboardView.class.cast(findViewById(R.id.number_keyboard));
+  }
+
+  private LinearLayout getMajorCategoryFrame() {
+    return LinearLayout.class.cast(findViewById(R.id.symbol_major_category));
+  }
+
+  private LinearLayout getMinorCategoryFrame() {
+    return LinearLayout.class.cast(findViewById(R.id.symbol_minor_category));
+  }
+
+  private TabWidget getTabWidget() {
+    return TabWidget.class.cast(findViewById(android.R.id.tabs));
+  }
+
+  private MozcImageView getMicrophoneButton() {
+    return MozcImageView.class.cast(findViewById(R.id.microphone_button));
+  }
+
+  @Override
+  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+    super.onSizeChanged(w, h, oldw, oldh);
+    // The boundary of Drawable instance which has been set as background
+    // is not updated automatically.
+    // Update the boundary below.
+    if (isInflated()) {
+      updateSkinAwareDrawable();
+    }
   }
 
   @Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java b/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
index c98b2f0..36cfcd1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
@@ -30,9 +30,9 @@
 package org.mozc.android.inputmethod.japanese;
 
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
@@ -41,6 +41,8 @@
 
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 /**
  * This class delegates all method calls to a ViewEventListener, passed to the constructor.
  * Typical usage is to hook/override some of listener's methods to change their behavior.
@@ -61,6 +63,7 @@
  */
 @SuppressWarnings("javadoc")
 public abstract class ViewEventDelegator implements ViewEventListener {
+
   private final ViewEventListener delegated;
 
   public ViewEventDelegator(ViewEventListener delegated) {
@@ -68,14 +71,15 @@
   }
 
   @Override
-  public void onKeyEvent(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
-                         KeyboardSpecification keyboardSpecification,
-                         List<? extends TouchEvent> touchEventList) {
+  public void onKeyEvent(@Nullable ProtoCommands.KeyEvent mozcKeyEvent,
+                         @Nullable KeyEventInterface keyEvent,
+                         @Nullable KeyboardSpecification keyboardSpecification,
+                         List<TouchEvent> touchEventList) {
     delegated.onKeyEvent(mozcKeyEvent, keyEvent, keyboardSpecification, touchEventList);
   }
 
   @Override
-  public void onUndo(List<? extends TouchEvent> touchEventList) {
+  public void onUndo(List<TouchEvent> touchEventList) {
     delegated.onUndo(touchEventList);
   }
 
@@ -85,6 +89,16 @@
   }
 
   @Override
+  public void onPageUp() {
+    delegated.onPageUp();
+  }
+
+  @Override
+  public void onPageDown() {
+    delegated.onPageDown();
+  }
+
+  @Override
   public void onSymbolCandidateSelected(SymbolMajorCategory majorCategory, String candidate,
                                         boolean updateHistory) {
     delegated.onSymbolCandidateSelected(majorCategory, candidate, updateHistory);
@@ -106,12 +120,12 @@
   }
 
   @Override
-  public void onShowMenuDialog(List<? extends TouchEvent> touchEventList) {
+  public void onShowMenuDialog(List<TouchEvent> touchEventList) {
     delegated.onShowMenuDialog(touchEventList);
   }
 
   @Override
-  public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList) {
+  public void onShowSymbolInputView(List<TouchEvent> touchEventList) {
     delegated.onShowSymbolInputView(touchEventList);
   }
 
@@ -129,4 +143,15 @@
   public void onActionKey() {
     delegated.onActionKey();
   }
+
+  @Override
+  public void onNarrowModeChanged(boolean newNarrowMode) {
+    delegated.onNarrowModeChanged(newNarrowMode);
+  }
+
+  @Override
+  public void onUpdateKeyboardLayoutAdjustment(
+      ViewManagerInterface.LayoutAdjustment layoutAdjustment) {
+    delegated.onUpdateKeyboardLayoutAdjustment(layoutAdjustment);
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java b/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
index e43e4a6..c7cf441 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
@@ -30,9 +30,9 @@
 package org.mozc.android.inputmethod.japanese;
 
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
@@ -40,6 +40,8 @@
 
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 /**
  * Callback object for view evnets.
  *
@@ -54,16 +56,17 @@
    * @param touchEventList {@code TouchEvent} instances related to this key event for logging
    *        usage stats.
    */
-  public void onKeyEvent(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
-                         KeyboardSpecification keyboardSpecification,
-                         List<? extends TouchEvent> touchEventList);
+  public void onKeyEvent(@Nullable ProtoCommands.KeyEvent mozcKeyEvent,
+                         @Nullable KeyEventInterface keyEvent,
+                         @Nullable KeyboardSpecification keyboardSpecification,
+                         List<TouchEvent> touchEventList);
 
   /**
    * Called when Undo is fired (by soft keyboard).
    * @param touchEventList {@code TouchEvent} instances related to this undo for logging
    *        usage stats.
    */
-  public void onUndo(List<? extends TouchEvent> touchEventList);
+  public void onUndo(List<TouchEvent> touchEventList);
 
   /**
    * Called when a conversion candidate is selected.
@@ -73,6 +76,12 @@
    */
   public void onConversionCandidateSelected(int candidateId, Optional<Integer> rowIndex);
 
+  /** Called when page down button is tapped. */
+  public void onPageUp();
+
+  /** Called when page down button is tapped. */
+  public void onPageDown();
+
   /**
    * Called when a candidate on symbol input view is selected.
    */
@@ -102,7 +111,7 @@
    *        for logging usage stats.
    */
   // TODO(matsuzakit): Rename. onFlushTouchEventStats ?
-  public void onShowMenuDialog(List<? extends TouchEvent> touchEventList);
+  public void onShowMenuDialog(List<TouchEvent> touchEventList);
 
   /**
    * Called when the symbol input view is shown.
@@ -110,7 +119,7 @@
    * @param touchEventList {@code TouchEvent} instances which is related to this event
    *        for logging usage stats.
    */
-  public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList);
+  public void onShowSymbolInputView(List<TouchEvent> touchEventList);
 
   /**
    * Called when the symbol input view is closed.
@@ -127,4 +136,15 @@
    * Called when the key for editor action is pressed.
    */
   public void onActionKey();
+
+  /** Called when the narrow mode of the view is changed. */
+  public void onNarrowModeChanged(boolean newNarrowMode);
+
+  /**
+   * Called when the keyboard layout preference should be updated.
+   * <p>
+   * The visible keyboard will also be updated as the result through a callback object.
+   */
+  public void onUpdateKeyboardLayoutAdjustment(
+      ViewManagerInterface.LayoutAdjustment layoutAdjustment);
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java b/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
index ea0f2b8..a3927cc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
@@ -30,18 +30,24 @@
 package org.mozc.android.inputmethod.japanese;
 
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardFactory;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
+import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
@@ -52,11 +58,12 @@
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog;
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
 import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -65,6 +72,7 @@
 import android.os.Build;
 import android.os.IBinder;
 import android.os.Looper;
+import android.view.InputDevice;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -72,6 +80,7 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.inputmethod.CursorAnchorInfo;
 import android.view.inputmethod.EditorInfo;
 
 import java.util.Collections;
@@ -89,6 +98,7 @@
    * An small wrapper to inject keyboard view resizing when a user selects a candidate.
    */
   class ViewManagerEventListener extends ViewEventDelegator {
+
     ViewManagerEventListener(ViewEventListener delegated) {
       super(delegated);
     }
@@ -105,37 +115,32 @@
 
   /**
    * Converts S/W Keyboard's keycode to KeyEvent instance.
-   * Exposed as protected for testing purpose.
    */
-  protected void onKey(int primaryCode, List<? extends TouchEvent> touchEventList) {
-    if (primaryCode == keycodeCapslock ||
-        primaryCode == keycodeAlt) {
+  void onKey(int primaryCode, List<TouchEvent> touchEventList) {
+    if (primaryCode == keycodeCapslock || primaryCode == keycodeAlt) {
       // Ignore those key events because they are handled by KeyboardView,
       // but send touchEventList for logging usage stats.
-      if (eventListener != null) {
-        eventListener.onKeyEvent(null, null, null, touchEventList);
-      }
+      eventListener.onKeyEvent(null, null, null, touchEventList);
       return;
     }
 
     // Keyboard switch event.
-    if (primaryCode == keycodeChartypeToKana ||
-        primaryCode == keycodeChartypeTo123 ||
-        primaryCode == keycodeChartypeToAbc ||
-        primaryCode == keycodeChartypeToKana123 ||
-        primaryCode == keycodeChartypeToAbc123) {
+    if (primaryCode == keycodeChartypeToKana
+        || primaryCode == keycodeChartypeToAbc
+        || primaryCode == keycodeChartypeToAbc123) {
       if (primaryCode == keycodeChartypeToKana) {
         japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.KANA);
       } else if (primaryCode == keycodeChartypeToAbc) {
         japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.ALPHABET);
-      } else if (primaryCode == keycodeChartypeTo123 ||
-                 primaryCode == keycodeChartypeToKana123) {
-        japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.KANA_NUMBER);
       } else if (primaryCode == keycodeChartypeToAbc123) {
         japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.ALPHABET_NUMBER);
       }
-      setJapaneseKeyboard(
-          japaneseSoftwareKeyboardModel.getKeyboardSpecification(), touchEventList);
+      propagateSoftwareKeyboardChange(touchEventList);
+      return;
+    }
+
+    if (primaryCode == keycodeGlobe) {
+      imeSwitcher.switchToNextInputMethod(false);
       return;
     }
 
@@ -144,9 +149,7 @@
       if (mozcView != null) {
         mozcView.resetKeyboardViewState();
       }
-      if (eventListener != null) {
-        eventListener.onShowMenuDialog(touchEventList);
-      }
+      eventListener.onShowMenuDialog(touchEventList);
       if (primaryCode == keycodeMenuDialog) {
         showMenuDialog();
       } else if (primaryCode == keycodeImePickerDialog) {
@@ -156,34 +159,30 @@
     }
 
     if (primaryCode == keycodeSymbol) {
-      if (eventListener != null) {
-        eventListener.onSubmitPreedit();
-      }
       if (mozcView != null) {
-        mozcView.resetKeyboardViewState();
-        mozcView.showSymbolInputView();
-        if (eventListener != null) {
-          eventListener.onShowSymbolInputView(touchEventList);
-        }
+        mozcView.showSymbolInputView(Optional.<SymbolMajorCategory>absent());
+      }
+      return;
+    }
+
+    if (primaryCode == keycodeSymbolEmoji) {
+      if (mozcView != null) {
+        mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI));
       }
       return;
     }
 
     if (primaryCode == keycodeUndo) {
-      if (eventListener != null) {
-        eventListener.onUndo(touchEventList);
-      }
+      eventListener.onUndo(touchEventList);
       return;
     }
 
-    ProtoCommands.KeyEvent mozcKeyEvent =
+    Optional<ProtoCommands.KeyEvent> mozcKeyEvent =
         primaryKeyCodeConverter.createMozcKeyEvent(primaryCode, touchEventList);
-    if (eventListener != null) {
-      eventListener.onKeyEvent(mozcKeyEvent,
-                               primaryKeyCodeConverter.getPrimaryCodeKeyEvent(primaryCode),
-                               japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-                               touchEventList);
-    }
+    eventListener.onKeyEvent(mozcKeyEvent.orNull(),
+                             primaryKeyCodeConverter.getPrimaryCodeKeyEvent(primaryCode),
+                             getActiveSoftwareKeyboardModel().getKeyboardSpecification(),
+                             touchEventList);
   }
 
   /**
@@ -196,13 +195,13 @@
     }
 
     @Override
-    public void onKey(int primaryCode, List<? extends TouchEvent> touchEventList) {
+    public void onKey(int primaryCode, List<TouchEvent> touchEventList) {
       ViewManager.this.onKey(primaryCode, touchEventList);
     }
 
     @Override
     public void onPress(int primaryCode) {
-      if (eventListener != null && primaryCode != KeyEntity.INVALID_KEY_CODE) {
+      if (primaryCode != KeyEntity.INVALID_KEY_CODE) {
         eventListener.onFireFeedbackEvent(FeedbackEvent.KEY_DOWN);
       }
     }
@@ -212,6 +211,92 @@
     }
   }
 
+  @VisibleForTesting class ViewLayerEventHandler {
+    private static final int NEXUS_KEYBOARD_VENDOR_ID = 0x0D62;
+    private static final int NEXUS_KEYBOARD_PRODUCT_ID = 0x160B;
+    private boolean isEmojiKeyDownAvailable = false;
+    private boolean isEmojiInvoking = false;
+    private int pressedKeyNum = 0;
+    @VisibleForTesting boolean disableDeviceCheck = false;
+
+    @SuppressLint("NewApi")
+    private boolean hasPhysicalEmojiKey(KeyEvent event) {
+      InputDevice device = InputDevice.getDevice(event.getDeviceId());
+      return disableDeviceCheck
+          || (Build.VERSION.SDK_INT >= 19
+              && device != null
+              && device.getVendorId() == NEXUS_KEYBOARD_VENDOR_ID
+              && device.getProductId() == NEXUS_KEYBOARD_PRODUCT_ID);
+    }
+
+    private boolean isEmojiKey(KeyEvent event) {
+      if (!hasPhysicalEmojiKey(event)) {
+        return false;
+      }
+      if (event.getKeyCode() != KeyEvent.KEYCODE_ALT_LEFT
+          && event.getKeyCode() != KeyEvent.KEYCODE_ALT_RIGHT) {
+        return false;
+      }
+      if (event.getAction() == KeyEvent.ACTION_UP) {
+        return event.hasNoModifiers();
+      } else {
+        return event.hasModifiers(KeyEvent.META_ALT_ON);
+      }
+    }
+
+    public boolean evaluateKeyEvent(KeyEvent event) {
+      Preconditions.checkNotNull(event);
+      if (event.getAction() == KeyEvent.ACTION_DOWN) {
+        ++pressedKeyNum;
+      } else if (event.getAction() == KeyEvent.ACTION_UP) {
+        pressedKeyNum = Math.max(0, pressedKeyNum - 1);
+      } else {
+        return false;
+      }
+
+      if (isEmojiKey(event)) {
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+          isEmojiKeyDownAvailable = true;
+          isEmojiInvoking = false;
+        } else if (isEmojiKeyDownAvailable && pressedKeyNum == 0) {
+          isEmojiKeyDownAvailable = false;
+          isEmojiInvoking = true;
+        }
+      } else {
+        isEmojiKeyDownAvailable = false;
+        isEmojiInvoking = false;
+      }
+      return isEmojiInvoking;
+    }
+
+    public void invoke() {
+      if (!isEmojiInvoking) {
+        return;
+      }
+      isEmojiInvoking = false;
+      if (mozcView != null) {
+        if (isSymbolInputViewVisible) {
+          mozcView.hideSymbolInputView();
+          if (!isNarrowMode()) {
+            setNarrowMode(true);
+          }
+        } else {
+          isSymbolInputViewShownByEmojiKey = true;
+          if (isNarrowMode()) {
+            setNarrowMode(false);
+          }
+          mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI));
+        }
+      }
+    }
+
+    public void reset() {
+      isEmojiKeyDownAvailable = false;
+      isEmojiInvoking = false;
+      pressedKeyNum = 0;
+    }
+  }
+
   // Registered by the user (typically MozcService)
   @VisibleForTesting final ViewEventListener eventListener;
 
@@ -225,38 +310,83 @@
   // IME switcher instance to detect that voice input is available or not.
   private final ImeSwitcher imeSwitcher;
 
-  // Called back by keyboards.
+  /** Key event handler to handle events on Mozc server. */
   private final KeyEventHandler keyEventHandler;
 
-  // Model to represent the current software keyboard state.
-  @VisibleForTesting final JapaneseSoftwareKeyboardModel japaneseSoftwareKeyboardModel =
+  /** Key event handler to handle events on view layer. */
+  @VisibleForTesting final ViewLayerEventHandler viewLayerKeyEventHandler =
+      new ViewLayerEventHandler();
+
+  /**
+   * Model to represent the current software keyboard state.
+   * All the setter methods don't affect symbolNumberSoftwareKeyboardModel but
+   * japaneseSoftwareKeyboardModel.
+   */
+  private final JapaneseSoftwareKeyboardModel japaneseSoftwareKeyboardModel =
+      new JapaneseSoftwareKeyboardModel();
+  /**
+   * Model to represent the number software keyboard state.
+   * Its keyboard mode is set in the constructor to KeyboardMode.SYMBOL_NUMBER and will never be
+   * changed.
+   */
+  private final JapaneseSoftwareKeyboardModel symbolNumberSoftwareKeyboardModel =
       new JapaneseSoftwareKeyboardModel();
 
-  // The factory of parsed keyboard data.
-  private final JapaneseKeyboardFactory japaneseKeyboardFactory = new JapaneseKeyboardFactory();
+  @VisibleForTesting final HardwareKeyboard hardwareKeyboard;
+
+  /** True if symbol input view is visible. */
+  private boolean isSymbolInputViewVisible;
+
+  /** True if symbol input view is shown by the Emoji key on physical keyboard. */
+  private boolean isSymbolInputViewShownByEmojiKey;
+
+  /** The factory of parsed keyboard data. */
+  private final KeyboardFactory keyboardFactory = new KeyboardFactory();
 
   private final SymbolCandidateStorage symbolCandidateStorage;
 
-  // Current fullscreen mode
+  /** Current fullscreen mode */
   private boolean fullscreenMode = false;
 
-  // Current narrow mode
+  /** Current narrow mode */
   private boolean narrowMode = false;
 
-  // Current popup enabled state.
+  /** Current popup enabled state. */
   private boolean popupEnabled = true;
 
-  // Current voice input allowed state.
-  private boolean voiceInputAllowed = false;
+  /** Current Globe button enabled state. */
+  private boolean globeButtonEnabled = false;
+
+  /** True if CursorAnchorInfo is enabled. */
+  private boolean cursorAnchroInfoEnabled = false;
+
+  /** True if hardware keyboard exists. */
+  private boolean hardwareKeyboardExist = false;
+
+  /**
+   * True if voice input is eligible.
+   * <p>
+   * This conditions is calculated based on following conditions.
+   * <ul>
+   * <li>VoiceIME's status: If VoiceIME is not available, this flag becomes false.
+   * <li>EditorInfo: If current editor does not want to use voice input, this flag becomes false.
+   *   <ul>
+   *   <li>Voice input might be explicitly forbidden by the editor.
+   *   <li>Voice input should be useless for the number input editors.
+   *   <li>Voice input should be useless for password field.
+   *   <ul>
+   * </ul>
+   */
+  private boolean isVoiceInputEligible = false;
+
+  private boolean isVoiceInputEnabledByPreference = true;
 
   private int flickSensitivity = 0;
 
-  private CompositionMode hardwareCompositionMode = CompositionMode.HIRAGANA;
-
   @VisibleForTesting EmojiProviderType emojiProviderType = EmojiProviderType.NONE;
 
   /** Current skin type. */
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+  private Skin skin = Skin.getFallbackInstance();
 
   private LayoutAdjustment layoutAdjustment = LayoutAdjustment.FILL;
 
@@ -269,47 +399,51 @@
   // but such name like "KEYCODE_LEFT" makes Lint unhappy
   // because they are not "static final".
   private final int keycodeChartypeToKana;
-  private final int keycodeChartypeTo123;
   private final int keycodeChartypeToAbc;
-  private final int keycodeChartypeToKana123;
   private final int keycodeChartypeToAbc123;
+  private final int keycodeGlobe;
   private final int keycodeSymbol;
+  private final int keycodeSymbolEmoji;
   private final int keycodeUndo;
   private final int keycodeCapslock;
   private final int keycodeAlt;
   private final int keycodeMenuDialog;
   private final int keycodeImePickerDialog;
 
-  // Handles software keyboard event and sends it to the service.
+  /** Handles software keyboard event and sends it to the service. */
   private final KeyboardActionAdapter keyboardActionListener;
 
   private final PrimaryKeyCodeConverter primaryKeyCodeConverter;
 
-  public ViewManager(Context context, final ViewEventListener listener,
+  public ViewManager(Context context, ViewEventListener listener,
                      SymbolHistoryStorage symbolHistoryStorage, ImeSwitcher imeSwitcher,
                      MenuDialogListener menuDialogListener) {
     this(context, listener, symbolHistoryStorage, imeSwitcher, menuDialogListener,
-         new ProbableKeyEventGuesser(context.getAssets()));
+         new ProbableKeyEventGuesser(context.getAssets()), new HardwareKeyboard());
   }
 
   @VisibleForTesting
   ViewManager(Context context, ViewEventListener listener,
               SymbolHistoryStorage symbolHistoryStorage, ImeSwitcher imeSwitcher,
-              @Nullable MenuDialogListener menuDialogListener, ProbableKeyEventGuesser guesser) {
+              @Nullable MenuDialogListener menuDialogListener, ProbableKeyEventGuesser guesser,
+              HardwareKeyboard hardwareKeyboard) {
     Preconditions.checkNotNull(context);
     Preconditions.checkNotNull(listener);
     Preconditions.checkNotNull(imeSwitcher);
+    Preconditions.checkNotNull(hardwareKeyboard);
 
     primaryKeyCodeConverter = new PrimaryKeyCodeConverter(context, guesser);
 
+    symbolNumberSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.SYMBOL_NUMBER);
+
     // Prefetch keycodes from resource
     Resources res = context.getResources();
     keycodeChartypeToKana = res.getInteger(R.integer.key_chartype_to_kana);
-    keycodeChartypeTo123 = res.getInteger(R.integer.key_chartype_to_123);
     keycodeChartypeToAbc = res.getInteger(R.integer.key_chartype_to_abc);
-    keycodeChartypeToKana123 = res.getInteger(R.integer.key_chartype_to_kana_123);
     keycodeChartypeToAbc123 = res.getInteger(R.integer.key_chartype_to_abc_123);
+    keycodeGlobe = res.getInteger(R.integer.key_globe);
     keycodeSymbol = res.getInteger(R.integer.key_symbol);
+    keycodeSymbolEmoji = res.getInteger(R.integer.key_symbol_emoji);
     keycodeUndo = res.getInteger(R.integer.key_undo);
     keycodeCapslock = res.getInteger(R.integer.key_capslock);
     keycodeAlt = res.getInteger(R.integer.key_alt);
@@ -330,6 +464,7 @@
     this.imeSwitcher = imeSwitcher;
     this.menuDialogListener = menuDialogListener;
     this.symbolCandidateStorage = new SymbolCandidateStorage(symbolHistoryStorage);
+    this.hardwareKeyboard = hardwareKeyboard;
   }
 
   /**
@@ -356,35 +491,46 @@
     // until all the updates done in this method are finished. Just in case.
     mozcView.setVisibility(View.GONE);
     mozcView.setKeyboardHeightRatio(keyboardHeightRatio);
+    mozcView.setCursorAnchorInfoEnabled(cursorAnchroInfoEnabled);
+    OnClickListener widenButtonClickListener = new OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        eventListener.onFireFeedbackEvent(FeedbackEvent.NARROW_FRAME_WIDEN_BUTTON_DOWN);
+        setNarrowMode(!narrowMode);
+      }
+    };
+    OnClickListener leftAdjustButtonClickListener = new OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        eventListener.onUpdateKeyboardLayoutAdjustment(LayoutAdjustment.LEFT);
+      }
+    };
+    OnClickListener rightAdjustButtonClickListener = new OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        eventListener.onUpdateKeyboardLayoutAdjustment(LayoutAdjustment.RIGHT);
+      }
+    };
+
+    OnClickListener microphoneButtonClickListener = new OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        eventListener.onFireFeedbackEvent(FeedbackEvent.MICROPHONE_BUTTON_DOWN);
+        imeSwitcher.switchToVoiceIme("ja-jp");
+      }
+    };
     mozcView.setEventListener(
         eventListener,
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            setNarrowMode(!narrowMode);
-          }
-        },
+        widenButtonClickListener,
         // User pushes these buttons to move position in order to see hidden text in editing rather
         // than to change his/her favorite position. So we should not apply it to preferences.
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            setLayoutAdjustment(v.getContext().getResources(), LayoutAdjustment.LEFT);
-            mozcView.startLayoutAdjustmentAnimation();
-          }
-        },
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            setLayoutAdjustment(v.getContext().getResources(), LayoutAdjustment.RIGHT);
-            mozcView.startLayoutAdjustmentAnimation();
-          }
-        });
+        leftAdjustButtonClickListener,
+        rightAdjustButtonClickListener,
+        microphoneButtonClickListener);
 
     mozcView.setKeyEventHandler(keyEventHandler);
 
-    setJapaneseKeyboard(japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-                        Collections.<TouchEvent>emptyList());
+    propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
     mozcView.setFullscreenMode(fullscreenMode);
     mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
     // At the moment, it is necessary to set the storage to the view, *before* setting emoji
@@ -392,10 +538,9 @@
     // TODO(hidehiko): Remove the restriction.
     mozcView.setSymbolCandidateStorage(symbolCandidateStorage);
     mozcView.setEmojiProviderType(emojiProviderType);
-    mozcView.setHardwareCompositionButtonImage(hardwareCompositionMode);
     mozcView.setPopupEnabled(popupEnabled);
     mozcView.setFlickSensitivity(flickSensitivity);
-    mozcView.setSkinType(skinType);
+    mozcView.setSkin(skin);
 
     // Clear the menu dialog.
     menuDialog = null;
@@ -412,9 +557,7 @@
       return;
     }
 
-    boolean voiceInputEnabled = voiceInputAllowed && imeSwitcher.isVoiceImeAvailable();
-    menuDialog = new MenuDialog(
-        mozcView.getContext(), Optional.fromNullable(menuDialogListener), voiceInputEnabled);
+    menuDialog = new MenuDialog(mozcView.getContext(), Optional.fromNullable(menuDialogListener));
     IBinder windowToken = mozcView.getWindowToken();
     if (windowToken == null) {
       MozcLog.w("Unknown window token");
@@ -454,8 +597,8 @@
     if (mozcView == null) {
       return;
     }
-    if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() == 0 &&
-        !outCommand.getInput().getRequestSuggestion()) {
+    if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() == 0
+        && !outCommand.getInput().getRequestSuggestion()) {
       // The server doesn't return the suggestion result, because there is following
       // key sequence, which will trigger the suggest and the new suggestion will overwrite
       // the current suggest. In order to avoid chattering the candidate window,
@@ -475,26 +618,32 @@
    * @return the current keyboard specification.
    */
   @Override
-  public KeyboardSpecification getJapaneseKeyboardSpecification() {
-    return japaneseSoftwareKeyboardModel.getKeyboardSpecification();
+  public KeyboardSpecification getKeyboardSpecification() {
+    return getActiveSoftwareKeyboardModel().getKeyboardSpecification();
   }
 
-  /**
-   * Set {@code EditorInfo} instance to the current view.
-   */
+  /** Set {@code EditorInfo} instance to the current view. */
   @Override
   public void setEditorInfo(EditorInfo attribute) {
-    mozcView.setEmojiEnabled(
-        EmojiUtil.isUnicodeEmojiAvailable(Build.VERSION.SDK_INT),
-        EmojiUtil.isCarrierEmojiAllowed(attribute));
-    mozcView.setPasswordField(MozcUtil.isPasswordField(attribute));
-    mozcView.setEditorInfo(attribute);
-    voiceInputAllowed = MozcUtil.isVoiceInputAllowed(attribute);
+    if (mozcView != null) {
+      mozcView.setEmojiEnabled(
+          EmojiUtil.isUnicodeEmojiAvailable(Build.VERSION.SDK_INT),
+          EmojiUtil.isCarrierEmojiAllowed(attribute));
+      mozcView.setPasswordField(MozcUtil.isPasswordField(attribute.inputType));
+      mozcView.setEditorInfo(attribute);
+    }
+    isVoiceInputEligible = MozcUtil.isVoiceInputPreferred(attribute);
 
     japaneseSoftwareKeyboardModel.setInputType(attribute.inputType);
-    setJapaneseKeyboard(
-        japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-        Collections.<TouchEvent>emptyList());
+    // TODO(hsumita): Set input type on Hardware keyboard, too. Otherwise, Hiragana input can be
+    //                enabled unexpectedly. (e.g. Number text field.)
+    propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
+  }
+
+  private boolean shouldVoiceImeBeEnabled() {
+    // Disable voice IME if hardware keyboard exists to avoid a framework bug.
+    return isVoiceInputEligible && isVoiceInputEnabledByPreference && !hardwareKeyboardExist
+        && imeSwitcher.isVoiceImeAvailable();
   }
 
   @Override
@@ -509,6 +658,12 @@
     }
     MozcView mozcView = this.mozcView;
 
+    if (isSymbolInputViewShownByEmojiKey) {
+      setNarrowMode(true);
+      mozcView.hideSymbolInputView();
+      return true;
+    }
+
     // Try to hide a sub view from front to back.
     if (mozcView.hideSymbolInputView()) {
       return true;
@@ -519,22 +674,66 @@
 
   /**
    * Creates and sets a keyboard represented by the resource id to the input frame.
-   *
+   * <p>
    * Note that this method requires inputFrameView is not null, and its first child is
    * the JapaneseKeyboardView.
-   * @param specification Keyboard specification for the next
    */
-  private void setJapaneseKeyboard(
-      KeyboardSpecification specification, List<? extends TouchEvent> touchEventList) {
-    eventListener.onKeyEvent(null, null, specification, touchEventList);
-    if (mozcView != null) {
-      Rect size = mozcView.getKeyboardSize();
-      JapaneseKeyboard japaneseKeyboard =
-          japaneseKeyboardFactory.get(mozcView.getResources(), specification,
-                                      size.width(), size.height());
-      mozcView.setJapaneseKeyboard(japaneseKeyboard);
-      primaryKeyCodeConverter.setJapaneseKeyboard(japaneseKeyboard);
+  private void updateKeyboardView() {
+    if (mozcView == null) {
+      return;
     }
+    Rect size = mozcView.getKeyboardSize();
+    Keyboard keyboard = keyboardFactory.get(
+        mozcView.getResources(), japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
+        size.width(), size.height());
+    mozcView.setKeyboard(keyboard);
+    primaryKeyCodeConverter.setKeyboard(keyboard);
+  }
+
+  /**
+   * Propagates the change of S/W keyboard to the view layer and the H/W keyboard configuration.
+   */
+  private void propagateSoftwareKeyboardChange(List<TouchEvent> touchEventList) {
+    KeyboardSpecification specification = japaneseSoftwareKeyboardModel.getKeyboardSpecification();
+
+    // TODO(team): The purpose of the following call of onKeyEvent() is to tell the change of
+    // software keyboard specification to Mozc server through the event listener registered by
+    // MozcService. Obviously, calling onKeyEvent() for this purpose is abuse and should be fixed.
+    eventListener.onKeyEvent(null, null, specification, touchEventList);
+
+    // Update H/W keyboard specification to keep a consistency with S/W keyboard.
+    hardwareKeyboard.setCompositionMode(
+        specification.getCompositionMode() == CompositionMode.HIRAGANA
+        ? CompositionSwitchMode.KANA : CompositionSwitchMode.ALPHABET);
+
+    updateKeyboardView();
+  }
+
+  private void propagateHardwareKeyboardChange() {
+    propagateHardwareKeyboardChangeAndSendKey(null);
+  }
+
+  /**
+   * Propagates the change of S/W keyboard to the view layer and the H/W keyboard configuration, and
+   * the send key event to Mozc server.
+   */
+  private void propagateHardwareKeyboardChangeAndSendKey(@Nullable KeyEvent event) {
+    KeyboardSpecification specification = hardwareKeyboard.getKeyboardSpecification();
+
+    if (event == null) {
+      eventListener.onKeyEvent(null, null, specification, Collections.<TouchEvent>emptyList());
+    } else {
+      eventListener.onKeyEvent(
+          hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
+          specification, Collections.<TouchEvent>emptyList());
+    }
+
+    // Update S/W keyboard specification to keep a consistency with H/W keyboard.
+    japaneseSoftwareKeyboardModel.setKeyboardMode(
+        specification.getCompositionMode() == CompositionMode.HIRAGANA
+        ? KeyboardMode.KANA : KeyboardMode.ALPHABET);
+
+    updateKeyboardView();
   }
 
   /**
@@ -548,13 +747,11 @@
 
     if (japaneseSoftwareKeyboardModel.getKeyboardLayout() != keyboardLayout) {
       // If changed, clear the keyboard cache.
-      japaneseKeyboardFactory.clear();
+      keyboardFactory.clear();
     }
 
     japaneseSoftwareKeyboardModel.setKeyboardLayout(keyboardLayout);
-    setJapaneseKeyboard(
-        japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-        Collections.<TouchEvent>emptyList());
+    propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
   }
 
   /**
@@ -569,26 +766,22 @@
 
     if (japaneseSoftwareKeyboardModel.getInputStyle() != inputStyle) {
       // If changed, clear the keyboard cache.
-      japaneseKeyboardFactory.clear();
+      keyboardFactory.clear();
     }
 
     japaneseSoftwareKeyboardModel.setInputStyle(inputStyle);
-    setJapaneseKeyboard(
-        japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-        Collections.<TouchEvent>emptyList());
+    propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
   }
 
   @Override
   public void setQwertyLayoutForAlphabet(boolean qwertyLayoutForAlphabet) {
     if (japaneseSoftwareKeyboardModel.isQwertyLayoutForAlphabet() != qwertyLayoutForAlphabet) {
       // If changed, clear the keyboard cache.
-      japaneseKeyboardFactory.clear();
+      keyboardFactory.clear();
     }
 
     japaneseSoftwareKeyboardModel.setQwertyLayoutForAlphabet(qwertyLayoutForAlphabet);
-    setJapaneseKeyboard(
-        japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
-        Collections.<TouchEvent>emptyList());
+    propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
   }
 
   @Override
@@ -623,13 +816,41 @@
   }
 
   /**
-   * @param isNarrowMode Whether mozc view shows in narrow mode or normal.
+   * Updates whether Globe button should be enabled or not based on
+   * {@code InputMethodManager#shouldOfferSwitchingToNextInputMethod(IBinder)}
    */
   @Override
-  public void setNarrowMode(boolean isNarrowMode) {
-    this.narrowMode = isNarrowMode;
+  public void updateGlobeButtonEnabled() {
+    this.globeButtonEnabled = imeSwitcher.shouldOfferSwitchingToNextInputMethod();
     if (mozcView != null) {
-      mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, isNarrowMode);
+      mozcView.setGlobeButtonEnabled(globeButtonEnabled);
+    }
+  }
+
+  /**
+   * Updates whether Microphone button should be enabled or not based on
+   * availability of voice input method.
+   */
+  @Override
+  public void updateMicrophoneButtonEnabled() {
+    if (mozcView != null) {
+      mozcView.setMicrophoneButtonEnabled(shouldVoiceImeBeEnabled());
+    }
+  }
+
+  /**
+   * @param newNarrowMode Whether mozc view shows in narrow mode or normal.
+   */
+  @Override
+  public void setNarrowMode(boolean newNarrowMode) {
+    boolean previousNarrowMode = this.narrowMode;
+    this.narrowMode = newNarrowMode;
+    if (mozcView != null) {
+      mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, newNarrowMode);
+    }
+    updateMicrophoneButtonEnabled();
+    if (previousNarrowMode != newNarrowMode) {
+      eventListener.onNarrowModeChanged(newNarrowMode);
     }
   }
 
@@ -646,20 +867,19 @@
   @Override
   public void maybeTransitToNarrowMode(Command command, KeyEventInterface keyEventInterface) {
     Preconditions.checkNotNull(command);
-    // Surely we don't anthing when on narrow mode already.
+    // Surely we don't anything when on narrow mode already.
     if (isNarrowMode()) {
       return;
     }
     // Do nothing for the input from software keyboard.
-    if (keyEventInterface == null || keyEventInterface.getNativeEvent() == null) {
+    if (keyEventInterface == null || !keyEventInterface.getNativeEvent().isPresent()) {
       return;
     }
-    // Do nothing if the key event doesn't have printable character without modifier.
-    if (!command.getInput().hasKey()
-        || !command.getInput().getKey().hasKeyCode()
-        || command.getInput().getKey().hasModifiers()) {
+    // Do nothing if input doesn't have a key. (e.g. pure modifier key)
+    if (!command.getInput().hasKey()) {
       return;
     }
+
     // Passed all the check. Transit to narrow mode.
     hideSubInputView();
     setNarrowMode(true);
@@ -671,6 +891,11 @@
   }
 
   @Override
+  public boolean isFloatingCandidateMode() {
+    return mozcView != null && mozcView.isFloatingCandidateMode();
+  }
+
+  @Override
   public void setPopupEnabled(boolean popupEnabled) {
     this.popupEnabled = popupEnabled;
     if (mozcView != null) {
@@ -679,28 +904,53 @@
   }
 
   @Override
-  public void setHardwareKeyboardCompositionMode(CompositionMode compositionMode) {
-    hardwareCompositionMode = compositionMode;
-    if (mozcView != null) {
-      mozcView.setHardwareCompositionButtonImage(compositionMode);
+  public void switchHardwareKeyboardCompositionMode(CompositionSwitchMode mode) {
+    Preconditions.checkNotNull(mode);
+
+    CompositionMode oldMode = hardwareKeyboard.getCompositionMode();
+    hardwareKeyboard.setCompositionMode(mode);
+    CompositionMode newMode = hardwareKeyboard.getCompositionMode();
+    if (oldMode != newMode) {
+      propagateHardwareKeyboardChange();
     }
   }
 
   @Override
-  public void setSkinType(SkinType skinType) {
-    this.skinType = skinType;
+  public void setHardwareKeyMap(HardwareKeyMap hardwareKeyMap) {
+    hardwareKeyboard.setHardwareKeyMap(Preconditions.checkNotNull(hardwareKeyMap));
+  }
+
+  @Override
+  public void setSkin(Skin skin) {
+    this.skin = Preconditions.checkNotNull(skin);
     if (mozcView != null) {
-      mozcView.setSkinType(skinType);
+      mozcView.setSkin(skin);
     }
   }
 
   @Override
-  public void setLayoutAdjustment(Resources resources, LayoutAdjustment layoutAdjustment) {
-    this.layoutAdjustment = layoutAdjustment;
+  public void setMicrophoneButtonEnabledByPreference(boolean microphoneButtonEnabled) {
+    this.isVoiceInputEnabledByPreference = microphoneButtonEnabled;
+    updateMicrophoneButtonEnabled();
+  }
 
+  /**
+   * Set layout adjustment and show animation if required.
+   * <p>
+   * Note that this method does *NOT* update SharedPreference.
+   * If you want to update it, use ViewEventListener#onUpdateKeyboardLayoutAdjustment(),
+   * which updates SharedPreference and indirectly calls this method.
+   */
+  @Override
+  public void setLayoutAdjustment(LayoutAdjustment layoutAdjustment) {
+    Preconditions.checkNotNull(layoutAdjustment);
     if (mozcView != null) {
       mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
+      if (this.layoutAdjustment != layoutAdjustment) {
+        mozcView.startLayoutAdjustmentAnimation();
+      }
     }
+    this.layoutAdjustment = layoutAdjustment;
   }
 
   @Override
@@ -724,6 +974,8 @@
       mozcView.reset();
     }
 
+    viewLayerKeyEventHandler.reset();
+
     // Reset menu dialog.
     maybeDismissMenuDialog();
   }
@@ -771,16 +1023,33 @@
   @Override
   public void onConfigurationChanged(Configuration newConfig) {
     primaryKeyCodeConverter.setConfiguration(newConfig);
+    hardwareKeyboardExist = newConfig.keyboard != Configuration.KEYBOARD_NOKEYS;
   }
 
   @Override
   public boolean isKeyConsumedOnViewAsynchronously(KeyEvent event) {
-    return false;
+    return viewLayerKeyEventHandler.evaluateKeyEvent(Preconditions.checkNotNull(event));
   }
 
   @Override
   public void consumeKeyOnViewSynchronously(KeyEvent event) {
-    throw new IllegalArgumentException("ViewManager doesn't consume any key event.");
+    viewLayerKeyEventHandler.invoke();
+  }
+
+  @Override
+  public void onHardwareKeyEvent(KeyEvent event) {
+    // Maybe update the composition mode based on the event.
+    // For example, zen/han key toggles the composition mode (hiragana <--> alphabet).
+    CompositionMode compositionMode = hardwareKeyboard.getCompositionMode();
+    hardwareKeyboard.setCompositionModeByKey(event);
+    CompositionMode currentCompositionMode = hardwareKeyboard.getCompositionMode();
+    if (compositionMode != currentCompositionMode) {
+      propagateHardwareKeyboardChangeAndSendKey(event);
+    } else {
+      eventListener.onKeyEvent(
+          hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
+          hardwareKeyboard.getKeyboardSpecification(), Collections.<TouchEvent>emptyList());
+    }
   }
 
   @Override
@@ -799,10 +1068,18 @@
     return eventListener;
   }
 
+  /**
+   * Returns active (shown) JapaneseSoftwareKeyboardModel.
+   * If symbol picker is shown, symbol-number keyboard's is returned.
+   */
   @VisibleForTesting
   @Override
-  public JapaneseSoftwareKeyboardModel getJapaneseSoftwareKeyboardModel() {
-    return japaneseSoftwareKeyboardModel;
+  public JapaneseSoftwareKeyboardModel getActiveSoftwareKeyboardModel() {
+    if (isSymbolInputViewVisible) {
+      return symbolNumberSoftwareKeyboardModel;
+    } else {
+      return japaneseSoftwareKeyboardModel;
+    }
   }
 
   @VisibleForTesting
@@ -825,8 +1102,14 @@
 
   @VisibleForTesting
   @Override
-  public SkinType getSkinType() {
-    return skinType;
+  public Skin getSkin() {
+    return skin;
+  }
+
+  @VisibleForTesting
+  @Override
+  public boolean isMicrophoneButtonEnabledByPreference() {
+    return isVoiceInputEnabledByPreference;
   }
 
   @VisibleForTesting
@@ -841,6 +1124,12 @@
     return keyboardHeightRatio;
   }
 
+  @VisibleForTesting
+  @Override
+  public HardwareKeyMap getHardwareKeyMap() {
+    return hardwareKeyboard.getHardwareKeyMap();
+  }
+
   @Override
   public void trimMemory() {
     if (mozcView != null) {
@@ -852,4 +1141,31 @@
   public KeyboardActionListener getKeyboardActionListener() {
     return keyboardActionListener;
   }
+
+  @Override
+  public void setCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+    if (mozcView != null) {
+      mozcView.setCursorAnchorInfo(cursorAnchorInfo);
+    }
+  }
+
+  @Override
+  public void setCursorAnchorInfoEnabled(boolean enabled) {
+    this.cursorAnchroInfoEnabled = enabled;
+    if (mozcView != null) {
+      mozcView.setCursorAnchorInfoEnabled(enabled);
+    }
+  }
+
+  @Override
+  public void onShowSymbolInputView() {
+    isSymbolInputViewVisible = true;
+    mozcView.resetKeyboardViewState();
+  }
+
+  @Override
+  public void onCloseSymbolInputView() {
+    isSymbolInputViewVisible = false;
+    isSymbolInputViewShownByEmojiKey = false;
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java b/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
index bac7918..efc12b4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
@@ -29,26 +29,27 @@
 
 package org.mozc.android.inputmethod.japanese;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
+import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 
 import android.content.Context;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.inputmethodservice.InputMethodService;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.Window;
+import android.view.inputmethod.CursorAnchorInfo;
 import android.view.inputmethod.EditorInfo;
 
 /**
@@ -98,6 +99,8 @@
    */
   public void consumeKeyOnViewSynchronously(KeyEvent event);
 
+  public void onHardwareKeyEvent(KeyEvent keyEvent);
+
   /**
    * @return whether the view should consume the generic motion event or not.
    */
@@ -113,7 +116,7 @@
   /**
    * @return the current keyboard specification.
    */
-  public KeyboardSpecification getJapaneseKeyboardSpecification();
+  public KeyboardSpecification getKeyboardSpecification();
 
   /**
    * Set {@code EditorInfo} instance to the current view.
@@ -163,18 +166,28 @@
 
   public boolean isNarrowMode();
 
+  public boolean isFloatingCandidateMode();
+
   public void setPopupEnabled(boolean popupEnabled);
 
-  public void setHardwareKeyboardCompositionMode(CompositionMode compositionMode);
+  public void switchHardwareKeyboardCompositionMode(CompositionSwitchMode mode);
 
-  public void setSkinType(SkinType skinType);
+  public void setHardwareKeyMap(HardwareKeyMap hardwareKeyMap);
 
-  public void setLayoutAdjustment(Resources resources, LayoutAdjustment layoutAdjustment);
+  public void setSkin(Skin skin);
+
+  public void setMicrophoneButtonEnabledByPreference(boolean microphoneButtonEnabled);
+
+  public void setLayoutAdjustment(LayoutAdjustment layoutAdjustment);
 
   public void setKeyboardHeightRatio(int keyboardHeightRatio);
 
   public void onConfigurationChanged(Configuration newConfig);
 
+  public void setCursorAnchorInfo(CursorAnchorInfo info);
+
+  public void setCursorAnchorInfoEnabled(boolean enabled);
+
   /**
    * Reset the status of the current input view.
    */
@@ -183,11 +196,14 @@
   public void computeInsets(
       Context context, InputMethodService.Insets outInsets, Window window);
 
+  public void onShowSymbolInputView();
+  public void onCloseSymbolInputView();
+
   @VisibleForTesting
   public ViewEventListener getEventListener();
 
   @VisibleForTesting
-  public JapaneseSoftwareKeyboardModel getJapaneseSoftwareKeyboardModel();
+  public JapaneseSoftwareKeyboardModel getActiveSoftwareKeyboardModel();
 
   @VisibleForTesting
   public boolean isPopupEnabled();
@@ -199,7 +215,10 @@
   public EmojiProviderType getEmojiProviderType();
 
   @VisibleForTesting
-  public SkinType getSkinType();
+  public Skin getSkin();
+
+  @VisibleForTesting
+  public boolean isMicrophoneButtonEnabledByPreference();
 
   @VisibleForTesting
   public LayoutAdjustment getLayoutAdjustment();
@@ -207,9 +226,16 @@
   @VisibleForTesting
   public int getKeyboardHeightRatio();
 
+  @VisibleForTesting
+  public HardwareKeyMap getHardwareKeyMap();
+
   /**
    * Used for testing to inject key events.
    */
   @VisibleForTesting
   public KeyboardActionListener getKeyboardActionListener();
+
+  void updateGlobeButtonEnabled();
+
+  void updateMicrophoneButtonEnabled();
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
index cad8979..c4463fc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
@@ -38,6 +38,7 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.Bundle;
@@ -113,6 +114,7 @@
     return Optional.fromNullable(virtualViewIdToRow.get().get(virtualViewId));
   }
 
+  @SuppressLint("InlinedApi")
   private Optional<AccessibilityNodeInfoCompat> createNodeInfoForId(int virtualViewId) {
     Optional<Row> optionalRow = getRow(virtualViewId);
     if (!optionalRow.isPresent()) {
@@ -209,6 +211,9 @@
    * @param y vertical location in screen coordinate (pixel)
    */
   Optional<CandidateWord> getCandidateWord(int x, int y) {
+    if (!layout.isPresent()) {
+      return Optional.absent();
+    }
     for (Row row : layout.get().getRowList()) {
       if (y < row.getTop() || y >= row.getTop() + row.getHeight()) {
         continue;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
index 5d174d3..e4949a2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
@@ -32,11 +32,9 @@
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.resources.R;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
@@ -71,8 +69,6 @@
   private final View view;
   private final KeyboardAccessibilityNodeProvider nodeProvider;
   private Optional<Key> lastHoverKey = Optional.absent();
-  // Handler which is called back when key-input should be simulated.
-  private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
   // Handler for long-press callback.
   // Contains 0 or 1 delayed message.
   private final Handler handler;
@@ -84,6 +80,15 @@
   // In such case touch-up shouldn't send any key events.
   // Reset to false when new touch sequence is started.
   private boolean consumedByLongpress = false;
+  private final TouchEventEmulator emulator;
+
+  /**
+   * Emulator interface for touch events (Key input and long press).
+   */
+  public interface TouchEventEmulator {
+    public void emulateKeyInput(Key key);
+    public void emulateLongPress(Key key);
+  }
 
   private class LongTapHandler implements Handler.Callback {
     @Override
@@ -96,20 +101,23 @@
   }
 
 
-  public KeyboardAccessibilityDelegate(View view) {
+  public KeyboardAccessibilityDelegate(View view, TouchEventEmulator emulator) {
     this(view, new KeyboardAccessibilityNodeProvider(view),
          view.getContext().getResources().getInteger(
-             R.integer.config_long_press_key_delay_accessibility));
+             R.integer.config_long_press_key_delay_accessibility),
+         emulator);
   }
 
   @VisibleForTesting
   KeyboardAccessibilityDelegate(View view,
                                 KeyboardAccessibilityNodeProvider nodeProvider,
-                                int longpressDelay) {
+                                int longpressDelay,
+                                TouchEventEmulator emulator) {
     this.view = Preconditions.checkNotNull(view);
     this.nodeProvider = Preconditions.checkNotNull(nodeProvider);
     this.handler = new Handler(new LongTapHandler());
     this.longpressDelay = longpressDelay;
+    this.emulator = Preconditions.checkNotNull(emulator);
   }
 
   private Context getContext() {
@@ -210,13 +218,11 @@
     if (!keyState.isPresent()) {
       return;
     }
-    int keyCode = keyState.get().getFlick(Direction.CENTER).getKeyEntity().getKeyCode();
-    if (keyCode == KeyEntity.INVALID_KEY_CODE
-        || !keyEventHandler.isPresent()
-        || consumedByLongpress) {
+    int keyCode = keyState.get().getFlick(Direction.CENTER).get().getKeyEntity().getKeyCode();
+    if (keyCode == KeyEntity.INVALID_KEY_CODE || consumedByLongpress) {
       return;
     }
-    keyEventHandler.get().sendKey(keyCode, Collections.<TouchEvent>emptyList());
+    emulator.emulateKeyInput(key);
   }
 
   private void simulateLongPress(Key key) {
@@ -225,14 +231,12 @@
     if (!keyState.isPresent()) {
       return;
     }
-    int longPressKeyCode = keyState.get().getFlick(Direction.CENTER)
-                                   .getKeyEntity().getLongPressKeyCode();
-    if (longPressKeyCode == KeyEntity.INVALID_KEY_CODE
-        || !keyEventHandler.isPresent()
-        || consumedByLongpress) {
+    int longPressKeyCode =
+        keyState.get().getFlick(Direction.CENTER).get().getKeyEntity().getLongPressKeyCode();
+    if (longPressKeyCode == KeyEntity.INVALID_KEY_CODE || consumedByLongpress) {
       return;
     }
-    keyEventHandler.get().sendKey(longPressKeyCode, Collections.<TouchEvent>emptyList());
+    emulator.emulateLongPress(key);
     consumedByLongpress = true;
   }
 
@@ -355,8 +359,4 @@
     // Don't speak if the IME is connected to a password field.
     return isPasswordField;
   }
-
-  public void setKeyEventHandler(Optional<KeyEventHandler> keyEventHandler) {
-    this.keyEventHandler = Preconditions.checkNotNull(keyEventHandler);
-  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
index 570e598..ab698dd 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
@@ -223,7 +223,8 @@
     if (key.isSpacer()) {
       return UNDEFINED;
     }
-    return getKeyState(key, metaState).getFlick(Direction.CENTER).getKeyEntity().getSourceId();
+    return getKeyState(key, metaState).getFlick(
+        Direction.CENTER).get().getKeyEntity().getSourceId();
   }
 
   private Optional<Integer> getKeyCode(Key key) {
@@ -232,7 +233,7 @@
       return Optional.absent();
     }
     return Optional.of(getKeyState(key, metaState).getFlick(
-        Direction.CENTER).getKeyEntity().getKeyCode());
+        Direction.CENTER).get().getKeyEntity().getKeyCode());
   }
 
   /**
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
index 4fb8e5a..f0146f2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
@@ -29,9 +29,9 @@
 
 package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
index 11e400c..7b4b23a 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
@@ -29,11 +29,11 @@
 
 package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.KeyEventMapperFactory.KeyEventMapper;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
@@ -98,15 +98,7 @@
   JAPANESE109A(HardwareKeyMap.JAPANESE109A,
                KeyEventMapperFactory.JAPANESE_KEYBOARD_MAPPER,
                KeyboardSpecification.HARDWARE_QWERTY_KANA,
-               KeyboardSpecification.HARDWARE_QWERTY_ALPHABET),
-
-  /**
-   * Represents Japanese Mobile "12" Keyboard
-   */
-  TWELVEKEY(HardwareKeyMap.TWELVEKEY,
-            KeyEventMapperFactory.TWELVEKEY_KEYBOARD_MAPPER,
-            KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-            KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET);
+               KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
 
   /**
    * Returns true if the given {@code codepoint} is printable.
@@ -214,10 +206,8 @@
     HardwareKeyMap detectedKeyMap = null;
     switch(configuration.keyboard) {
       case Configuration.KEYBOARD_12KEY:
-        detectedKeyMap = HardwareKeyMap.TWELVEKEY;
-        break;
       case Configuration.KEYBOARD_QWERTY:
-        detectedKeyMap = HardwareKeyMap.JAPANESE109A;
+        detectedKeyMap = HardwareKeyMap.DEFAULT;
         break;
       case Configuration.KEYBOARD_NOKEYS:
       case Configuration.KEYBOARD_UNDEFINED:
@@ -477,8 +467,8 @@
       }
 
       @Override
-      public android.view.KeyEvent getNativeEvent() {
-        return keyEvent;
+      public Optional<android.view.KeyEvent> getNativeEvent() {
+        return Optional.of(keyEvent);
       }
     };
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
index 57bd6f5..71768d8 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
@@ -53,7 +53,6 @@
   }
 
   public static final KeyEventMapper DEFAULT_KEYBOARD_MAPPER = new DefaultKeyboardMapper();
-  public static final KeyEventMapper TWELVEKEY_KEYBOARD_MAPPER = new TwelvekeyKeyboardMapper();
   public static final KeyEventMapper JAPANESE_KEYBOARD_MAPPER = new JapaneseKeyboardMapper();
 
   /**
@@ -69,25 +68,6 @@
   }
 
   /**
-   * Similar to DefaultKeyboardMapper but additional conversion for POUND and CENTER keys.
-   */
-  private static class TwelvekeyKeyboardMapper implements KeyEventMapper {
-    static void doKeyCharacterMapping(CompactKeyEvent keyEvent) {
-      int originalKeyCode = keyEvent.getKeyCode();
-      if (originalKeyCode == KeyEvent.KEYCODE_POUND
-          || originalKeyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
-        keyEvent.setKeyCode(KeyEvent.KEYCODE_ENTER);
-      }
-    }
-    @Override
-    public void applyMapping(CompactKeyEvent keyEvent) {
-      keyEvent.setKeyCode(doKeyLayoutMappingForOldAndroids(keyEvent.getKeyCode(),
-                                                           keyEvent.getScanCode()));
-      doKeyCharacterMapping(keyEvent);
-    }
-  }
-
-  /**
    * Key-layout and key-character mapping for Japanese keyboard.
    */
   @SuppressLint("InlinedApi")
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
index 9414ce6..9074138 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
@@ -29,19 +29,25 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.view.CandidateBackgroundDrawable;
 import org.mozc.android.inputmethod.japanese.view.CandidateBackgroundFocusedDrawable;
 import org.mozc.android.inputmethod.japanese.view.CenterCircularHighlightDrawable;
-import org.mozc.android.inputmethod.japanese.view.LightIconDrawable;
-import org.mozc.android.inputmethod.japanese.view.PopUpFrameWindowDrawable;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.QwertySpaceKeyDrawable;
 import org.mozc.android.inputmethod.japanese.view.RectKeyDrawable;
 import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import org.mozc.android.inputmethod.japanese.view.ThreeDotsIconDrawable;
 import org.mozc.android.inputmethod.japanese.view.TriangularHighlightDrawable;
 import org.mozc.android.inputmethod.japanese.view.TriangularHighlightDrawable.HighlightDirection;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
+import android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.StateListDrawable;
 
@@ -83,8 +89,14 @@
     QWERTY_REGULAR_KEY_BACKGROUND,
     QWERTY_FUNCTION_KEY_BACKGROUND,
     QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS,
-    QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
-    QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
+    QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS,
+
+    // Separator on keyboard.
+    KEYBOARD_SEPARATOR_TOP,
+    KEYBOARD_SEPARATOR_CENTER,
+    KEYBOARD_SEPARATOR_BOTTOM,
+
+    TRNASPARENT,
 
     // Highlight for flicking.
     TWELVEKEYS_CENTER_FLICK,
@@ -104,366 +116,327 @@
 
   // According to the original design mock, the pressed key background contains some padding.
   // Here are hardcoded parameters.
-  private static final float TWELVEKEYS_LEFT_OFFSET = 0.5f;
-  private static final float TWELVEKEYS_TOP_OFFSET = 0;
-  private static final float TWELVEKEYS_RIGHT_OFFSET = 1.0f;
-  private static final float TWELVEKEYS_BOTTOM_OFFSET = 1.0f;
+  public static final float POPUP_WINDOW_PADDING = 7.0f;
+
   private static final float TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET = 3.0f;
   private static final float TWELVEKEYS_THREEDOTS_RIGHT_OFFSET = 5.0f;
   private static final float TWELVEKEYS_THREEDOTS_WIDTH = 2.0f;
   private static final float TWELVEKEYS_THREEDOTS_SPAN = 2.0f;
 
-  private static final float QWERTY_LEFT_OFFSET = 2.0f;
-  private static final float QWERTY_TOP_OFFSET = 1.0f;
-  private static final float QWERTY_RIGHT_OFFSET = 2.0f;
-  private static final float QWERTY_BOTTOM_OFFSET = 3.0f;
   private static final float QWERTY_THREEDOTS_BOTTOM_OFFSET = 3.0f;
   private static final float QWERTY_THREEDOTS_RIGHT_OFFSET = 5.0f;
   private static final float QWERTY_THREEDOTS_WIDTH = 2.0f;
   private static final float QWERTY_THREEDOTS_SPAN = 2.0f;
-  private static final float QWERTY_LIGHT_TOP_OFFSET = 2.0f;
-  private static final float QWERTY_LIGHT_RIGHT_OFFSET = 2.0f;
-  private static final float QWERTY_LIGHT_RADIUS = 2.25f;
-
-  private static final float POPUP_WINDOW_PADDING = 7.0f;
-  private static final float POPUP_FRAME_BORDER_WIDTH = 5.0f;
-  private static final float POPUP_SHADOW_SIZE = 1.5f;
 
   private static final float CANDIDATE_BACKGROUND_PADDING = 0.0f;
   private static final float SYMBOL_CANDIDATE_BACKGROUND_PADDING = 0.0f;
 
+  private final Resources resources;
   private final float density;
   private final Map<DrawableType, Drawable> drawableMap =
       new EnumMap<DrawableType, Drawable>(DrawableType.class);
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+  private Skin skin = Skin.getFallbackInstance();
 
-  public BackgroundDrawableFactory(float density) {
-    this.density = density;
+  public BackgroundDrawableFactory(Resources resources) {
+    this.resources = Preconditions.checkNotNull(resources);
+    density = resources.getDisplayMetrics().density;
   }
 
   public Drawable getDrawable(DrawableType drawableType) {
-    if (drawableType == null) {
-      return null;
-    }
-
-    Drawable result = drawableMap.get(drawableType);
+    Drawable result = drawableMap.get(Preconditions.checkNotNull(drawableType));
     if (result == null) {
       result = createBackgroundDrawable(drawableType);
       drawableMap.put(drawableType, result);
     }
-
     return result;
   }
 
-  public void setSkinType(SkinType skinType) {
-    if (this.skinType == skinType) {
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    if (this.skin.equals(skin)) {
       return;
     }
-    this.skinType = skinType;
+    this.skin = skin;
     drawableMap.clear();
   }
 
   private Drawable createBackgroundDrawable(DrawableType drawableType) {
-    switch (drawableType) {
+    switch (Preconditions.checkNotNull(drawableType)) {
       case TWELVEKEYS_REGULAR_KEY_BACKGROUND:
         return createPressableDrawable(
             new RectKeyDrawable(
-                (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                (int) (TWELVEKEYS_TOP_OFFSET * density),
-                (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                skinType.twelvekeysLayoutPressedKeyTopColor,
-                skinType.twelvekeysLayoutPressedKeyBottomColor,
-                skinType.twelvekeysLayoutPressedKeyHighlightColor,
-                skinType.twelvekeysLayoutPressedKeyLightShadeColor,
-                skinType.twelvekeysLayoutPressedKeyDarkShadeColor,
-                skinType.twelvekeysLayoutPressedKeyShadowColor),
-            new RectKeyDrawable(
-                (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                (int) (TWELVEKEYS_TOP_OFFSET * density),
-                (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                skinType.twelvekeysLayoutReleasedKeyTopColor,
-                skinType.twelvekeysLayoutReleasedKeyBottomColor,
-                skinType.twelvekeysLayoutReleasedKeyHighlightColor,
-                skinType.twelvekeysLayoutReleasedKeyLightShadeColor,
-                skinType.twelvekeysLayoutReleasedKeyDarkShadeColor,
-                skinType.twelvekeysLayoutReleasedKeyShadowColor));
+                (int) (skin.twelvekeysLeftOffsetDimension),
+                (int) (skin.twelvekeysTopOffsetDimension),
+                (int) (skin.twelvekeysRightOffsetDimension),
+                (int) (skin.twelvekeysBottomOffsetDimension),
+                skin.twelvekeysLayoutPressedKeyTopColor,
+                skin.twelvekeysLayoutPressedKeyBottomColor,
+                skin.twelvekeysLayoutPressedKeyHighlightColor,
+                skin.twelvekeysLayoutPressedKeyLightShadeColor,
+                skin.twelvekeysLayoutPressedKeyDarkShadeColor,
+                skin.twelvekeysLayoutPressedKeyShadowColor),
+            Optional.<Drawable>of(new RectKeyDrawable(
+                (int) (skin.twelvekeysLeftOffsetDimension),
+                (int) (skin.twelvekeysTopOffsetDimension),
+                (int) (skin.twelvekeysRightOffsetDimension),
+                (int) (skin.twelvekeysBottomOffsetDimension),
+                skin.twelvekeysLayoutReleasedKeyTopColor,
+                skin.twelvekeysLayoutReleasedKeyBottomColor,
+                skin.twelvekeysLayoutReleasedKeyHighlightColor,
+                skin.twelvekeysLayoutReleasedKeyLightShadeColor,
+                skin.twelvekeysLayoutReleasedKeyDarkShadeColor,
+                skin.twelvekeysLayoutReleasedKeyShadowColor)));
 
       case TWELVEKEYS_FUNCTION_KEY_BACKGROUND:
         return createPressableDrawable(
             new RectKeyDrawable(
-                (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                (int) (TWELVEKEYS_TOP_OFFSET * density),
-                (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                skinType.twelvekeysLayoutPressedFunctionKeyTopColor,
-                skinType.twelvekeysLayoutPressedFunctionKeyBottomColor,
-                skinType.twelvekeysLayoutPressedFunctionKeyHighlightColor,
-                skinType.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
-                skinType.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
-                skinType.twelvekeysLayoutPressedFunctionKeyShadowColor),
-            new RectKeyDrawable(
-                (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                (int) (TWELVEKEYS_TOP_OFFSET * density),
-                (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                skinType.twelvekeysLayoutReleasedFunctionKeyTopColor,
-                skinType.twelvekeysLayoutReleasedFunctionKeyBottomColor,
-                skinType.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
-                skinType.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
-                skinType.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
-                skinType.twelvekeysLayoutReleasedFunctionKeyShadowColor));
+                (int) (skin.twelvekeysLeftOffsetDimension),
+                (int) (skin.twelvekeysTopOffsetDimension),
+                (int) (skin.twelvekeysRightOffsetDimension),
+                (int) (skin.twelvekeysBottomOffsetDimension),
+                skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+                skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+                skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+                skin.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
+                skin.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
+                skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+            Optional.<Drawable>of(new RectKeyDrawable(
+                (int) (skin.twelvekeysLeftOffsetDimension),
+                (int) (skin.twelvekeysTopOffsetDimension),
+                (int) (skin.twelvekeysRightOffsetDimension),
+                (int) (skin.twelvekeysBottomOffsetDimension),
+                skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+                skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+                skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+                skin.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
+                skin.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
+                skin.twelvekeysLayoutReleasedFunctionKeyShadowColor)));
 
       case TWELVEKEYS_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS:
         return new LayerDrawable(new Drawable[] {
             createPressableDrawable(
                 new RectKeyDrawable(
-                    (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                    (int) (TWELVEKEYS_TOP_OFFSET * density),
-                    (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                    (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                    skinType.twelvekeysLayoutPressedFunctionKeyTopColor,
-                    skinType.twelvekeysLayoutPressedFunctionKeyBottomColor,
-                    skinType.twelvekeysLayoutPressedFunctionKeyHighlightColor,
-                    skinType.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
-                    skinType.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
-                    skinType.twelvekeysLayoutPressedFunctionKeyShadowColor),
-                new RectKeyDrawable(
-                    (int) (TWELVEKEYS_LEFT_OFFSET * density),
-                    (int) (TWELVEKEYS_TOP_OFFSET * density),
-                    (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-                    (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-                    skinType.twelvekeysLayoutReleasedFunctionKeyTopColor,
-                    skinType.twelvekeysLayoutReleasedFunctionKeyBottomColor,
-                    skinType.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
-                    skinType.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
-                    skinType.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
-                    skinType.twelvekeysLayoutReleasedFunctionKeyShadowColor)),
+                    (int) (skin.twelvekeysLeftOffsetDimension),
+                    (int) (skin.twelvekeysTopOffsetDimension),
+                    (int) (skin.twelvekeysRightOffsetDimension),
+                    (int) (skin.twelvekeysBottomOffsetDimension),
+                    skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+                    skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+                    skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+                    skin.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
+                    skin.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
+                    skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+                Optional.<Drawable>of(new RectKeyDrawable(
+                    (int) (skin.twelvekeysLeftOffsetDimension),
+                    (int) (skin.twelvekeysTopOffsetDimension),
+                    (int) (skin.twelvekeysRightOffsetDimension),
+                    (int) (skin.twelvekeysBottomOffsetDimension),
+                    skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+                    skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+                    skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+                    skin.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
+                    skin.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
+                    skin.twelvekeysLayoutReleasedFunctionKeyShadowColor))),
             new ThreeDotsIconDrawable(
-                (int) ((TWELVEKEYS_BOTTOM_OFFSET + TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET) * density),
-                (int) ((TWELVEKEYS_RIGHT_OFFSET + TWELVEKEYS_THREEDOTS_RIGHT_OFFSET) * density),
-                skinType.threeDotsColor,
+                (int) (skin.twelvekeysBottomOffsetDimension
+                    + TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET * density),
+                (int) (skin.twelvekeysRightOffsetDimension
+                    + TWELVEKEYS_THREEDOTS_RIGHT_OFFSET * density),
+                skin.threeDotsColor,
                 (int) (TWELVEKEYS_THREEDOTS_WIDTH * density),
                 (int) (TWELVEKEYS_THREEDOTS_SPAN * density))});
 
       case QWERTY_REGULAR_KEY_BACKGROUND:
         return createPressableDrawable(
             new RoundRectKeyDrawable(
-                (int) (QWERTY_LEFT_OFFSET * density),
-                (int) (QWERTY_TOP_OFFSET * density),
-                (int) (QWERTY_RIGHT_OFFSET * density),
-                (int) (QWERTY_BOTTOM_OFFSET * density),
-                (int) (skinType.qwertyKeyRoundRadius * density),
-                skinType.qwertyLayoutPressedKeyTopColor,
-                skinType.qwertyLayoutPressedKeyBottomColor,
-                skinType.qwertyLayoutPressedKeyHighlightColor,
-                skinType.qwertyLayoutPressedKeyShadowColor),
-            new RoundRectKeyDrawable(
-                (int) (QWERTY_LEFT_OFFSET * density),
-                (int) (QWERTY_TOP_OFFSET * density),
-                (int) (QWERTY_RIGHT_OFFSET * density),
-                (int) (QWERTY_BOTTOM_OFFSET * density),
-                (int) (skinType.qwertyKeyRoundRadius * density),
-                skinType.qwertyLayoutReleasedKeyTopColor,
-                skinType.qwertyLayoutReleasedKeyBottomColor,
-                skinType.qwertyLayoutReleasedKeyHighlightColor,
-                skinType.qwertyLayoutReleasedKeyShadowColor));
+                (int) (skin.qwertyLeftOffsetDimension),
+                (int) (skin.qwertyTopOffsetDimension),
+                (int) (skin.qwertyRightOffsetDimension),
+                (int) (skin.qwertyBottomOffsetDimension),
+                (int) (skin.qwertyRoundRadiusDimension),
+                skin.qwertyLayoutPressedKeyTopColor,
+                skin.qwertyLayoutPressedKeyBottomColor,
+                skin.qwertyLayoutPressedKeyHighlightColor,
+                skin.qwertyLayoutPressedKeyShadowColor),
+            Optional.<Drawable>of(new RoundRectKeyDrawable(
+                (int) (skin.qwertyLeftOffsetDimension),
+                (int) (skin.qwertyTopOffsetDimension),
+                (int) (skin.qwertyRightOffsetDimension),
+                (int) (skin.qwertyBottomOffsetDimension),
+                (int) (skin.qwertyRoundRadiusDimension),
+                skin.qwertyLayoutReleasedKeyTopColor,
+                skin.qwertyLayoutReleasedKeyBottomColor,
+                skin.qwertyLayoutReleasedKeyHighlightColor,
+                skin.qwertyLayoutReleasedKeyShadowColor)));
 
       case QWERTY_FUNCTION_KEY_BACKGROUND:
         return createPressableDrawable(
             new RoundRectKeyDrawable(
-                (int) (QWERTY_LEFT_OFFSET * density),
-                (int) (QWERTY_TOP_OFFSET * density),
-                (int) (QWERTY_RIGHT_OFFSET * density),
-                (int) (QWERTY_BOTTOM_OFFSET * density),
-                (int) (skinType.qwertyKeyRoundRadius * density),
-                skinType.qwertyLayoutPressedFunctionKeyTopColor,
-                skinType.qwertyLayoutPressedFunctionKeyBottomColor,
-                skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
-                skinType.qwertyLayoutPressedFunctionKeyShadowColor),
-            new RoundRectKeyDrawable(
-                (int) (QWERTY_LEFT_OFFSET * density),
-                (int) (QWERTY_TOP_OFFSET * density),
-                (int) (QWERTY_RIGHT_OFFSET * density),
-                (int) (QWERTY_BOTTOM_OFFSET * density),
-                (int) (skinType.qwertyKeyRoundRadius * density),
-                skinType.qwertyLayoutReleasedFunctionKeyTopColor,
-                skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
-                skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
-                skinType.qwertyLayoutReleasedFunctionKeyShadowColor));
+                (int) (skin.qwertyLeftOffsetDimension),
+                (int) (skin.qwertyTopOffsetDimension),
+                (int) (skin.qwertyRightOffsetDimension),
+                (int) (skin.qwertyBottomOffsetDimension),
+                (int) (skin.qwertyRoundRadiusDimension),
+                skin.qwertyLayoutPressedFunctionKeyTopColor,
+                skin.qwertyLayoutPressedFunctionKeyBottomColor,
+                skin.qwertyLayoutPressedFunctionKeyHighlightColor,
+                skin.qwertyLayoutPressedFunctionKeyShadowColor),
+            Optional.<Drawable>of(new RoundRectKeyDrawable(
+                (int) (skin.qwertyLeftOffsetDimension),
+                (int) (skin.qwertyTopOffsetDimension),
+                (int) (skin.qwertyRightOffsetDimension),
+                (int) (skin.qwertyBottomOffsetDimension),
+                (int) (skin.qwertyRoundRadiusDimension),
+                skin.qwertyLayoutReleasedFunctionKeyTopColor,
+                skin.qwertyLayoutReleasedFunctionKeyBottomColor,
+                skin.qwertyLayoutReleasedFunctionKeyHighlightColor,
+                skin.qwertyLayoutReleasedFunctionKeyShadowColor)));
 
       case QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS:
         return new LayerDrawable(new Drawable[] {
             createPressableDrawable(
                 new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutPressedFunctionKeyTopColor,
-                    skinType.qwertyLayoutPressedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutPressedFunctionKeyShadowColor),
-                new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutReleasedFunctionKeyTopColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
+                    (int) (skin.qwertyLeftOffsetDimension),
+                    (int) (skin.qwertyTopOffsetDimension),
+                    (int) (skin.qwertyRightOffsetDimension),
+                    (int) (skin.qwertyBottomOffsetDimension),
+                    (int) (skin.qwertyRoundRadiusDimension),
+                    skin.qwertyLayoutPressedFunctionKeyTopColor,
+                    skin.qwertyLayoutPressedFunctionKeyBottomColor,
+                    skin.qwertyLayoutPressedFunctionKeyHighlightColor,
+                    skin.qwertyLayoutPressedFunctionKeyShadowColor),
+                Optional.<Drawable>of(new RoundRectKeyDrawable(
+                    (int) (skin.qwertyLeftOffsetDimension),
+                    (int) (skin.qwertyTopOffsetDimension),
+                    (int) (skin.qwertyRightOffsetDimension),
+                    (int) (skin.qwertyBottomOffsetDimension),
+                    (int) (skin.qwertyRoundRadiusDimension),
+                    skin.qwertyLayoutReleasedFunctionKeyTopColor,
+                    skin.qwertyLayoutReleasedFunctionKeyBottomColor,
+                    skin.qwertyLayoutReleasedFunctionKeyHighlightColor,
+                    skin.qwertyLayoutReleasedFunctionKeyShadowColor))),
             new ThreeDotsIconDrawable(
-                (int) ((QWERTY_BOTTOM_OFFSET + QWERTY_THREEDOTS_BOTTOM_OFFSET) * density),
-                (int) ((QWERTY_RIGHT_OFFSET + QWERTY_THREEDOTS_RIGHT_OFFSET) * density),
-                skinType.threeDotsColor,
+                (int) (skin.qwertyBottomOffsetDimension
+                    + (QWERTY_THREEDOTS_BOTTOM_OFFSET * density)),
+                (int) (skin.qwertyRightOffsetDimension
+                    + (QWERTY_THREEDOTS_RIGHT_OFFSET * density)),
+                skin.threeDotsColor,
                 (int) (QWERTY_THREEDOTS_WIDTH * density),
                 (int) (QWERTY_THREEDOTS_SPAN * density))});
 
-      case QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND:
+      case QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS:
         return new LayerDrawable(new Drawable[] {
             createPressableDrawable(
-                new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutPressedFunctionKeyTopColor,
-                    skinType.qwertyLayoutPressedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutPressedFunctionKeyShadowColor),
-                new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutReleasedFunctionKeyTopColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
-            new LightIconDrawable(
-                (int) ((QWERTY_TOP_OFFSET + QWERTY_LIGHT_TOP_OFFSET + QWERTY_LIGHT_RADIUS)
-                          * density),
-                (int) ((QWERTY_RIGHT_OFFSET + QWERTY_LIGHT_RIGHT_OFFSET + QWERTY_LIGHT_RADIUS)
-                          * density),
-                skinType.qwertyLightOnSignLightColor,
-                skinType.qwertyLightOnSignDarkColor,
-                skinType.qwertyLightOnSignShadeColor,
-                (int) (QWERTY_LIGHT_RADIUS * density))
-            });
+                new QwertySpaceKeyDrawable(
+                    (int) (skin.qwertySpaceKeyHeightDimension),
+                    (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+                    (int) (skin.qwertyTopOffsetDimension),
+                    (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+                    (int) (skin.qwertyBottomOffsetDimension),
+                    (int) (skin.qwertySpaceKeyRoundRadiusDimension),
+                    skin.qwertyLayoutPressedSpaceKeyTopColor,
+                    skin.qwertyLayoutPressedSpaceKeyBottomColor,
+                    skin.qwertyLayoutPressedSpaceKeyHighlightColor,
+                    skin.qwertyLayoutPressedSpaceKeyShadowColor),
+                Optional.<Drawable>of(new QwertySpaceKeyDrawable(
+                    (int) (skin.qwertySpaceKeyHeightDimension),
+                    (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+                    (int) (skin.qwertyTopOffsetDimension),
+                    (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+                    (int) (skin.qwertyBottomOffsetDimension),
+                    (int) (skin.qwertySpaceKeyRoundRadiusDimension),
+                    skin.qwertyLayoutReleasedSpaceKeyTopColor,
+                    skin.qwertyLayoutReleasedSpaceKeyBottomColor,
+                    skin.qwertyLayoutReleasedSpaceKeyHighlightColor,
+                    skin.qwertyLayoutReleasedSpaceKeyShadowColor))),
+            new ThreeDotsIconDrawable(
+                (int) (skin.qwertyBottomOffsetDimension
+                    + (QWERTY_THREEDOTS_BOTTOM_OFFSET * density)),
+                (int) (skin.qwertySpaceKeyHorizontalOffsetDimension
+                    + (QWERTY_THREEDOTS_RIGHT_OFFSET * density)),
+                skin.threeDotsColor,
+                (int) (QWERTY_THREEDOTS_WIDTH * density),
+                (int) (QWERTY_THREEDOTS_SPAN * density))});
 
-      case QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND:
-        return new LayerDrawable(new Drawable[] {
-            createPressableDrawable(
-                new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutPressedFunctionKeyTopColor,
-                    skinType.qwertyLayoutPressedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutPressedFunctionKeyShadowColor),
-                new RoundRectKeyDrawable(
-                    (int) (QWERTY_LEFT_OFFSET * density),
-                    (int) (QWERTY_TOP_OFFSET * density),
-                    (int) (QWERTY_RIGHT_OFFSET * density),
-                    (int) (QWERTY_BOTTOM_OFFSET * density),
-                    (int) (skinType.qwertyKeyRoundRadius * density),
-                    skinType.qwertyLayoutReleasedFunctionKeyTopColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
-                    skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
-            new LightIconDrawable(
-                (int) ((QWERTY_TOP_OFFSET + QWERTY_LIGHT_TOP_OFFSET + QWERTY_LIGHT_RADIUS)
-                          * density),
-                (int) ((QWERTY_RIGHT_OFFSET + QWERTY_LIGHT_RIGHT_OFFSET + QWERTY_LIGHT_RADIUS)
-                          * density),
-                skinType.qwertyLightOffSignLightColor,
-                skinType.qwertyLightOffSignDarkColor,
-                skinType.qwertyLightOffSignShadeColor,
-                (int) (QWERTY_LIGHT_RADIUS * density))
-            });
+      case KEYBOARD_SEPARATOR_TOP:
+        return new InsetDrawable(
+            new ColorDrawable(skin.keyboardSeparatorColor), 0,
+                              resources.getDimensionPixelSize(R.dimen.keyboard_separator_padding),
+                              0, 0);
+
+      case KEYBOARD_SEPARATOR_CENTER:
+        return new ColorDrawable(skin.keyboardSeparatorColor);
+
+      case KEYBOARD_SEPARATOR_BOTTOM:
+        return new InsetDrawable(
+            new ColorDrawable(skin.keyboardSeparatorColor), 0, 0, 0,
+            resources.getDimensionPixelSize(R.dimen.keyboard_separator_padding));
+
+      case TRNASPARENT:
+        return DummyDrawable.getInstance();
 
       case TWELVEKEYS_CENTER_FLICK:
         return new CenterCircularHighlightDrawable(
-            (int) (TWELVEKEYS_LEFT_OFFSET * density),
-            (int) (TWELVEKEYS_TOP_OFFSET * density),
-            (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-            (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-            skinType.flickBaseColor,
-            skinType.flickShadeColor);
+            (int) (skin.twelvekeysLeftOffsetDimension),
+            (int) (skin.twelvekeysTopOffsetDimension),
+            (int) (skin.twelvekeysRightOffsetDimension),
+            (int) (skin.twelvekeysBottomOffsetDimension),
+            skin.flickBaseColor,
+            skin.flickShadeColor);
 
       case TWELVEKEYS_LEFT_FLICK:
         return new TriangularHighlightDrawable(
-            (int) (TWELVEKEYS_LEFT_OFFSET * density),
-            (int) (TWELVEKEYS_TOP_OFFSET * density),
-            (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-            (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-            skinType.flickBaseColor,
-            skinType.flickShadeColor,
+            (int) (skin.twelvekeysLeftOffsetDimension),
+            (int) (skin.twelvekeysTopOffsetDimension),
+            (int) (skin.twelvekeysRightOffsetDimension),
+            (int) (skin.twelvekeysBottomOffsetDimension),
+            skin.flickBaseColor,
+            skin.flickShadeColor,
             HighlightDirection.LEFT);
 
       case TWELVEKEYS_UP_FLICK:
         return new TriangularHighlightDrawable(
-            (int) (TWELVEKEYS_LEFT_OFFSET * density),
-            (int) (TWELVEKEYS_TOP_OFFSET * density),
-            (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-            (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-            skinType.flickBaseColor,
-            skinType.flickShadeColor,
+            (int) (skin.twelvekeysLeftOffsetDimension),
+            (int) (skin.twelvekeysTopOffsetDimension),
+            (int) (skin.twelvekeysRightOffsetDimension),
+            (int) (skin.twelvekeysBottomOffsetDimension),
+            skin.flickBaseColor,
+            skin.flickShadeColor,
             HighlightDirection.UP);
 
       case TWELVEKEYS_RIGHT_FLICK:
         return new TriangularHighlightDrawable(
-            (int) (TWELVEKEYS_LEFT_OFFSET * density),
-            (int) (TWELVEKEYS_TOP_OFFSET * density),
-            (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-            (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-            skinType.flickBaseColor,
-            skinType.flickShadeColor,
+            (int) (skin.twelvekeysLeftOffsetDimension),
+            (int) (skin.twelvekeysTopOffsetDimension),
+            (int) (skin.twelvekeysRightOffsetDimension),
+            (int) (skin.twelvekeysBottomOffsetDimension),
+            skin.flickBaseColor,
+            skin.flickShadeColor,
             HighlightDirection.RIGHT);
 
       case TWELVEKEYS_DOWN_FLICK:
         return new TriangularHighlightDrawable(
-            (int) (TWELVEKEYS_LEFT_OFFSET * density),
-            (int) (TWELVEKEYS_TOP_OFFSET * density),
-            (int) (TWELVEKEYS_RIGHT_OFFSET * density),
-            (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
-            skinType.flickBaseColor,
-            skinType.flickShadeColor,
+            (int) (skin.twelvekeysLeftOffsetDimension),
+            (int) (skin.twelvekeysTopOffsetDimension),
+            (int) (skin.twelvekeysRightOffsetDimension),
+            (int) (skin.twelvekeysBottomOffsetDimension),
+            skin.flickBaseColor,
+            skin.flickShadeColor,
             HighlightDirection.DOWN);
 
       case POPUP_BACKGROUND_WINDOW:
-        // TODO(hidehiko): add a flag to control popup style in SkinType.
-        return skinType == SkinType.ORANGE_LIGHTGRAY
-            ? new PopUpFrameWindowDrawable(
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_FRAME_BORDER_WIDTH * density),
-                  POPUP_SHADOW_SIZE * density,
-                  skinType.popupFrameWindowTopColor,
-                  skinType.popupFrameWindowBottomColor,
-                  skinType.popupFrameWindowBorderColor,
-                  skinType.popupFrameWindowInnerPaneColor)
-            : new RoundRectKeyDrawable(
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (POPUP_WINDOW_PADDING * density),
-                  (int) (skinType.qwertyKeyRoundRadius * density),
-                  skinType.popupFrameWindowTopColor,
-                  skinType.popupFrameWindowBottomColor,
-                  0,  // No highlight.
-                  skinType.popupFrameWindowShadowColor);
+        return
+            new RoundRectKeyDrawable(
+                (int) (POPUP_WINDOW_PADDING * density),
+                (int) (POPUP_WINDOW_PADDING * density),
+                (int) (POPUP_WINDOW_PADDING * density),
+                (int) (POPUP_WINDOW_PADDING * density),
+                (int) (skin.qwertyRoundRadiusDimension),
+                skin.popupFrameWindowTopColor,
+                skin.popupFrameWindowBottomColor,
+                0,  // No highlight.
+                skin.popupFrameWindowShadowColor);
+
       case CANDIDATE_BACKGROUND:
         return createFocusableDrawable(
             new CandidateBackgroundFocusedDrawable(
@@ -471,18 +444,19 @@
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
-                skinType.candidateBackgroundFocusedTopColor,
-                skinType.candidateBackgroundFocusedBottomColor,
-                skinType.candidateBackgroundFocusedShadowColor),
-            new CandidateBackgroundDrawable(
+                skin.candidateBackgroundFocusedTopColor,
+                skin.candidateBackgroundFocusedBottomColor,
+                skin.candidateBackgroundFocusedShadowColor),
+            Optional.<Drawable>of(new CandidateBackgroundDrawable(
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (CANDIDATE_BACKGROUND_PADDING * density),
-                skinType.candidateBackgroundTopColor,
-                skinType.candidateBackgroundBottomColor,
-                skinType.candidateBackgroundHighlightColor,
-                skinType.candidateBackgroundBorderColor));
+                skin.candidateBackgroundTopColor,
+                skin.candidateBackgroundBottomColor,
+                skin.candidateBackgroundHighlightColor,
+                skin.candidateBackgroundBorderColor)));
+
       case SYMBOL_CANDIDATE_BACKGROUND:
         return createFocusableDrawable(
             new CandidateBackgroundFocusedDrawable(
@@ -490,18 +464,18 @@
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
-                skinType.candidateBackgroundFocusedTopColor,
-                skinType.candidateBackgroundFocusedBottomColor,
-                skinType.candidateBackgroundFocusedShadowColor),
-            new CandidateBackgroundDrawable(
+                skin.candidateBackgroundFocusedTopColor,
+                skin.candidateBackgroundFocusedBottomColor,
+                skin.candidateBackgroundFocusedShadowColor),
+            Optional.<Drawable>of(new CandidateBackgroundDrawable(
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
                 (int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
-                skinType.symbolCandidateBackgroundTopColor,
-                skinType.symbolCandidateBackgroundBottomColor,
-                skinType.symbolCandidateBackgroundHighlightColor,
-                skinType.symbolCandidateBackgroundBorderColor));
+                skin.symbolCandidateBackgroundTopColor,
+                skin.symbolCandidateBackgroundBottomColor,
+                skin.symbolCandidateBackgroundHighlightColor,
+                skin.symbolCandidateBackgroundBorderColor)));
     }
 
     throw new IllegalArgumentException("Unknown drawable type: " + drawableType);
@@ -509,29 +483,32 @@
 
   // TODO(hidehiko): Move this method to the somewhere in view package.
   public static Drawable createPressableDrawable(
-      Drawable pressedDrawable, Drawable releasedDrawable) {
+      Drawable pressedDrawable, Optional<Drawable> releasedDrawable) {
     return createTwoStateDrawable(
-        android.R.attr.state_pressed, pressedDrawable, releasedDrawable);
+        android.R.attr.state_pressed, Preconditions.checkNotNull(pressedDrawable),
+        Preconditions.checkNotNull(releasedDrawable));
   }
 
   public static Drawable createFocusableDrawable(
-      Drawable focusedDrawable, Drawable unfocusedDrawable) {
+      Drawable focusedDrawable, Optional<Drawable> unfocusedDrawable) {
     return createTwoStateDrawable(
-        android.R.attr.state_focused, focusedDrawable, unfocusedDrawable);
+        android.R.attr.state_focused, Preconditions.checkNotNull(focusedDrawable),
+        Preconditions.checkNotNull(unfocusedDrawable));
   }
 
   public static Drawable createSelectableDrawable(
-      Drawable selectedDrawable, Drawable unselectedDrawable) {
+      Drawable selectedDrawable, Optional<Drawable> unselectedDrawable) {
     return createTwoStateDrawable(
-        android.R.attr.state_selected, selectedDrawable, unselectedDrawable);
+        android.R.attr.state_selected, Preconditions.checkNotNull(selectedDrawable),
+        Preconditions.checkNotNull(unselectedDrawable));
   }
 
   private static Drawable createTwoStateDrawable(
-      int state, Drawable enabledDrawable, Drawable disabledDrawable) {
+      int state, Drawable enabledDrawable, Optional<Drawable> disabledDrawable) {
     StateListDrawable drawable = new StateListDrawable();
     drawable.addState(new int[] { state }, enabledDrawable);
-    if (disabledDrawable != null) {
-      drawable.addState(EMPTY_STATE, disabledDrawable);
+    if (disabledDrawable.isPresent()) {
+      drawable.addState(EMPTY_STATE, disabledDrawable.get());
     }
     return drawable;
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
index 3ca9dab..3fe183b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
@@ -30,6 +30,7 @@
 package org.mozc.android.inputmethod.japanese.keyboard;
 
 import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 
 /**
  * A class corresponding to {@code &lt;Flick&gt;} element in xml resource files.
@@ -61,15 +62,10 @@
 
   private final Flick.Direction direction;
   private final KeyEntity keyEntity;
+
   public Flick(Direction direction, KeyEntity keyEntity) {
-    if (direction == null) {
-      throw new NullPointerException("direction shouldn't be null.");
-    }
-    if (keyEntity == null) {
-      throw new NullPointerException("keyEntity shouldn't be null.");
-    }
-    this.direction = direction;
-    this.keyEntity = keyEntity;
+    this.direction = Preconditions.checkNotNull(direction);
+    this.keyEntity = Preconditions.checkNotNull(keyEntity);
   }
 
   public Direction getDirection() {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
index d60590e..8e51588 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
@@ -29,6 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Optional;
@@ -57,7 +58,6 @@
  *   <li> {@code edgeFlags}: flags whether the key should stick to keyboard's boundary.
  *   <li> {@code isRepeatable}: whether the key long press cause a repeated key tapping.
  *   <li> {@code isModifier}: whether the key is modifier (e.g. shift key).
- *   <li> {@code isSticky}: whether the key behaves sticky (e.g. caps lock).
  * </ul>
  *
  * The {@code &lt;Key&gt;} element can have (at most) two {@code &lt;KeyState&gt;} elements.
@@ -86,16 +86,24 @@
   private final int edgeFlags;
   private final boolean isRepeatable;
   private final boolean isModifier;
-  private final boolean isSticky;
   private final Stick stick;
   // Default KeyState.
   // Absent if this is a spacer.
   private final Optional<KeyState> defaultKeyState;
+  private final DrawableType keyBackgroundDrawableType;
+
   private final List<KeyState> keyStateList;
 
   public Key(int x, int y, int width, int height, int horizontalGap,
-             int edgeFlags, boolean isRepeatable, boolean isModifier, boolean isSticky,
-             Stick stick, List<? extends KeyState> keyStateList) {
+             int edgeFlags, boolean isRepeatable, boolean isModifier,
+             Stick stick, DrawableType keyBackgroundDrawableType,
+             List<? extends KeyState> keyStateList) {
+    Preconditions.checkNotNull(stick);
+    Preconditions.checkNotNull(keyBackgroundDrawableType);
+    Preconditions.checkNotNull(keyStateList);
+    Preconditions.checkArgument(width >= 0);
+    Preconditions.checkArgument(height >= 0);
+
     this.x = x;
     this.y = y;
     this.width = width;
@@ -104,28 +112,29 @@
     this.edgeFlags = edgeFlags;
     this.isRepeatable = isRepeatable;
     this.isModifier = isModifier;
-    this.isSticky = isSticky;
     this.stick = stick;
+    this.keyBackgroundDrawableType = keyBackgroundDrawableType;
 
     List<KeyState> tmpKeyStateList = null;  // Lazy creation.
     Optional<KeyState> defaultKeyState = Optional.absent();
     for (KeyState keyState : keyStateList) {
       Set<KeyState.MetaState> metaStateSet = keyState.getMetaStateSet();
-      if (metaStateSet.isEmpty()) {
+      if (metaStateSet.isEmpty() || metaStateSet.contains(KeyState.MetaState.FALLBACK)) {
         if (defaultKeyState.isPresent()) {
           throw new IllegalArgumentException("Found duplicate default meta state");
         }
         defaultKeyState = Optional.of(keyState);
-        continue;
+        if (metaStateSet.size() <= 1) {  // metaStateSet contains only FALLBACK
+          continue;
+        }
       }
       if (tmpKeyStateList == null) {
         tmpKeyStateList = new ArrayList<KeyState>();
       }
       tmpKeyStateList.add(keyState);
     }
-    if (!defaultKeyState.isPresent() && tmpKeyStateList != null) {
-      throw new IllegalArgumentException("Default KeyState is mandatory for non-spacer.");
-    }
+    Preconditions.checkArgument(defaultKeyState.isPresent() || tmpKeyStateList == null,
+                                "Default KeyState is mandatory for non-spacer.");
     this.defaultKeyState = defaultKeyState;
     this.keyStateList = tmpKeyStateList == null
         ? Collections.<KeyState>emptyList()
@@ -164,14 +173,14 @@
     return isModifier;
   }
 
-  public boolean isSticky() {
-    return isSticky;
-  }
-
   public Stick getStick() {
     return stick;
   }
 
+  public DrawableType getKeyBackgroundDrawableType() {
+    return keyBackgroundDrawableType;
+  }
+
   /**
    * Returns {@code KeyState} at least one of which the metaState is in given {@code metaStates}.
    * <p>
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
index 9da4629..5184f09 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
@@ -29,8 +29,9 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
-import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 /**
  * A class corresponding to a {@code &lt;KeyEntity&gt;} element in xml resource files.
@@ -39,45 +40,43 @@
  *
  */
 public class KeyEntity {
+
   /** INVALID_KEY_CODE represents the key has no key code to call the Mozc server back. */
   public static final int INVALID_KEY_CODE = Integer.MIN_VALUE;
 
   private final int sourceId;
   private final int keyCode;
   private final int longPressKeyCode;
+  private final boolean longPressTimeoutTrigger;
   private final int keyIconResourceId;
   // If |keyIconResourceId| is empty and |keyCharacter| is set,
   // use this character for rendering key top.
   // TODO(team): Implement rendering method.
-  private final String keyCharacter;
-  // TODO(hidehiko): Move this field to Key.
-  private final DrawableType keyBackgroundDrawableType;
+  private final Optional<String> keyCharacter;
   private final boolean flickHighlightEnabled;
-  private final PopUp popUp;
-
-  // Constructor for compatibility.
-  // TODO(team): Remove this constructor after changing all callers including tests.
-  public KeyEntity(int sourceId, int keyCode, int longPressKeyCode,
-                   int keyIconResourceId,
-                   DrawableType keyBackgroundDrawableType,
-                   boolean flickHighlightEnabled, PopUp popUp) {
-    this(
-        sourceId, keyCode, longPressKeyCode, keyIconResourceId, null, keyBackgroundDrawableType,
-        flickHighlightEnabled, popUp);
-  }
+  private final Optional<PopUp> popUp;
+  private final int horizontalPadding;
+  private final int verticalPadding;
+  private final int iconWidth;
+  private final int iconHeight;
 
   public KeyEntity(int sourceId, int keyCode, int longPressKeyCode,
-                   int keyIconResourceId, String keyCharacter,
-                   DrawableType keyBackgroundDrawableType,
-                   boolean flickHighlightEnabled, PopUp popUp) {
+                   boolean longPressTimeoutTrigger, int keyIconResourceId,
+                   Optional<String> keyCharacter, boolean flickHighlightEnabled,
+                   Optional<PopUp> popUp, int horizontalPadding, int verticalPadding,
+                   int iconWidth, int iconHeight) {
     this.sourceId = sourceId;
     this.keyCode = keyCode;
     this.longPressKeyCode = longPressKeyCode;
+    this.longPressTimeoutTrigger = longPressTimeoutTrigger;
     this.keyIconResourceId = keyIconResourceId;
-    this.keyCharacter = keyCharacter;
-    this.keyBackgroundDrawableType = keyBackgroundDrawableType;
+    this.keyCharacter = Preconditions.checkNotNull(keyCharacter);
     this.flickHighlightEnabled = flickHighlightEnabled;
-    this.popUp = popUp;
+    this.popUp = Preconditions.checkNotNull(popUp);
+    this.horizontalPadding = horizontalPadding;
+    this.verticalPadding = verticalPadding;
+    this.iconWidth = iconWidth;
+    this.iconHeight = iconHeight;
   }
 
   public int getSourceId() {
@@ -92,34 +91,55 @@
     return longPressKeyCode;
   }
 
+  public boolean isLongPressTimeoutTrigger() {
+    return longPressTimeoutTrigger;
+  }
+
   public int getKeyIconResourceId() {
     return keyIconResourceId;
   }
 
-  public String getKeyCharacter() {
+  public Optional<String> getKeyCharacter() {
     return keyCharacter;
   }
 
-  public DrawableType getKeyBackgroundDrawableType() {
-    return keyBackgroundDrawableType;
-  }
-
   public boolean isFlickHighlightEnabled() {
     return flickHighlightEnabled;
   }
 
-  public PopUp getPopUp() {
+  public Optional<PopUp> getPopUp() {
     return popUp;
   }
 
+  public int getHorizontalPadding() {
+    return horizontalPadding;
+  }
+
+  public int getVerticalPadding() {
+    return verticalPadding;
+  }
+
+  public int getIconWidth() {
+    return iconWidth;
+  }
+
+  public int getIconHeight() {
+    return iconHeight;
+  }
+
   @Override
   public String toString() {
     return Objects.toStringHelper(this)
                   .add("sourceId", sourceId)
                   .add("keyCode", keyCode)
                   .add("longPressKeyCode", longPressKeyCode)
+                  .add("longPressTimeoutTrigger", longPressTimeoutTrigger)
                   .add("keyIconResourceId", keyIconResourceId)
                   .add("keyCharacter", keyCharacter)
+                  .add("horizontalPadding", horizontalPadding)
+                  .add("verticalPadding", verticalPadding)
+                  .add("iconWidth", iconWidth)
+                  .add("iconHeight", iconHeight)
                   .toString();
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
index a8947d9..02c3b6c 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
@@ -39,8 +39,6 @@
 
 import java.util.Set;
 
-import javax.annotation.Nullable;
-
 /**
  * This class represents user's one action, e.g., the sequence of:
  * press -> move -> move -> ... -> move -> release.
@@ -49,8 +47,8 @@
  * E.g. for user's two finger strokes, two instances will be instantiated.
  *
  */
-// TODO(matsuzakit): Get rid of @Nullable.
 public class KeyEventContext {
+
   final Key key;
   final int pointerId;
   private final float pressedX;
@@ -62,7 +60,7 @@
 
   // TODO(hidehiko): Move logging code to an upper layer, e.g., MozcService or ViewManager etc.
   //   after refactoring the architecture.
-  private TouchAction lastAction = null;
+  private Optional<TouchAction> lastAction = Optional.absent();
   private float lastX;
   private float lastY;
   private long lastTimestamp;
@@ -70,7 +68,9 @@
   private final int keyboardHeight;
 
   // This variable will be updated in the callback of long press key event (if necessary).
-  boolean longPressSent = false;
+  boolean pastLongPressSentTimeout = false;
+
+  Optional<Runnable> longPressCallback = Optional.absent();
 
   public KeyEventContext(Key key, int pointerId, float pressedX, float pressedY,
                          int keyboardWidth, int keyboardHeight,
@@ -95,9 +95,8 @@
 
   /**
    * Returns true iff the point ({@code x}, {@code y}) is contained by the {@code key}'s region.
-   * This is package private for testing purpose.
    */
-  static boolean isContained(float x, float y, Key key) {
+  @VisibleForTesting static boolean isContained(float x, float y, Key key) {
     float relativeX = x - key.getX();
     float relativeY = y - key.getY();
     return 0 <= relativeX && relativeX < key.getWidth() &&
@@ -117,75 +116,82 @@
       return false;
     }
     KeyState keyState = optionalKeyState.get();
-    return keyState.getFlick(Flick.Direction.LEFT) != null ||
-           keyState.getFlick(Flick.Direction.UP) != null ||
-           keyState.getFlick(Flick.Direction.RIGHT) != null ||
-           keyState.getFlick(Flick.Direction.DOWN) != null;
+    return keyState.getFlick(Flick.Direction.LEFT).isPresent() ||
+           keyState.getFlick(Flick.Direction.UP).isPresent() ||
+           keyState.getFlick(Flick.Direction.RIGHT).isPresent() ||
+           keyState.getFlick(Flick.Direction.DOWN).isPresent();
   }
 
   /**
    * Returns the key entity corresponding to {@code metaState} and {@code direction}.
    */
-  @Nullable
-  public static KeyEntity getKeyEntity(Key key, Set<MetaState> metaState,
-                                       @Nullable Flick.Direction direction) {
+  public static Optional<KeyEntity> getKeyEntity(Key key, Set<MetaState> metaState,
+                                                 Optional<Flick.Direction> direction) {
     Preconditions.checkNotNull(key);
     Preconditions.checkNotNull(metaState);
+    Preconditions.checkNotNull(direction);
 
     if (key.isSpacer()) {
-      return null;
+      return Optional.absent();
     }
     // Key is not spacer for at least one KeyState is available.
-    return getKeyEntityInternal(key.getKeyState(metaState).get(), direction).orNull();
+    return getKeyEntityInternal(key.getKeyState(metaState).get(), direction);
   }
 
   private Optional<KeyEntity> getKeyEntity(Flick.Direction direction) {
     return keyState.isPresent()
-        ? getKeyEntityInternal(keyState.get(), direction)
+        ? getKeyEntityInternal(keyState.get(), Optional.of(direction))
         : Optional.<KeyEntity>absent();
   }
 
   private static Optional<KeyEntity> getKeyEntityInternal(KeyState keyState,
-                                                          @Nullable Flick.Direction direction) {
+                                                          Optional<Flick.Direction> direction) {
     Preconditions.checkNotNull(keyState);
+    Preconditions.checkNotNull(direction);
 
-    if (direction == null) {
+    if (!direction.isPresent()) {
       return Optional.absent();
     }
 
-    Flick flick = keyState.getFlick(direction);
-    return flick == null ? Optional.<KeyEntity>absent() : Optional.of(flick.getKeyEntity());
+    Optional<Flick> flick = keyState.getFlick(direction.get());
+    return flick.isPresent()
+        ? Optional.of(flick.get().getKeyEntity())
+        : Optional.<KeyEntity>absent();
   }
 
   /**
    * Returns the key code to be sent via {@link KeyboardActionListener#onKey(int, java.util.List)}.
+   * <p>
+   * If {@code keyEntyty} doesn't trigger longpress by timeout (isLongPressTimeoutTrigger is false),
+   * the result depends on the timestamp of touch-down event.
    */
   public int getKeyCode() {
-    if (longPressSent) {
+    Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
+    if (!keyEntity.isPresent()
+        || (pastLongPressSentTimeout && keyEntity.get().isLongPressTimeoutTrigger())) {
       // If the long-press-key event is already sent, just return INVALID_KEY_CODE.
       return KeyEntity.INVALID_KEY_CODE;
     }
-
-    Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
-    return keyEntity.isPresent()
-        ? keyEntity.get().getKeyCode()
-        : KeyEntity.INVALID_KEY_CODE;
+    return !keyEntity.get().isLongPressTimeoutTrigger()
+           && keyEntity.get().getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE
+           && pastLongPressSentTimeout
+           ? keyEntity.get().getLongPressKeyCode() : keyEntity.get().getKeyCode();
   }
 
   Set<MetaState> getNextMetaStates(Set<MetaState> originalMetaStates) {
+    Preconditions.checkNotNull(originalMetaStates);
     if (!key.isModifier() || key.isSpacer()) {
       // Non-modifier key shouldn't change meta state.
       return originalMetaStates;
     }
-    Set<MetaState> result = keyState.get().getNextMetaStates(originalMetaStates);
-    return result;
+    return keyState.get().getNextMetaStates(originalMetaStates);
   }
 
   /**
    * Returns the key code to be sent for long press event.
    */
   int getLongPressKeyCode() {
-    if (longPressSent) {
+    if (pastLongPressSentTimeout) {
       // If the long-press-key event is already sent, just return INVALID_KEY_CODE.
       return KeyEntity.INVALID_KEY_CODE;
     }
@@ -197,6 +203,11 @@
         : KeyEntity.INVALID_KEY_CODE;
   }
 
+  boolean isLongPressTimeoutTrigger() {
+    Optional<KeyEntity> keyEntity = getKeyEntity(Flick.Direction.CENTER);
+    return !keyEntity.isPresent() || keyEntity.get().isLongPressTimeoutTrigger();
+  }
+
   /**
    * Returns the key code to be send via {@link KeyboardActionListener#onPress(int)} and
    * {@link KeyboardActionListener#onRelease(int)}.
@@ -212,20 +223,20 @@
    * Returns true if this key event sequence represents toggling meta state.
    */
   boolean isMetaStateToggleEvent() {
-    return !longPressSent && key.isModifier() && flickDirection == Flick.Direction.CENTER;
+    return !pastLongPressSentTimeout && key.isModifier()
+        && flickDirection == Flick.Direction.CENTER;
   }
 
   /**
    * Returns the pop up data for the current state.
    */
-  @Nullable
-  PopUp getCurrentPopUp() {
-    if (longPressSent) {
-      return null;
+  Optional<PopUp> getCurrentPopUp() {
+    if (pastLongPressSentTimeout) {
+      return Optional.absent();
     }
 
     Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
-    return keyEntity.isPresent() ? keyEntity.get().getPopUp() : null;
+    return keyEntity.isPresent() ? keyEntity.get().getPopUp() : Optional.<PopUp>absent();
   }
 
   /**
@@ -234,8 +245,9 @@
    * @return {@code true} if the internal state is actually updated.
    */
   public boolean update(float x, float y, TouchAction touchAction, long timestamp) {
+    lastAction = Optional.of(touchAction);
+
     Flick.Direction originalDirection = flickDirection;
-    lastAction = touchAction;
     lastX = x;
     lastY = y;
     lastTimestamp = timestamp;
@@ -257,28 +269,41 @@
         flickDirection = deltaX > 0 ? Flick.Direction.RIGHT : Flick.Direction.LEFT;
       }
     }
-    return flickDirection != originalDirection;
+
+    if (flickDirection == originalDirection) {
+      return false;
+    } else {
+      // If flickDirection has been updated, reset pastLongPressSentTimeout flag
+      // so that long-press even can be sent again.
+      // This happens when
+      // [Hold 'q' key]
+      // -> [Popup '1' is shown as the result of long-press]
+      // -> [Flick outside to dismiss the popup]
+      // -> [Flick again to the center position and hold]
+      // -> [Popup '1' is shown again as the result of long-press]
+      pastLongPressSentTimeout = false;
+      return true;
+    }
   }
 
   /**
    * @return {@code TouchEvent} instance which includes the stroke related to this context.
    */
-  @Nullable
-  public TouchEvent getTouchEvent() {
+  public Optional<TouchEvent> getTouchEvent() {
     Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
     if (!keyEntity.isPresent()) {
-      return null;
+      return Optional.absent();
     }
 
     TouchEvent.Builder builder = TouchEvent.newBuilder()
         .setSourceId(keyEntity.get().getSourceId());
     builder.addStroke(createTouchPosition(
         TouchAction.TOUCH_DOWN, pressedX, pressedY, keyboardWidth, keyboardHeight, 0));
-    if (lastAction != null) {
+    if (lastAction.isPresent()) {
       builder.addStroke(createTouchPosition(
-          lastAction, lastX, lastY, keyboardWidth, keyboardHeight, lastTimestamp));
+          lastAction.get(), lastX, lastY, keyboardWidth, keyboardHeight, lastTimestamp));
     }
-    return builder.build();
+    return Optional.of(builder.build());
   }
 
   public static TouchPosition createTouchPosition(
@@ -290,4 +315,8 @@
         .setTimestamp(timestamp)
         .build();
   }
+
+  public void setLongPressCallback(Runnable longPressCallback) {
+    this.longPressCallback = Optional.of(longPressCallback);
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
index 7d5c9fb..3ab306f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
@@ -31,6 +31,7 @@
 
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 
 import android.os.Handler;
 import android.os.Looper;
@@ -44,13 +45,13 @@
  *
  */
 public class KeyEventHandler implements Handler.Callback {
+
   // A dummy argument which is passed to the callback's message.
   private static final int DUMMY_ARG = 0;
 
   // Keys to figure out what message is sent in the callback.
-  // Package private for testing purpose.
-  static final int REPEAT_KEY = 1;
-  static final int LONG_PRESS_KEY = 2;
+  @VisibleForTesting static final int REPEAT_KEY = 1;
+  @VisibleForTesting static final int LONG_PRESS_KEY = 2;
 
   @VisibleForTesting final Handler handler;
   private final KeyboardActionListener keyboardActionListener;
@@ -67,14 +68,8 @@
   public KeyEventHandler(
       Looper looper, KeyboardActionListener keyboardActionListener,
       int repeatKeyDelay, int repeatKeyInterval, int longPressKeyDelay) {
-    if (looper == null) {
-      throw new NullPointerException("looper is null.");
-    }
-    if (keyboardActionListener == null) {
-      throw new NullPointerException("keyboardActionListener is null.");
-    }
-    this.handler = new Handler(looper, this);
-    this.keyboardActionListener = keyboardActionListener;
+    this.handler = new Handler(Preconditions.checkNotNull(looper), this);
+    this.keyboardActionListener = Preconditions.checkNotNull(keyboardActionListener);
     this.repeatKeyDelay = repeatKeyDelay;
     this.repeatKeyInterval = repeatKeyInterval;
     this.longPressKeyDelay = longPressKeyDelay;
@@ -82,25 +77,51 @@
 
   @Override
   public boolean handleMessage(Message message) {
-    int keyCode = message.arg1;
     KeyEventContext context = KeyEventContext.class.cast(message.obj);
-    keyboardActionListener.onKey(keyCode, Collections.singletonList(context.getTouchEvent()));
-
     switch (message.what) {
       case REPEAT_KEY: {
-        Message newMessage = handler.obtainMessage(REPEAT_KEY, keyCode, DUMMY_ARG, context);
-        handler.sendMessageDelayed(newMessage, repeatKeyInterval);
+        handleMessageRepeatKey(context);
         break;
       }
       case LONG_PRESS_KEY:
-        // Set a flag that means long-press-key-event has been sent.
-        context.longPressSent = true;
+        handleMessageLongPress(context);
         break;
     }
 
     return true;
   }
 
+  private void handleMessageRepeatKey(KeyEventContext context) {
+    int keyCode = context.getPressedKeyCode();
+    // TODO(hsumita): confirm that we can put null as a touch event or not.
+    keyboardActionListener.onKey(
+        keyCode, Collections.singletonList(context.getTouchEvent().orNull()));
+    Message newMessage = handler.obtainMessage(REPEAT_KEY, keyCode, DUMMY_ARG, context);
+    handler.sendMessageDelayed(newMessage, repeatKeyInterval);
+  }
+
+  /**
+   * Does the things which should be done when long-press operation is done.
+   * <p>
+   * This is public because this is called from KeyboardView directory in order to implement
+   * accessibility feature.
+   */
+  public void handleMessageLongPress(KeyEventContext context) {
+    int keyCode = context.getLongPressKeyCode();
+    if (context.isLongPressTimeoutTrigger()) {
+      // TODO(hsumita): confirm that we can put null as a touch event or not.
+      keyboardActionListener.onKey(
+          keyCode, Collections.singletonList(context.getTouchEvent().orNull()));
+    }
+    // Callback a function if present then flip the flag for long-press timeout.
+    // If isLongPressTimeoutTrigger is true, key-code for long-press has already been sent.
+    // If false, touch-up event for the context will send long-press key code.
+    if (context.longPressCallback.isPresent()) {
+      context.longPressCallback.get().run();
+    }
+    context.pastLongPressSentTimeout = true;
+  }
+
   public void sendPress(int keyCode) {
     keyboardActionListener.onPress(keyCode);
   }
@@ -109,7 +130,7 @@
     keyboardActionListener.onRelease(keyCode);
   }
 
-  public void sendKey(int keyCode, List<? extends TouchEvent> touchEventList) {
+  public void sendKey(int keyCode, List<TouchEvent> touchEventList) {
     keyboardActionListener.onKey(keyCode, touchEventList);
   }
 
@@ -117,9 +138,8 @@
     keyboardActionListener.onCancel();
   }
 
-  private void startDelayedKeyEventInternal(
-      int what, int keyCode, KeyEventContext context, int delay) {
-    Message message = handler.obtainMessage(what, keyCode, DUMMY_ARG, context);
+  private void startDelayedKeyEventInternal(int what, KeyEventContext context, int delay) {
+    Message message = handler.obtainMessage(what, DUMMY_ARG, DUMMY_ARG, context);
     handler.sendMessageDelayed(message, delay);
   }
 
@@ -128,16 +148,16 @@
    * based on the given {@code context}.
    */
   public void maybeStartDelayedKeyEvent(KeyEventContext context) {
-    Key key = context.key;
+    Key key = Preconditions.checkNotNull(context).key;
     if (key.isRepeatable()) {
       int keyCode = context.getPressedKeyCode();
       if (keyCode != KeyEntity.INVALID_KEY_CODE) {
-        startDelayedKeyEventInternal(REPEAT_KEY, keyCode, context, repeatKeyDelay);
+        startDelayedKeyEventInternal(REPEAT_KEY, context, repeatKeyDelay);
       }
     } else {
       int longPressKeyCode = context.getLongPressKeyCode();
       if (longPressKeyCode != KeyEntity.INVALID_KEY_CODE) {
-        startDelayedKeyEventInternal(LONG_PRESS_KEY, longPressKeyCode, context, longPressKeyDelay);
+        startDelayedKeyEventInternal(LONG_PRESS_KEY, context, longPressKeyDelay);
       }
     }
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
index bcc55e9..81e488b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
@@ -30,11 +30,13 @@
 package org.mozc.android.inputmethod.japanese.keyboard;
 
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumSet;
 import java.util.Map;
@@ -51,6 +53,7 @@
  *
  */
 public class KeyState {
+
   public enum MetaState {
     SHIFT(1, true),
     CAPS_LOCK(2, false),
@@ -76,13 +79,22 @@
     // TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS, TYPE_TEXT_VARIATION_EMAIL_ADDRESS
     VARIATION_EMAIL_ADDRESS(2048, false),
 
-    // Set if Globe button is enabled by preference.
-    // TODO(matsuzakit): Implement me.
+    // Set if Globe button should be offered.
+    // c.f., SubtypeImeSwitcher#shouldOfferSwitchingToNextInputMethod()
     GLOBE(4096, false),
+    // !GLOBE
+    NO_GLOBE(8192, false),
 
     // Set if there is composition string.
-    // TODO(matsuzakit): Implement me. This is mandatory when implementing ACTION_*.
-    COMPOSING(8192, false),
+    COMPOSING(16384, false),
+    // Set if the KeyboardView is handling at least one touch event.
+    HANDLING_TOUCH_EVENT(32768, false),
+
+    // DO NOT USE. Theoretically this is package private entry.
+    // "fallback" flag is useful when defining .xml file with logical-OR operator
+    // (e.g. "fallback|composing").
+    // This entry is used just for it.
+    FALLBACK(1073741824, false),
     ;
 
     private final int bitFlag;
@@ -116,11 +128,17 @@
     // MetaStates for text variations.
     public static final Set<MetaState> VARIATION_EXCLUSIVE_GROUP =
         Sets.immutableEnumSet(MetaState.VARIATION_URI, MetaState.VARIATION_EMAIL_ADDRESS);
+    // MetaStates for Globe icon.
+    public static final Set<MetaState> GLOBE_EXCLUSIVE_OR_GROUP =
+        Sets.immutableEnumSet(MetaState.GLOBE, MetaState.NO_GLOBE);
     @SuppressWarnings("unchecked")
     private static final Collection<Set<MetaState>> EXCLUSIVE_GROUP =
         Arrays.<Set<MetaState>>asList(CHAR_TYPE_EXCLUSIVE_GROUP,
                                       ACTION_EXCLUSIVE_GROUP,
-                                      VARIATION_EXCLUSIVE_GROUP);
+                                      VARIATION_EXCLUSIVE_GROUP,
+                                      GLOBE_EXCLUSIVE_OR_GROUP);
+    private static final Collection<Set<MetaState>> OR_GROUP =
+        Collections.singleton(GLOBE_EXCLUSIVE_OR_GROUP);
 
     /**
      * Checks if {@code testee} is valid set.
@@ -129,6 +147,8 @@
      * Do not call from chokepoint.
      */
     public static boolean isValidSet(Set<MetaState> testee) {
+      Preconditions.checkNotNull(testee);
+
       // Set#retainAll can make the implementation simpler, but it requires instantiation of
       // (Enum)Set for each iteration.
       for (Set<MetaState> exclusiveGroup : EXCLUSIVE_GROUP) {
@@ -142,6 +162,11 @@
           }
         }
       }
+      for (Set<MetaState> orGroup : OR_GROUP) {
+        if (orGroup.isEmpty()) {
+          return false;
+        }
+      }
       return true;
     }
   }
@@ -160,14 +185,13 @@
     this.contentDescription = Preconditions.checkNotNull(contentDescription);
     Preconditions.checkNotNull(metaStates);
     this.metaState = Sets.newEnumSet(metaStates, MetaState.class);
-    this.nextAddMetaStates = nextAddMetaStates;
-    this.nextRemoveMetaStates = nextRemoveMetaStates;
+    this.nextAddMetaStates = Preconditions.checkNotNull(nextAddMetaStates);
+    this.nextRemoveMetaStates = Preconditions.checkNotNull(nextRemoveMetaStates);
     this.flickMap = new EnumMap<Flick.Direction, Flick>(Flick.Direction.class);
-    for (Flick flick : flickCollection) {
-      if (this.flickMap.put(flick.getDirection(), flick) != null) {
-        throw new IllegalArgumentException(
-            "Duplicate flick direction is found: " + flick.getDirection());
-      }
+    for (Flick flick : Preconditions.checkNotNull(flickCollection)) {
+      Preconditions.checkArgument(
+          this.flickMap.put(flick.getDirection(), flick) == null,
+          "Duplicate flick direction is found: " + flick.getDirection());
     }
   }
 
@@ -188,12 +212,12 @@
    * The result is "valid" in the light of {@code MetaState#isValidSet(Set)}.
    */
   public Set<MetaState> getNextMetaStates(Set<MetaState> originalMetaStates) {
-    return Sets.union(Sets.difference(originalMetaStates,
+    return Sets.union(Sets.difference(Preconditions.checkNotNull(originalMetaStates),
                                       nextRemoveMetaStates), nextAddMetaStates).immutableCopy();
   }
 
-  public Flick getFlick(Flick.Direction direction) {
-    return flickMap.get(direction);
+  public Optional<Flick> getFlick(Flick.Direction direction) {
+    return Optional.fromNullable(flickMap.get(direction));
   }
 
   @Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
index 50c8910..b12e1d9 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
@@ -29,9 +29,18 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
+import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
+import org.mozc.android.inputmethod.japanese.resources.R;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.util.SparseIntArray;
+
 import java.util.Collections;
 import java.util.List;
 
@@ -42,6 +51,231 @@
  */
 public class Keyboard {
 
+  /**
+   * Each keyboard has its own specification.
+   *
+   * For example, some keyboards use a special Romanji table.
+   */
+  public static enum KeyboardSpecification {
+    // 12 keys.
+    TWELVE_KEY_TOGGLE_KANA(
+        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_KANA", 0, 2, 0),
+        R.xml.kbd_12keys_kana,
+        false,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.TWELVE_KEYS_TO_HIRAGANA,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        true,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    TWELVE_KEY_TOGGLE_ALPHABET(
+        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_ALPHABET", 0, 2, 0),
+        R.xml.kbd_12keys_abc,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.TWELVE_KEYS_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    TWELVE_KEY_TOGGLE_QWERTY_ALPHABET(
+        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_QWERTY_ALPHABET", 0, 5, 0),
+        R.xml.kbd_qwerty_abc,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+    // Flick mode.
+    TWELVE_KEY_FLICK_KANA(
+        new KeyboardSpecificationName("TWELVE_KEY_FLICK_KANA", 0, 2, 0),
+        R.xml.kbd_12keys_flick_kana,
+        false,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.FLICK_TO_HIRAGANA,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        true,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    TWELVE_KEY_FLICK_ALPHABET(
+        new KeyboardSpecificationName("TWELVE_KEY_FLICK_ALPHABET", 0, 2, 0),
+        R.xml.kbd_12keys_flick_abc,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.FLICK_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+    TWELVE_KEY_TOGGLE_FLICK_KANA(
+        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_KANA", 0, 2, 0),
+        R.xml.kbd_12keys_flick_kana,
+        false,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.TOGGLE_FLICK_TO_HIRAGANA,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        true,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    TWELVE_KEY_TOGGLE_FLICK_ALPHABET(
+        new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 2, 0),
+        R.xml.kbd_12keys_flick_abc,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.TOGGLE_FLICK_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    // QWERTY keyboard.
+    QWERTY_KANA(
+        new KeyboardSpecificationName("QWERTY_KANA", 0, 4, 0),
+        R.xml.kbd_qwerty_kana,
+        false,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    QWERTY_ALPHABET(
+        new KeyboardSpecificationName("QWERTY_ALPHABET", 0, 5, 0),
+        R.xml.kbd_qwerty_abc,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+    QWERTY_ALPHABET_NUMBER(
+        new KeyboardSpecificationName("QWERTY_ALPHABET_NUMBER", 0, 3, 0),
+        R.xml.kbd_qwerty_abc_123,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+    // Godan keyboard.
+    GODAN_KANA(
+        new KeyboardSpecificationName("GODAN_KANA", 0, 2, 0),
+        R.xml.kbd_godan_kana,
+        false,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.GODAN_TO_HIRAGANA,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        true,
+        CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+    NUMBER(
+        new KeyboardSpecificationName("NUMBER", 0, 1, 0),
+        R.xml.kbd_123,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    // Number keyboard on symbol input view.
+    SYMBOL_NUMBER(
+        new KeyboardSpecificationName("TWELVE_KEY_SYMBOL_NUMBER", 0, 1, 0),
+        R.xml.kbd_symbol_123,
+        false,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    // HARDWARE QWERTY keyboard.
+    HARDWARE_QWERTY_KANA(
+        new KeyboardSpecificationName("HARDWARE_QWERTY_KANA", 0, 1, 0),
+        0,
+        true,
+        CompositionMode.HIRAGANA,
+        SpecialRomanjiTable.DEFAULT_TABLE,
+        SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    HARDWARE_QWERTY_ALPHABET(
+        new KeyboardSpecificationName("HARDWARE_QWERTY_ALPHABET", 0, 1, 0),
+        0,
+        true,
+        CompositionMode.HALF_ASCII,
+        SpecialRomanjiTable.DEFAULT_TABLE,
+        SpaceOnAlphanumeric.COMMIT,
+        false,
+        CrossingEdgeBehavior.DO_NOTHING),
+
+    ;
+
+    private final KeyboardSpecificationName specName;
+    private final int resourceId;
+    private final boolean isHardwareKeyboard;
+    private final CompositionMode compositionMode;
+    private final SpecialRomanjiTable specialRomanjiTable;
+    private final SpaceOnAlphanumeric spaceOnAlphanumeric;
+    private final boolean kanaModifierInsensitiveConversion;
+    private final CrossingEdgeBehavior crossingEdgeBehavior;
+
+    private KeyboardSpecification(
+        KeyboardSpecificationName specName,
+        int resourceId,
+        boolean isHardwareKeyboard,
+        CompositionMode compositionMode,
+        SpecialRomanjiTable specialRomanjiTable,
+        SpaceOnAlphanumeric spaceOnAlphanumeric,
+        boolean kanaModifierInsensitiveConversion,
+        CrossingEdgeBehavior crossingEdgeBehavior) {
+      this.specName = Preconditions.checkNotNull(specName);
+      this.resourceId = resourceId;
+      this.isHardwareKeyboard = isHardwareKeyboard;
+      this.compositionMode = Preconditions.checkNotNull(compositionMode);
+      this.specialRomanjiTable = Preconditions.checkNotNull(specialRomanjiTable);
+      this.spaceOnAlphanumeric = Preconditions.checkNotNull(spaceOnAlphanumeric);
+      this.kanaModifierInsensitiveConversion = kanaModifierInsensitiveConversion;
+      this.crossingEdgeBehavior = Preconditions.checkNotNull(crossingEdgeBehavior);
+    }
+
+    public int getXmlLayoutResourceId() {
+      return resourceId;
+    }
+
+    public CompositionMode getCompositionMode() {
+      return compositionMode;
+    }
+
+    public KeyboardSpecificationName getKeyboardSpecificationName() {
+      return specName;
+    }
+
+    public SpecialRomanjiTable getSpecialRomanjiTable() {
+      return specialRomanjiTable;
+    }
+
+    public SpaceOnAlphanumeric getSpaceOnAlphanumeric() {
+      return spaceOnAlphanumeric;
+    }
+
+    public boolean isKanaModifierInsensitiveConversion() {
+      return kanaModifierInsensitiveConversion;
+    }
+
+    public CrossingEdgeBehavior getCrossingEdgeBehavior() {
+      return crossingEdgeBehavior;
+    }
+
+    public boolean isHardwareKeyboard() {
+      return isHardwareKeyboard;
+    }
+  }
+
   private final Optional<String> contentDescription;
   private final float flickThreshold;
   private final List<Row> rowList;
@@ -50,9 +284,12 @@
   public final int contentRight;
   public final int contentTop;
   public final int contentBottom;
+  protected final KeyboardSpecification specification;
+  private Optional<SparseIntArray> sourceIdToKeyCode = Optional.absent();
 
   public Keyboard(Optional<String> contentDescription,
-                  List<? extends Row> rowList, float flickThreshold) {
+                  List<? extends Row> rowList, float flickThreshold,
+                  KeyboardSpecification specification) {
     this.contentDescription = Preconditions.checkNotNull(contentDescription);
     this.flickThreshold = flickThreshold;
     this.rowList = Collections.unmodifiableList(rowList);
@@ -71,6 +308,7 @@
     this.contentRight = right;
     this.contentTop = top;
     this.contentBottom = bottom;
+    this.specification = Preconditions.checkNotNull(specification);
   }
 
   public Optional<String> getContentDescription() {
@@ -84,4 +322,39 @@
   public List<Row> getRowList() {
     return rowList;
   }
+
+  public KeyboardSpecification getSpecification() {
+    return specification;
+  }
+
+  /**
+   * Returns keyCode from {@code souceId}.
+   *
+   * <p>If not found, {@code Integer.MIN_VALUE} is returned.
+   */
+  public int getKeyCode(int sourceId) {
+    ensureSourceIdToKeyCode();
+    return sourceIdToKeyCode.get().get(sourceId, Integer.MIN_VALUE);
+  }
+
+  private void ensureSourceIdToKeyCode() {
+    if (sourceIdToKeyCode.isPresent()) {
+      return;
+    }
+    SparseIntArray result = new SparseIntArray();
+    for (Row row : getRowList()) {
+      for (Key key : row.getKeyList()) {
+        for (KeyState keyState : key.getKeyStates()) {
+          for (Direction direction : Direction.values()) {
+            Optional<Flick> flick = keyState.getFlick(direction);
+            if (flick.isPresent()) {
+              KeyEntity keyEntity = flick.get().getKeyEntity();
+              result.put(keyEntity.getSourceId(), keyEntity.getKeyCode());
+            }
+          }
+        }
+      }
+    }
+    sourceIdToKeyCode = Optional.of(result);
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
index bdc8a5c..51ee9e3 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
@@ -35,11 +35,11 @@
 
 /**
  * A listener of keyboard actions.
- * 
+ *
  */
 public interface KeyboardActionListener {
   public void onCancel();
   public void onPress(int keycode);
   public void onRelease(int keycode);
-  public void onKey(int primaryCode, List<? extends TouchEvent> touchEventList);
+  public void onKey(int primaryCode, List<TouchEvent> touchEventList);
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java
new file mode 100644
index 0000000..3f38a5f
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java
@@ -0,0 +1,152 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.util.LeastRecentlyUsedCacheMap;
+import com.google.common.base.Optional;
+
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Factory of the keyboard data based on xml.
+ *
+ */
+public class KeyboardFactory {
+
+  /**
+   * Key for the cache map of keyboard.
+   *
+   * Currently the keyboard is depending on its specification and display's size.
+   */
+  private static class CacheKey {
+    private final KeyboardSpecification specification;
+    private final int width;
+    private final int height;
+
+    CacheKey(KeyboardSpecification specification, int width, int height) {
+      this.specification = specification;
+      this.width = width;
+      this.height = height;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj instanceof CacheKey) {
+        CacheKey other = CacheKey.class.cast(obj);
+        return specification == other.specification &&
+               width == other.width &&
+               height == other.height;
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return (specification.hashCode() * 31 ^ width) * 31 ^ height;
+    }
+  }
+
+  /**
+   * The max size of cached keyboards. This is based on the max number of keyboard variation
+   * for a configuration.
+   */
+  private static final int CACHE_SIZE = 6;
+
+  private final Map<CacheKey, Keyboard> cache =
+      new LeastRecentlyUsedCacheMap<CacheKey, Keyboard>(CACHE_SIZE);
+
+  /**
+   * @return JapaneseKeyboard instance based on given resources and specification.
+   *         If it is already parsed, just returns cached one. Otherwise, tries to parse
+   *         corresponding xml data, then caches and returns it.
+   *         Returns {@code null} if parsing is failed.
+   * @throws NullPointerException if given {@code resources} or {@code specification} is
+   *         {@code null}.
+   */
+  public Keyboard get(Resources resources, KeyboardSpecification specification,
+                      int keyboardWidth, int keyboardHeight) {
+    if (resources == null) {
+      throw new NullPointerException("resources is null.");
+    }
+    if (specification == null) {
+      throw new NullPointerException("specification is null.");
+    }
+
+    CacheKey cacheKey =
+        new CacheKey(specification, keyboardWidth, keyboardHeight);
+
+    // First, look up from the cache.
+    Keyboard keyboard = cache.get(cacheKey);
+    if (keyboard == null) {
+      // If not found, parse keyboard from a xml resource file. The result will be cached in
+      // the cache map.
+      keyboard = parseKeyboard(resources, specification, keyboardWidth, keyboardHeight);
+      if (keyboard != null) {
+        cache.put(cacheKey, keyboard);
+      }
+    }
+    return keyboard;
+  }
+
+  private static Keyboard parseKeyboard(
+      Resources resources, KeyboardSpecification specification,
+      int keyboardWidth, int keyboardHeight) {
+    KeyboardParser parser = new KeyboardParser(
+        resources, keyboardWidth, keyboardHeight, specification);
+    try {
+      return parser.parseKeyboard();
+    } catch (NotFoundException e) {
+      MozcLog.e(e.getMessage());
+    } catch (XmlPullParserException e) {
+      MozcLog.e(e.getMessage());
+    } catch (IOException e) {
+      MozcLog.e(e.getMessage());
+    }
+    // Returns dummy keyboard to avoid crash.
+    return new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0,
+                        KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+  }
+
+  /**
+   * Clears cached keyboards.
+   */
+  public void clear() {
+    cache.clear();
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
index 80ac180..cd4c57e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
@@ -31,7 +31,9 @@
 
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -59,35 +61,172 @@
 public class KeyboardParser {
 
   /** Attributes for the key dimensions. */
-  private static class KeyAttributes {
+  @VisibleForTesting static class KeyAttributes {
+
+    @VisibleForTesting static class Builder {
+
+      private int width;
+      private int height;
+      private int horizontalLayoutWeight;
+      private int horizontalGap;
+      private int verticalGap;
+      private int defaultIconWidth;
+      private int defaultIconHeight;
+      private int defaultHorizontalPadding;
+      private int defaultVerticalPadding;
+      private DrawableType keyBackgroundDrawableType =
+          DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND;
+      private int edgeFlags;
+      private boolean isRepeatable;
+      private boolean isModifier;
+      private Stick stick = Stick.EVEN;
+      private List<KeyState> keyStateList = Collections.<KeyState>emptyList();
+
+      Builder setWidth(int width) {
+        this.width = width;
+        return this;
+      }
+      Builder setHeight(int height) {
+        this.height = height;
+        return this;
+      }
+      Builder setHorizontalLayoutWeight(int horizontalLayoutWeight) {
+        this.horizontalLayoutWeight = horizontalLayoutWeight;
+        return this;
+      }
+      Builder setHorizontalGap(int horizontalGap) {
+        this.horizontalGap = horizontalGap;
+        return this;
+      }
+      Builder setVerticalGap(int verticalGap) {
+        this.verticalGap = verticalGap;
+        return this;
+      }
+      Builder setDefaultIconWidth(int defaultIconWidth) {
+        this.defaultIconWidth = defaultIconWidth;
+        return this;
+      }
+      Builder setDefaultIconHeight(int defaultIconHeight) {
+        this.defaultIconHeight = defaultIconHeight;
+        return this;
+      }
+      Builder setDefaultHorizontalPadding(int defaultHorizontalPadding) {
+        this.defaultHorizontalPadding = defaultHorizontalPadding;
+        return this;
+      }
+      Builder setDefaultVerticalPadding(int defaultVerticalPadding) {
+        this.defaultVerticalPadding = defaultVerticalPadding;
+        return this;
+      }
+      Builder setKeybackgroundDrawableType(DrawableType type) {
+        this.keyBackgroundDrawableType = Preconditions.checkNotNull(type);
+        return this;
+      }
+      Builder setEdgeFlags(int edgeFlags) {
+        this.edgeFlags = edgeFlags;
+        return this;
+      }
+      Builder setRepeatable(boolean isRepeatable) {
+        this.isRepeatable = isRepeatable;
+        return this;
+      }
+      Builder setModifier(boolean isModifier) {
+        this.isModifier = isModifier;
+        return this;
+      }
+      Builder setStick(Stick stick) {
+        this.stick = Preconditions.checkNotNull(stick);
+        return this;
+      }
+      Builder setKeyStateList(List<KeyState> keyStateList) {
+        this.keyStateList = Preconditions.checkNotNull(keyStateList);
+        return this;
+      }
+      KeyAttributes build() {
+        return new KeyAttributes(this);
+      }
+    }
+
     final int width;
     final int height;
+    final int horizontalLayoutWeight;
     final int horizontalGap;
     final int verticalGap;
-    DrawableType keyBackgroundDrawableType;
+    final int defaultIconWidth;
+    final int defaultIconHeight;
+    final int defaultHorizontalPadding;
+    final int defaultVerticalPadding;
+    final DrawableType keyBackgroundDrawableType;
+    final int edgeFlags;
+    final boolean isRepeatable;
+    final boolean isModifier;
+    final Stick stick;
+    final List<KeyState> keyStateList;
 
-    KeyAttributes(int width, int height, int horizontalGap, int verticalGap,
-                 DrawableType keyBackgroundDrawableType) {
-      this.width = width;
-      this.height = height;
-      this.horizontalGap = horizontalGap;
-      this.verticalGap = verticalGap;
-      this.keyBackgroundDrawableType = keyBackgroundDrawableType;
+    private KeyAttributes(Builder builder) {
+      this.width = builder.width;
+      this.height = builder.height;
+      this.horizontalLayoutWeight = builder.horizontalLayoutWeight;
+      this.horizontalGap = builder.horizontalGap;
+      this.verticalGap = builder.verticalGap;
+      this.defaultIconWidth = builder.defaultIconWidth;
+      this.defaultIconHeight = builder.defaultIconHeight;
+      this.defaultHorizontalPadding = builder.defaultHorizontalPadding;
+      this.defaultVerticalPadding = builder.defaultVerticalPadding;
+      this.keyBackgroundDrawableType =
+          Preconditions.checkNotNull(builder.keyBackgroundDrawableType);
+      this.edgeFlags = builder.edgeFlags;
+      this.isRepeatable = builder.isRepeatable;
+      this.isModifier = builder.isModifier;
+      this.stick = builder.stick;
+      this.keyStateList = builder.keyStateList;
+    }
+
+    static Builder newBuilder() {
+      return new Builder();
+    }
+
+    Builder toBuilder() {
+      return newBuilder()
+          .setWidth(width)
+          .setHeight(height)
+          .setHorizontalLayoutWeight(horizontalLayoutWeight)
+          .setHorizontalGap(horizontalGap)
+          .setVerticalGap(verticalGap)
+          .setDefaultHorizontalPadding(defaultHorizontalPadding)
+          .setDefaultVerticalPadding(defaultVerticalPadding)
+          .setDefaultIconWidth(defaultIconWidth)
+          .setDefaultIconHeight(defaultIconHeight)
+          .setKeybackgroundDrawableType(keyBackgroundDrawableType)
+          .setEdgeFlags(edgeFlags)
+          .setRepeatable(isRepeatable)
+          .setModifier(isModifier)
+          .setStick(stick)
+          .setKeyStateList(keyStateList);
+    }
+
+    Key buildKey(int x, int y, int width) {
+      return new Key(x, y, width, height, horizontalGap, edgeFlags,
+          isRepeatable, isModifier, stick, keyBackgroundDrawableType, keyStateList);
     }
   }
 
   /** Attributes for the popup dimensions. */
   private static class PopUpAttributes {
-    final int popUpWidth;
+
     final int popUpHeight;
     final int popUpXOffset;
     final int popUpYOffset;
+    final int popUpIconWidth;
+    final int popUpIconHeight;
 
-    PopUpAttributes(int popUpWidth, int popUpHeight, int popUpXOffset, int popUpYOffset) {
-      this.popUpWidth = popUpWidth;
+    PopUpAttributes(int popUpHeight, int popUpXOffset, int popUpYOffset,
+                    int popUpIconWidth, int popUpIconHeight) {
       this.popUpHeight = popUpHeight;
       this.popUpXOffset = popUpXOffset;
       this.popUpYOffset = popUpYOffset;
+      this.popUpIconWidth = popUpIconWidth;
+      this.popUpIconHeight = popUpIconHeight;
     }
   }
 
@@ -115,16 +254,47 @@
   private static final int ROW_ROW_EDGE_FLAGS_INDEX =
       Arrays.binarySearch(ROW_ATTRIBUTES, R.attr.rowEdgeFlags);
 
+  private static final int[] POPUP_ATTRIBUTES = {
+    R.attr.popUpIcon,
+    R.attr.popUpLongPressIcon,
+    R.attr.popUpHeight,
+    R.attr.popUpXOffset,
+    R.attr.popUpYOffset,
+    R.attr.popUpIconWidth,
+    R.attr.popUpIconHeight,
+  };
+  static {
+    Arrays.sort(POPUP_ATTRIBUTES);
+  }
+  private static final int POPUP_KEY_ICON_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIcon);
+  private static final int POPUP_KEY_LONG_PRESS_ICON_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpLongPressIcon);
+  private static final int POPUP_KEY_HEIGHT_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpHeight);
+  private static final int POPUP_KEY_X_OFFSET_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpXOffset);
+  private static final int POPUP_KEY_Y_OFFSET_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpYOffset);
+  private static final int POPUP_KEY_ICON_WIDTH_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIconWidth);
+  private static final int POPUP_KEY_ICON_HEIGHT_INDEX =
+      Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIconHeight);
+
   /** Attributes for a {@code <Key>} element. */
   private static final int[] KEY_ATTRIBUTES = {
     R.attr.keyWidth,
     R.attr.keyHeight,
+    R.attr.keyHorizontalLayoutWeight,
     R.attr.horizontalGap,
+    R.attr.defaultIconWidth,
+    R.attr.defaultIconHeight,
+    R.attr.defaultHorizontalPadding,
+    R.attr.defaultVerticalPadding,
     R.attr.keyBackground,
     R.attr.keyEdgeFlags,
     R.attr.isRepeatable,
     R.attr.isModifier,
-    R.attr.isSticky,
   };
   static {
     Arrays.sort(KEY_ATTRIBUTES);
@@ -133,8 +303,18 @@
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyWidth);
   private static final int KEY_KEY_HEIGHT_INDEX =
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyHeight);
+  private static final int KEY_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX =
+      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyHorizontalLayoutWeight);
   private static final int KEY_HORIZONTAL_GAP_INDEX =
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.horizontalGap);
+  private static final int KEY_DEFAULT_ICON_WIDTH_INDEX =
+      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultIconWidth);
+  private static final int KEY_DEFAULT_ICON_HEIGHT_INDEX =
+      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultIconHeight);
+  private static final int KEY_DEFAULT_HORIZONTAL_PADDING_INDEX =
+      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultHorizontalPadding);
+  private static final int KEY_DEFAULT_VERTICAL_PADDING_INDEX =
+      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultVerticalPadding);
   private static final int KEY_KEY_BACKGROUND_INDEX =
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyBackground);
   private static final int KEY_KEY_EDGE_FLAGS_INDEX =
@@ -143,32 +323,35 @@
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isRepeatable);
   private static final int KEY_IS_MODIFIER_INDEX =
       Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isModifier);
-  private static final int KEY_IS_STICKY_INDEX =
-      Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isSticky);
 
   /** Attributes for a {@code <Spacer>} element. */
   private static final int[] SPACER_ATTRIBUTES = {
+    R.attr.keyWidth,
     R.attr.keyHeight,
-    R.attr.horizontalGap,
+    R.attr.keyHorizontalLayoutWeight,
     R.attr.keyEdgeFlags,
     R.attr.stick,
+    R.attr.keyBackground,
   };
   static {
     Arrays.sort(SPACER_ATTRIBUTES);
   }
+  private static final int SPACER_KEY_WIDTH_INDEX =
+      Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyWidth);
   private static final int SPACER_KEY_HEIGHT_INDEX =
       Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyHeight);
-  private static final int SPACER_HORIZONTAL_GAP_INDEX =
-      Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.horizontalGap);
+  private static final int SPACER_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX =
+      Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyHorizontalLayoutWeight);
   private static final int SPACER_KEY_EDGE_FLAGS_INDEX =
       Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyEdgeFlags);
   private static final int SPACER_STICK_INDEX =
       Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.stick);
+  private static final int SPACER_KEY_BACKGROUND_INDEX =
+      Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyBackground);
 
   /** Attributes for a {@code <KeyState>} element. */
   private static final int[] KEY_STATE_ATTRIBUTES = {
     R.attr.contentDescription,
-    R.attr.keyBackground,
     R.attr.metaState,
     R.attr.nextMetaState,
     R.attr.nextRemovedMetaStates,
@@ -178,8 +361,6 @@
   }
   private static final int KEY_STATE_CONTENT_DESCRIPTION_INDEX =
       Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.contentDescription);
-  private static final int KEY_STATE_KEY_BACKGROUND_INDEX =
-      Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.keyBackground);
   private static final int KEY_STATE_META_STATE_INDEX =
       Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.metaState);
   private static final int KEY_STATE_NEXT_META_STATE_INDEX =
@@ -192,9 +373,14 @@
     R.attr.sourceId,
     R.attr.keyCode,
     R.attr.longPressKeyCode,
+    R.attr.longPressTimeoutTrigger,
     R.attr.keyIcon,
     R.attr.keyCharacter,
     R.attr.flickHighlight,
+    R.attr.horizontalPadding,
+    R.attr.verticalPadding,
+    R.attr.iconWidth,
+    R.attr.iconHeight,
   };
   static {
     Arrays.sort(KEY_ENTITY_ATTRIBUTES);
@@ -205,12 +391,22 @@
       Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyCode);
   private static final int KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX =
       Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.longPressKeyCode);
+  private static final int KEY_ENTITY_LONG_PRESS_TIMEOUT_TRIGGER_INDEX =
+      Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.longPressTimeoutTrigger);
   private static final int KEY_ENTITY_KEY_ICON_INDEX =
       Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyIcon);
   private static final int KEY_ENTITY_KEY_CHAR_INDEX =
       Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyCharacter);
   private static final int KEY_ENTITY_FLICK_HIGHLIGHT_INDEX =
       Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.flickHighlight);
+  private static final int KEY_ENTITY_HORIZONTAL_PADDING_INDEX =
+      Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.horizontalPadding);
+  private static final int KEY_ENTITY_VERTICAL_PADDING_INDEX =
+      Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.verticalPadding);
+  private static final int KEY_ENTITY_ICON_WIDTH_INDEX =
+      Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.iconWidth);
+  private static final int KEY_ENTITY_ICON_HEIGHT_INDEX =
+      Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.iconHeight);
 
   /**
    * Mapping table from enum value in xml to DrawableType by using the enum value as index.
@@ -222,30 +418,33 @@
     DrawableType.QWERTY_REGULAR_KEY_BACKGROUND,
     DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND,
     DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS,
-    DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
-    DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
+    DrawableType.QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS,
+    DrawableType.KEYBOARD_SEPARATOR_TOP,
+    DrawableType.KEYBOARD_SEPARATOR_CENTER,
+    DrawableType.KEYBOARD_SEPARATOR_BOTTOM,
+    DrawableType.TRNASPARENT,
   };
 
   /**
    * @return "sourceId" assigned to {@code value}.
    */
-  static int getSourceId(TypedValue value, @SuppressWarnings("unused") int defaultValue) {
-    if (value == null ||
-        (value.type != TypedValue.TYPE_INT_DEC &&
-         value.type != TypedValue.TYPE_INT_HEX)) {
-      throw new IllegalArgumentException("sourceId is mandatory for KeyEntity.");
-    }
+  private static int getSourceId(TypedValue value, @SuppressWarnings("unused") int defaultValue) {
+    Preconditions.checkNotNull(value);
+    Preconditions.checkArgument(
+        value.type == TypedValue.TYPE_INT_DEC || value.type == TypedValue.TYPE_INT_HEX,
+        "sourceId is mandatory for KeyEntity.");
     return value.data;
   }
 
   /**
    * @return the pixel offsets based on metrics and base
    */
-  static int getDimensionOrFraction(
-      TypedValue value, int base, int defaultValue, DisplayMetrics metrics) {
-    if (value == null) {
+  @VisibleForTesting static int getDimensionOrFraction(
+      Optional<TypedValue> optionalValue, int base, int defaultValue, DisplayMetrics metrics) {
+    if (!optionalValue.isPresent()) {
       return defaultValue;
     }
+    TypedValue value = optionalValue.get();
 
     switch (value.type) {
       case TypedValue.TYPE_DIMENSION:
@@ -258,13 +457,29 @@
                                        "  value = " + value.toString());
   }
 
+  @VisibleForTesting static int getFraction(
+      Optional<TypedValue> optionalValue, int base, int defaultValue) {
+    if (!optionalValue.isPresent()) {
+      return defaultValue;
+    }
+    TypedValue value = optionalValue.get();
+
+    if (value.type == TypedValue.TYPE_FRACTION) {
+      return Math.round(TypedValue.complexToFraction(value.data, base, base));
+    }
+
+    throw new IllegalArgumentException(
+        "The type fraction is required.  value = " + value.toString());
+  }
+
   /**
    * @return "codes" assigned to {@code value}
    */
-  static int getCode(TypedValue value, int defaultValue) {
-    if (value == null) {
+  @VisibleForTesting static int getCode(Optional<TypedValue> optionalValue, int defaultValue) {
+    if (!optionalValue.isPresent()) {
       return defaultValue;
     }
+    TypedValue value = optionalValue.get();
 
     if (value.type == TypedValue.TYPE_INT_DEC ||
         value.type == TypedValue.TYPE_INT_HEX) {
@@ -277,20 +492,6 @@
     return defaultValue;
   }
 
-  /**
-   * A simple wrapper of {@link CharSequence#toString()}, in order to avoid
-   * {@code NullPointerException}.
-   * @param sequence input character sequence
-   * @return {@code sequence.toString()} if {@code sequence} is not {@code null}.
-   *         Otherwise, {@code null}.
-   */
-  static String toStringOrNull(CharSequence sequence) {
-    if (sequence == null) {
-      return null;
-    }
-    return sequence.toString();
-  }
-
   private static void ignoreWhiteSpaceAndComment(XmlPullParser parser)
       throws XmlPullParserException, IOException {
     int event = parser.getEventType();
@@ -302,8 +503,8 @@
   private static void assertStartDocument(XmlPullParser parser) throws XmlPullParserException {
     if (parser.getEventType() != XmlPullParser.START_DOCUMENT) {
       throw new IllegalArgumentException(
-          "The start of document is expected, but actually not: " +
-          parser.getPositionDescription());
+          "The start of document is expected, but actually not: "
+              + parser.getPositionDescription());
     }
   }
 
@@ -325,8 +526,8 @@
     String actualName = parser.getName();
     if (!actualName.equals(expectedName)) {
       throw new IllegalArgumentException(
-          "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: " +
-          parser.getPositionDescription());
+          "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: "
+              + parser.getPositionDescription());
     }
   }
 
@@ -353,20 +554,16 @@
   private final Set<Integer> sourceIdSet = new HashSet<Integer>();
   private final int keyboardWidth;
   private final int keyboardHeight;
+  private final KeyboardSpecification specification;
 
-  public KeyboardParser(Resources resources, XmlResourceParser xmlResourceParser,
-                        int keyboardWidth, int keyboardHeight) {
-    if (resources == null) {
-      throw new NullPointerException("resources shouldn't be null.");
-    }
-    if (xmlResourceParser == null) {
-      throw new NullPointerException("xmlResourceParser shouldn't be null.");
-    }
-
-    this.resources = resources;
-    this.xmlResourceParser = xmlResourceParser;
+  public KeyboardParser(Resources resources,
+                        int keyboardWidth, int keyboardHeight,
+                        KeyboardSpecification specification) {
+    this.resources = Preconditions.checkNotNull(resources);
     this.keyboardWidth = keyboardWidth;
     this.keyboardHeight = keyboardHeight;
+    this.specification = Preconditions.checkNotNull(specification);
+    this.xmlResourceParser = resources.getXml(specification.getXmlLayoutResourceId());
   }
 
   /**
@@ -427,23 +624,38 @@
         // The default keyWidth is 10% of the display for width, and 50px for height.
         keyAttributes = parseKeyAttributes(
             attributes,
-            new KeyAttributes(keyboardWidth / 10, 50, 0, 0, null),
+            KeyAttributes.newBuilder()
+                .setWidth(keyboardWidth / 10)
+                .setHeight(50)
+                .setKeybackgroundDrawableType(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND)
+                .setDefaultIconWidth(keyboardWidth)
+                .setDefaultIconHeight(keyboardHeight)
+                .setDefaultHorizontalPadding(0)
+                .setDefaultVerticalPadding(0)
+                .build(),
             metrics,
             this.keyboardWidth,
             this.keyboardHeight,
             R.styleable.Keyboard_keyWidth,
             R.styleable.Keyboard_keyHeight,
+            R.styleable.Keyboard_keyHorizontalLayoutWeight,
             R.styleable.Keyboard_horizontalGap,
             R.styleable.Keyboard_verticalGap,
+            R.styleable.Keyboard_defaultIconWidth,
+            R.styleable.Keyboard_defaultIconHeight,
+            R.styleable.Keyboard_defaultHorizontalPadding,
+            R.styleable.Keyboard_defaultVerticalPadding,
             R.styleable.Keyboard_keyBackground);
         popUpAttributes = parsePopUpAttributes(
             attributes,
+            new PopUpAttributes(0, 0, 0, 0, 0),
             metrics,
             this.keyboardWidth,
-            R.styleable.Keyboard_popUpWidth,
             R.styleable.Keyboard_popUpHeight,
             R.styleable.Keyboard_popUpXOffset,
-            R.styleable.Keyboard_popUpYOffset);
+            R.styleable.Keyboard_popUpYOffset,
+            R.styleable.Keyboard_popUpIconWidth,
+            R.styleable.Keyboard_popUpIconHeight);
         flickThreshold = parseFlickThreshold(
             attributes, R.styleable.Keyboard_flickThreshold);
         contentDescription = Optional.fromNullable(
@@ -473,7 +685,36 @@
     ignoreWhiteSpaceAndComment(parser);
     assertEndDocument(parser);
 
-    return buildKeyboard(contentDescription, rowList, flickThreshold);
+    return new Keyboard(Preconditions.checkNotNull(contentDescription),
+        Preconditions.checkNotNull(rowList), flickThreshold, specification);
+  }
+
+  @VisibleForTesting
+  static List<Key> buildKeyList(List<KeyAttributes> keyAttributesList,
+                                        int y, int rowWidth) {
+    float remainingWidthByWeight = rowWidth;
+    int remainingWeight = 0;
+    for (KeyAttributes attributes : keyAttributesList) {
+      remainingWidthByWeight -= attributes.width;
+      remainingWeight += attributes.horizontalLayoutWeight;
+    }
+
+    List<Key> keyList = new ArrayList<Key>(keyAttributesList.size());
+    float exactX = 0;
+    for (KeyAttributes attributes : keyAttributesList) {
+      int weight = attributes.horizontalLayoutWeight;
+      Preconditions.checkState(remainingWeight >= weight);
+      float widthByWeight = weight > 0 ? remainingWidthByWeight * weight / remainingWeight : 0;
+      remainingWidthByWeight -= widthByWeight;
+      remainingWeight -= weight;
+      int x = Math.round(exactX);
+      Key key =
+          attributes.buildKey(x, y, Math.round(exactX + widthByWeight + attributes.width) - x);
+      keyList.add(key);
+      exactX += widthByWeight + attributes.width;
+    }
+    Preconditions.checkState(remainingWeight == 0);
+    return keyList;
   }
 
   /**
@@ -494,10 +735,10 @@
       TypedArray attributes = resources.obtainAttributes(parser, ROW_ATTRIBUTES);
       try {
         verticalGap = getDimensionOrFraction(
-            attributes.peekValue(ROW_VERTICAL_GAP_INDEX),
+            Optional.fromNullable(attributes.peekValue(ROW_VERTICAL_GAP_INDEX)),
             keyboardHeight, defaultKeyAttributes.verticalGap, metrics);
         rowHeight = getDimensionOrFraction(
-            attributes.peekValue(ROW_KEY_HEIGHT_INDEX), keyboardHeight,
+            Optional.fromNullable(attributes.peekValue(ROW_KEY_HEIGHT_INDEX)), keyboardHeight,
             defaultKeyAttributes.height, metrics);
         edgeFlags = attributes.getInt(ROW_ROW_EDGE_FLAGS_INDEX, 0);
       } finally {
@@ -505,8 +746,7 @@
       }
     }
 
-    List<Key> keyList = new ArrayList<Key>();
-    int x = 0;
+    List<KeyAttributes> keyAttributesList = new ArrayList<KeyAttributes>(16);  // 16 is heuristic
     while (true) {
       parser.next();
       ignoreWhiteSpaceAndComment(parser);
@@ -515,25 +755,22 @@
         break;
       }
       if ("Key".equals(parser.getName())) {
-        Key key = parseKey(x, y, edgeFlags, defaultKeyAttributes, popUpAttributes);
-        keyList.add(key);
-        x += key.getWidth();
+        keyAttributesList.add(parseKey(edgeFlags, defaultKeyAttributes, popUpAttributes));
       } else if ("Spacer".equals(parser.getName())) {
-        Key key = parseSpacer(x, y, edgeFlags, defaultKeyAttributes);
-        keyList.add(key);
-        x += key.getWidth();
+        keyAttributesList.add(parseSpacer(edgeFlags, defaultKeyAttributes));
       }
     }
 
     assertEndTag(parser, "Row");
+    List<Key> keyList = buildKeyList(keyAttributesList, y, keyboardWidth);
     return buildRow(keyList, rowHeight, verticalGap);
   }
 
   /**
    * Parses a {@code Key} element, and returns an instance.
    */
-  private Key parseKey(int x, int y, int edgeFlags,
-                       KeyAttributes defaultKeyAttributes, PopUpAttributes popUpAttributes)
+  private KeyAttributes parseKey(int edgeFlags, KeyAttributes defaultKeyAttributes,
+                                 PopUpAttributes popUpAttributes)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     assertStartTag(parser, "Key");
@@ -541,19 +778,20 @@
     KeyAttributes keyAttributes;
     boolean isRepeatable;
     boolean isModifier;
-    boolean isSticky;
+    DisplayMetrics metrics = resources.getDisplayMetrics();
     {
       TypedArray attributes = resources.obtainAttributes(parser, KEY_ATTRIBUTES);
       try {
-        DisplayMetrics metrics = resources.getDisplayMetrics();
         keyAttributes = parseKeyAttributes(
             attributes, defaultKeyAttributes, metrics, keyboardWidth, keyboardHeight,
-            KEY_KEY_WIDTH_INDEX, KEY_KEY_HEIGHT_INDEX, KEY_HORIZONTAL_GAP_INDEX, -1,
+            KEY_KEY_WIDTH_INDEX, KEY_KEY_HEIGHT_INDEX, KEY_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX,
+            KEY_HORIZONTAL_GAP_INDEX, -1,
+            KEY_DEFAULT_ICON_WIDTH_INDEX, KEY_DEFAULT_ICON_HEIGHT_INDEX,
+            KEY_DEFAULT_HORIZONTAL_PADDING_INDEX, KEY_DEFAULT_VERTICAL_PADDING_INDEX,
             KEY_KEY_BACKGROUND_INDEX);
         edgeFlags |= attributes.getInt(KEY_KEY_EDGE_FLAGS_INDEX, 0);
         isRepeatable = attributes.getBoolean(KEY_IS_REPEATABLE_INDEX, false);
         isModifier = attributes.getBoolean(KEY_IS_MODIFIER_INDEX, false);
-        isSticky = attributes.getBoolean(KEY_IS_STICKY_INDEX, false);
       } finally {
         attributes.recycle();
       }
@@ -568,18 +806,19 @@
         break;
       }
 
-      keyStateList.add(
-          parseKeyState(keyAttributes.keyBackgroundDrawableType, popUpAttributes));
+      keyStateList.add(parseKeyState(keyAttributes, popUpAttributes, metrics));
     }
 
     // At the moment, we just accept keys which has default state.
     boolean hasDefault = false;
     boolean hasLongPressKeyCode = false;
     for (KeyState keyState : keyStateList) {
-      if (keyState.getMetaStateSet().isEmpty()) {
+      if (keyState.getMetaStateSet().isEmpty()
+          || keyState.getMetaStateSet().contains(KeyState.MetaState.FALLBACK)) {
         hasDefault = true;
-        if (keyState.getFlick(Flick.Direction.CENTER).getKeyEntity().getLongPressKeyCode() !=
-            KeyEntity.INVALID_KEY_CODE) {
+        Optional<Flick> flick = keyState.getFlick(Flick.Direction.CENTER);
+        Preconditions.checkState(flick.isPresent());
+        if (flick.get().getKeyEntity().getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE) {
           hasLongPressKeyCode = true;
         }
         break;
@@ -589,23 +828,26 @@
       throw new IllegalArgumentException(
           "No default KeyState element is found: " + parser.getPositionDescription());
     }
-
     if (isRepeatable && hasLongPressKeyCode) {
       throw new IllegalArgumentException(
-          "The key has both isRepeatable attribute and longPressKeyCode: " +
-          parser.getPositionDescription());
+          "The key has both isRepeatable attribute and longPressKeyCode: "
+            + parser.getPositionDescription());
     }
 
     assertEndTag(parser, "Key");
-    return new Key(
-        x, y, keyAttributes.width, keyAttributes.height, keyAttributes.horizontalGap,
-        edgeFlags, isRepeatable, isModifier, isSticky, Stick.EVEN, keyStateList);
+    return keyAttributes.toBuilder()
+        .setEdgeFlags(edgeFlags)
+        .setRepeatable(isRepeatable)
+        .setModifier(isModifier)
+        .setStick(Stick.EVEN)
+        .setKeyStateList(keyStateList)
+        .build();
   }
 
   /**
    * Parses a {@code Spacer} element, and returns an instance.
    */
-  private Key parseSpacer(int x, int y, int edgeFlags, KeyAttributes defaultKeyAttributes)
+  private KeyAttributes parseSpacer(int edgeFlags, KeyAttributes defaultKeyAttributes)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     DisplayMetrics metrics = resources.getDisplayMetrics();
@@ -618,7 +860,9 @@
       try {
         keyAttributes = parseKeyAttributes(
             attributes, defaultKeyAttributes, metrics, keyboardWidth, keyboardHeight,
-            -1, SPACER_KEY_HEIGHT_INDEX, SPACER_HORIZONTAL_GAP_INDEX, -1, -1);
+            SPACER_KEY_WIDTH_INDEX, SPACER_KEY_HEIGHT_INDEX,
+            SPACER_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX, -1, -1, -1, -1, -1, -1,
+            SPACER_KEY_BACKGROUND_INDEX);
         edgeFlags |= attributes.getInt(SPACER_KEY_EDGE_FLAGS_INDEX, 0);
         stick = Stick.values()[attributes.getInt(SPACER_STICK_INDEX, 0)];
       } finally {
@@ -630,19 +874,21 @@
     assertEndTag(parser, "Spacer");
 
     // Returns a dummy key object.
-    return new Key(
-        x, y, keyAttributes.horizontalGap, keyAttributes.height,
-        0, edgeFlags, false, false, false, stick, Collections.<KeyState>emptyList());
+    return keyAttributes.toBuilder()
+        .setRepeatable(false)
+        .setModifier(false)
+        .setEdgeFlags(edgeFlags)
+        .setStick(stick)
+        .build();
   }
 
-  private KeyState parseKeyState(DrawableType defaultBackgroundDrawableType,
-                                 PopUpAttributes popUpAttributes)
+  private KeyState parseKeyState(KeyAttributes defaultKeyAttributes,
+                                 PopUpAttributes popUpAttributes, DisplayMetrics metrics)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     assertStartTag(parser, "KeyState");
 
     String contentDescription;
-    DrawableType backgroundDrawableType;
     Set<KeyState.MetaState> metaStateSet;
     Set<KeyState.MetaState> nextAddMetaState;
     Set<KeyState.MetaState> nextRemoveMetaState;
@@ -651,8 +897,6 @@
       try {
         contentDescription = Objects.firstNonNull(
             attributes.getText(KEY_STATE_CONTENT_DESCRIPTION_INDEX), "").toString();
-        backgroundDrawableType = parseKeyBackgroundDrawableType(
-            attributes, KEY_STATE_KEY_BACKGROUND_INDEX, defaultBackgroundDrawableType);
         metaStateSet = parseMetaState(attributes, KEY_STATE_META_STATE_INDEX);
         nextAddMetaState = parseMetaState(attributes, KEY_STATE_NEXT_META_STATE_INDEX);
         nextRemoveMetaState = parseMetaState(attributes, KEY_STATE_NEXT_REMOVED_META_STATES_INDEX);
@@ -669,7 +913,7 @@
       if (parser.getEventType() == XmlResourceParser.END_TAG) {
         break;
       }
-      flickList.add(parseFlick(backgroundDrawableType, popUpAttributes));
+      flickList.add(parseFlick(defaultKeyAttributes, popUpAttributes, metrics));
     }
 
     // At the moment, we support only keys which has flick data to the CENTER direction.
@@ -690,8 +934,8 @@
                         flickList);
   }
 
-  private Flick parseFlick(DrawableType backgroundDrawableType,
-                           PopUpAttributes popUpAttributes)
+  private Flick parseFlick(KeyAttributes defaultKeyAttributes,
+                           PopUpAttributes popUpAttributes, DisplayMetrics metrics)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     assertStartTag(parser, "Flick");
@@ -707,13 +951,13 @@
     }
 
     parser.next();
-    KeyEntity entity = parseKeyEntity(backgroundDrawableType, popUpAttributes);
+    KeyEntity entity = parseKeyEntity(defaultKeyAttributes, popUpAttributes, metrics);
 
-    if (entity.getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE &&
-        direction != Flick.Direction.CENTER) {
+    if (entity.getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE
+        && direction != Flick.Direction.CENTER) {
       throw new IllegalArgumentException(
-          "longPressKeyCode can be set to only a KenEntity for CENTER direction: " +
-          parser.getPositionDescription());
+          "longPressKeyCode can be set to only a KenEntity for CENTER direction: "
+              + parser.getPositionDescription());
     }
 
     parser.next();
@@ -722,8 +966,8 @@
     return new Flick(direction, entity);
   }
 
-  private KeyEntity parseKeyEntity(
-      DrawableType backgroundDrawableType, PopUpAttributes popUpAttributes)
+  private KeyEntity parseKeyEntity(KeyAttributes defaultKeyAttributes,
+                                   PopUpAttributes popUpAttributes, DisplayMetrics metrics)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     assertStartTag(parser, "KeyEntity");
@@ -731,11 +975,14 @@
     int sourceId;
     int keyCode;
     int longPressKeyCode;
+    boolean longPressTimeoutTrigger;
     int keyIconResourceId;
-    String keyCharacter;
-    @SuppressWarnings("unused")
-    DrawableType keyBackgroundDrawableType;
+    Optional<String> keyCharacter = Optional.absent();
     boolean flickHighlight;
+    int horizontalPadding;
+    int verticalPadding;
+    int iconWidth;
+    int iconHeight;
     {
       TypedArray attributes = resources.obtainAttributes(parser, KEY_ENTITY_ATTRIBUTES);
       try {
@@ -743,15 +990,33 @@
         if (!sourceIdSet.add(sourceId)) {
           //  Same sourceId is found.
           throw new IllegalArgumentException(
-              "Duplicataed sourceId is found: " + xmlResourceParser.getPositionDescription());
+              "Duplicataed sourceId (" + sourceId + ") is found: "
+              + xmlResourceParser.getPositionDescription());
         }
         keyCode = getCode(
-            attributes.peekValue(KEY_ENTITY_KEY_CODE_INDEX), KeyEntity.INVALID_KEY_CODE);
-        longPressKeyCode = getCode(attributes.peekValue(KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX),
-                                   KeyEntity.INVALID_KEY_CODE);
+            Optional.fromNullable(attributes.peekValue(KEY_ENTITY_KEY_CODE_INDEX)),
+            KeyEntity.INVALID_KEY_CODE);
+        longPressKeyCode = getCode(
+            Optional.fromNullable(attributes.peekValue(KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX)),
+            KeyEntity.INVALID_KEY_CODE);
+        longPressTimeoutTrigger = attributes.getBoolean(KEY_ENTITY_LONG_PRESS_TIMEOUT_TRIGGER_INDEX,
+                                                        true);
         keyIconResourceId = attributes.getResourceId(KEY_ENTITY_KEY_ICON_INDEX, 0);
-        keyCharacter = attributes.getString(KEY_ENTITY_KEY_CHAR_INDEX);
+        keyCharacter = Optional.fromNullable(attributes.getString(KEY_ENTITY_KEY_CHAR_INDEX));
         flickHighlight = attributes.getBoolean(KEY_ENTITY_FLICK_HIGHLIGHT_INDEX, false);
+
+        horizontalPadding = getDimensionOrFraction(
+                Optional.fromNullable(attributes.peekValue(KEY_ENTITY_HORIZONTAL_PADDING_INDEX)),
+                keyboardWidth, defaultKeyAttributes.defaultHorizontalPadding, metrics);
+        verticalPadding = getDimensionOrFraction(
+                Optional.fromNullable(attributes.peekValue(KEY_ENTITY_VERTICAL_PADDING_INDEX)),
+                keyboardHeight, defaultKeyAttributes.defaultVerticalPadding, metrics);
+        iconWidth = getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(KEY_ENTITY_ICON_WIDTH_INDEX)),
+            keyboardWidth, defaultKeyAttributes.defaultIconWidth, metrics);
+        iconHeight = getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(KEY_ENTITY_ICON_HEIGHT_INDEX)),
+            keyboardHeight, defaultKeyAttributes.defaultIconHeight, metrics);
       } finally {
         attributes.recycle();
       }
@@ -760,84 +1025,128 @@
     parser.next();
     ignoreWhiteSpaceAndComment(parser);
 
-    PopUp popUp = null;
+    Optional<PopUp> popUp = Optional.absent();
     if (parser.getEventType() == XmlResourceParser.START_TAG) {
-      popUp = parsePopUp(popUpAttributes);
+      popUp = Optional.of(parsePopUp(popUpAttributes));
       parser.next();
       ignoreWhiteSpaceAndComment(parser);
     }
 
     assertEndTag(parser, "KeyEntity");
 
-    return new KeyEntity(sourceId, keyCode, longPressKeyCode, keyIconResourceId, keyCharacter,
-                         backgroundDrawableType, flickHighlight, popUp);
+    return new KeyEntity(sourceId, keyCode, longPressKeyCode, longPressTimeoutTrigger,
+        keyIconResourceId, keyCharacter, flickHighlight, popUp,
+        horizontalPadding, verticalPadding, iconWidth, iconHeight);
   }
 
-  private PopUp parsePopUp(PopUpAttributes popUpAttributes)
+  private PopUp parsePopUp(PopUpAttributes defaultValue)
       throws XmlPullParserException, IOException {
     XmlResourceParser parser = this.xmlResourceParser;
     assertStartTag(parser, "PopUp");
 
+    PopUpAttributes popUpAttributes;
+    TypedArray attributes = resources.obtainAttributes(parser, POPUP_ATTRIBUTES);
     int popUpIconResourceId;
-    {
-      TypedArray attributes = resources.obtainAttributes(parser, R.styleable.PopUp);
-      try {
-        popUpIconResourceId = attributes.getResourceId(R.styleable.PopUp_popUpIcon, 0);
-      } finally {
-        attributes.recycle();
-      }
+    int popUpLongPressIconResourceId;
+    try {
+      popUpAttributes = parsePopUpAttributes(attributes, defaultValue,
+          resources.getDisplayMetrics(),
+          keyboardWidth, POPUP_KEY_HEIGHT_INDEX,
+          POPUP_KEY_X_OFFSET_INDEX, POPUP_KEY_Y_OFFSET_INDEX,
+          POPUP_KEY_ICON_WIDTH_INDEX, POPUP_KEY_ICON_HEIGHT_INDEX);
+      popUpIconResourceId = attributes.getResourceId(POPUP_KEY_ICON_INDEX, 0);
+      popUpLongPressIconResourceId = attributes.getResourceId(POPUP_KEY_LONG_PRESS_ICON_INDEX, 0);
+    } finally {
+      attributes.recycle();
     }
     parser.next();
     assertEndTag(parser, "PopUp");
 
     return new PopUp(popUpIconResourceId,
-                     popUpAttributes.popUpWidth,
+                     popUpLongPressIconResourceId,
                      popUpAttributes.popUpHeight,
                      popUpAttributes.popUpXOffset,
-                     popUpAttributes.popUpYOffset);
+                     popUpAttributes.popUpYOffset,
+                     popUpAttributes.popUpIconWidth,
+                     popUpAttributes.popUpIconHeight);
   }
 
   private float parseFlickThreshold(TypedArray attributes, int index) {
     float flickThreshold = attributes.getDimension(
         index, resources.getDimension(R.dimen.default_flick_threshold));
-    if (flickThreshold <= 0) {
-      throw new IllegalArgumentException(
-          "flickThreshold must be greater than 0.  value = " + flickThreshold);
-    }
+    Preconditions.checkArgument(
+        flickThreshold > 0, "flickThreshold must be greater than 0.  value = " + flickThreshold);
     return flickThreshold;
   }
 
   private static KeyAttributes parseKeyAttributes(
       TypedArray attributes, KeyAttributes defaultValue, DisplayMetrics metrics,
       int keyboardWidth, int keyboardHeight,
-      int keyWidthIndex, int keyHeightIndex, int horizontalGapIndex, int verticalGapIndex,
+      int keyWidthIndex, int keyHeightIndex, int keyHorizontalLayoutWeightIndex,
+      int horizontalGapIndex, int verticalGapIndex,
+      int defaultIconWidthIndex, int defaultIconHeightIndex,
+      int defaultHorizontalPaddingIndex, int defaultVerticalPaddingIndex,
       int keyBackgroundIndex) {
+
     int keyWidth = (keyWidthIndex >= 0)
         ? getDimensionOrFraction(
-              attributes.peekValue(keyWidthIndex), keyboardWidth,
+              Optional.fromNullable(attributes.peekValue(keyWidthIndex)), keyboardWidth,
               defaultValue.width, metrics)
         : defaultValue.width;
     int keyHeight = (keyHeightIndex >= 0)
         ? getDimensionOrFraction(
-              attributes.peekValue(keyHeightIndex), keyboardHeight,
+              Optional.fromNullable(attributes.peekValue(keyHeightIndex)), keyboardHeight,
               defaultValue.height, metrics)
         : defaultValue.height;
+    int keyHorizontalLayoutWeight = (keyHorizontalLayoutWeightIndex >= 0)
+        ? attributes.getInt(keyHorizontalLayoutWeightIndex, defaultValue.horizontalLayoutWeight)
+        : defaultValue.horizontalLayoutWeight;
 
     int horizontalGap = (horizontalGapIndex >= 0)
         ? getDimensionOrFraction(
-              attributes.peekValue(horizontalGapIndex),
+              Optional.fromNullable(attributes.peekValue(horizontalGapIndex)),
               keyboardWidth, defaultValue.horizontalGap, metrics)
         : defaultValue.horizontalGap;
     int verticalGap = (verticalGapIndex >= 0)
         ? getDimensionOrFraction(
-              attributes.peekValue(verticalGapIndex),
+              Optional.fromNullable(attributes.peekValue(verticalGapIndex)),
               keyboardHeight, defaultValue.verticalGap, metrics)
         : defaultValue.verticalGap;
+    int defaultIconWidth = (defaultIconWidthIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(defaultIconWidthIndex)),
+            keyboardWidth, defaultValue.defaultIconWidth, metrics)
+        : defaultValue.defaultIconWidth;
+    int defaultIconHeight = (defaultIconHeightIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(defaultIconHeightIndex)),
+            keyboardHeight, defaultValue.defaultIconHeight, metrics)
+        : defaultValue.defaultIconHeight;
+    int defaultHorizontalPadding = (defaultHorizontalPaddingIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(defaultHorizontalPaddingIndex)),
+            keyboardWidth, defaultValue.defaultHorizontalPadding, metrics)
+        : defaultValue.defaultHorizontalPadding;
+    int defaultVerticalPadding = (defaultVerticalPaddingIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(defaultVerticalPaddingIndex)),
+            keyboardWidth, defaultValue.defaultVerticalPadding, metrics)
+        : defaultValue.defaultVerticalPadding;
 
     DrawableType keyBackgroundDrawableType = parseKeyBackgroundDrawableType(
         attributes, keyBackgroundIndex, defaultValue.keyBackgroundDrawableType);
-    return new KeyAttributes(
-        keyWidth, keyHeight, horizontalGap, verticalGap, keyBackgroundDrawableType);
+    return KeyAttributes.newBuilder()
+        .setWidth(keyWidth)
+        .setHeight(keyHeight)
+        .setHorizontalLayoutWeight(keyHorizontalLayoutWeight)
+        .setHorizontalGap(horizontalGap)
+        .setVerticalGap(verticalGap)
+        .setDefaultHorizontalPadding(defaultHorizontalPadding)
+        .setDefaultVerticalPadding(defaultVerticalPadding)
+        .setDefaultIconWidth(defaultIconWidth)
+        .setDefaultIconHeight(defaultIconHeight)
+        .setKeybackgroundDrawableType(keyBackgroundDrawableType)
+        .build();
   }
 
   private static DrawableType parseKeyBackgroundDrawableType(
@@ -850,17 +1159,37 @@
   }
 
   private static PopUpAttributes parsePopUpAttributes(
-      TypedArray attributes, DisplayMetrics metrics, int keyboardWidth,
-      int popUpWidthIndex, int popUpHeightIndex, int popUpXOffsetIndex, int popUpYOffsetIndex) {
-    int popUpWidth = getDimensionOrFraction(
-        attributes.peekValue(popUpWidthIndex), keyboardWidth, 0, metrics);
-    int popUpHeight = getDimensionOrFraction(
-        attributes.peekValue(popUpHeightIndex), keyboardWidth, 0, metrics);
-    int popUpXOffset = getDimensionOrFraction(
-        attributes.peekValue(popUpXOffsetIndex), keyboardWidth, 0, metrics);
-    int popUpYOffset = getDimensionOrFraction(
-        attributes.peekValue(popUpYOffsetIndex), keyboardWidth, 0, metrics);
-    return new PopUpAttributes(popUpWidth, popUpHeight, popUpXOffset, popUpYOffset);
+      TypedArray attributes, PopUpAttributes defaultValue, DisplayMetrics metrics,
+      int keyboardWidth, int popUpHeightIndex,
+      int popUpXOffsetIndex, int popUpYOffsetIndex,
+      int popUpIconWidthIndex, int popUpIconHeightIndex) {
+    int popUpHeight = (popUpHeightIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(popUpHeightIndex)), keyboardWidth,
+            defaultValue.popUpHeight, metrics)
+        : defaultValue.popUpHeight;
+    int popUpXOffset = (popUpXOffsetIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(popUpXOffsetIndex)), keyboardWidth,
+            defaultValue.popUpXOffset, metrics)
+        : defaultValue.popUpXOffset;
+    int popUpYOffset = (popUpYOffsetIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(popUpYOffsetIndex)), keyboardWidth,
+            defaultValue.popUpYOffset, metrics)
+        : defaultValue.popUpYOffset;
+    int popUpIconWidth = (popUpIconWidthIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(popUpIconWidthIndex)), keyboardWidth,
+            defaultValue.popUpIconWidth, metrics)
+        : defaultValue.popUpIconWidth;
+    int popUpIconHeight = (popUpIconHeightIndex >= 0)
+        ? getDimensionOrFraction(
+            Optional.fromNullable(attributes.peekValue(popUpIconHeightIndex)), keyboardWidth,
+            defaultValue.popUpIconHeight, metrics)
+        : defaultValue.popUpIconHeight;
+    return new PopUpAttributes(
+        popUpHeight, popUpXOffset, popUpYOffset, popUpIconWidth, popUpIconHeight);
   }
 
   /**
@@ -889,13 +1218,7 @@
     return Flick.Direction.valueOf(attributes.getInt(index, Flick.Direction.CENTER.index));
   }
 
-  protected Keyboard buildKeyboard(
-      Optional<String> contentDescription, List<Row> rowList, float flickThreshold) {
-    return new Keyboard(Preconditions.checkNotNull(contentDescription),
-                        Preconditions.checkNotNull(rowList), flickThreshold);
-  }
-
-  protected Row buildRow(List<Key> keyList, int height, int verticalGap) {
+  private Row buildRow(List<Key> keyList, int height, int verticalGap) {
     return new Row(keyList, height, verticalGap);
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
index 6fa2d4c..ac47204 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
@@ -37,20 +37,17 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.Sets;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
 import android.os.Looper;
 import android.support.v4.view.ViewCompat;
 import android.text.InputType;
@@ -74,31 +71,85 @@
  *
  */
 public class KeyboardView extends View implements MemoryManageable {
+
   private final BackgroundDrawableFactory backgroundDrawableFactory =
-      new BackgroundDrawableFactory(getResources().getDisplayMetrics().density);
-  private final DrawableCache drawableCache =
-      new DrawableCache(new MozcDrawableFactory(getResources()));
+      new BackgroundDrawableFactory(getResources());
+  private final DrawableCache drawableCache = new DrawableCache(getResources());
   private final PopUpPreview.Pool popupPreviewPool =
       new PopUpPreview.Pool(
           this, Looper.getMainLooper(), backgroundDrawableFactory, drawableCache);
   private final long popupDismissDelay;
 
-  private Keyboard keyboard;
+  private Optional<Keyboard> keyboard = Optional.absent();
   // Do not update directly. Use setMetaState instead.
   @VisibleForTesting Set<MetaState> metaState;
   @VisibleForTesting final KeyboardViewBackgroundSurface backgroundSurface =
       new KeyboardViewBackgroundSurface(backgroundDrawableFactory, drawableCache);
   @VisibleForTesting boolean isKeyPressed;
 
-  private final int keycodeSymbol;
   private final float scaledDensity;
 
   private int flickSensitivity;
   private boolean popupEnabled = true;
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
 
   private final KeyboardAccessibilityDelegate accessibilityDelegate;
 
+  /**
+   * Decorator class for {@code Map} for {@code KeyEventContextMap}.
+   * <p>
+   * When the number of the content is changed, meta state "HANDLING_TOUCH_EVENT"
+   * is updated.
+   */
+  private final class KeyEventContextMap extends ForwardingMap<Integer, KeyEventContext>{
+
+    private final Map<Integer, KeyEventContext> delegate;
+
+    private KeyEventContextMap(Map<Integer, KeyEventContext> delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    protected Map<Integer, KeyEventContext> delegate() {
+      return delegate;
+    }
+
+    @Override
+    public void clear() {
+      super.clear();
+      updateHandlingTouchEventMetaState();
+    }
+
+    @Override
+    public KeyEventContext put(Integer key, KeyEventContext value) {
+      KeyEventContext result = super.put(key, value);
+      updateHandlingTouchEventMetaState();
+      return result;
+    }
+
+    @Override
+    public void putAll(Map<? extends Integer, ? extends KeyEventContext> map) {
+      super.putAll(map);
+      updateHandlingTouchEventMetaState();
+    }
+
+    @Override
+    public KeyEventContext remove(Object object) {
+      KeyEventContext result = super.remove(object);
+      updateHandlingTouchEventMetaState();
+      return result;
+    }
+
+    private void updateHandlingTouchEventMetaState() {
+      if (keyEventContextMap.isEmpty()) {
+        updateMetaStates(Collections.<MetaState>emptySet(),
+                         Collections.singleton(MetaState.HANDLING_TOUCH_EVENT));
+      } else {
+        updateMetaStates(Collections.singleton(MetaState.HANDLING_TOUCH_EVENT),
+                         Collections.<MetaState>emptySet());
+      }
+    }
+  }
+
   // A map from pointerId to KeyEventContext.
   // Note: the pointerId should be small integers, e.g. 0, 1, 2... So if it turned out
   //   that the usage of Map is heavy, we probably can replace this map by a List or
@@ -107,9 +158,9 @@
   // in the pressing order in flushPendingKeyEvent.
   // Its initial capacity (16) and load factor (0.75) are just heuristics.
   @VisibleForTesting public final Map<Integer, KeyEventContext> keyEventContextMap =
-      new LinkedHashMap<Integer, KeyEventContext>(16, 0.75f, false);
+      new KeyEventContextMap(new LinkedHashMap<Integer, KeyEventContext>(16, 0.75f, false));
 
-  private KeyEventHandler keyEventHandler = null;
+  private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
 
   // This constructor is package private for this unit test.
   public KeyboardView(Context context) {
@@ -129,11 +180,37 @@
     Context context = getContext();
     Resources res = context.getResources();
     popupDismissDelay = res.getInteger(R.integer.config_popup_dismiss_delay);
-    keycodeSymbol = res.getInteger(R.integer.key_symbol);
     scaledDensity = res.getDisplayMetrics().scaledDensity;
-    accessibilityDelegate = new KeyboardAccessibilityDelegate(this);
+    accessibilityDelegate = new KeyboardAccessibilityDelegate(
+        this, new KeyboardAccessibilityDelegate.TouchEventEmulator() {
+          @Override
+          public void emulateLongPress(Key key) {
+            Preconditions.checkNotNull(key);
+            emulateImpl(key, true);
+          }
+
+          @Override
+          public void emulateKeyInput(Key key) {
+            Preconditions.checkNotNull(key);
+            emulateImpl(key, false);
+          }
+
+          private void emulateImpl(Key key, boolean isLongPress) {
+            KeyEventContext keyEventContext = new KeyEventContext(key, 0, 0, 0, 0, 0, 0, metaState);
+            processKeyEventContextForOnDownEvent(keyEventContext);
+            if (isLongPress && keyEventHandler.isPresent()) {
+              keyEventHandler.get().handleMessageLongPress(keyEventContext);
+            }
+            processKeyEventContextForOnUpEvent(keyEventContext);
+            // Without the invalidation this view cannot know that its content
+            // has been updated.
+            invalidate();
+          }
+        });
     ViewCompat.setAccessibilityDelegate(this, accessibilityDelegate);
-    setMetaStates(Collections.<MetaState>emptySet());
+    // Not sure if globe is really activated.
+    // However metastate requires GLOBE or NO_GLOBE state.
+    setMetaStates(EnumSet.of(MetaState.NO_GLOBE));
   }
 
   /**
@@ -153,24 +230,23 @@
     return -flickSensitivity * 1.5f * scaledDensity;
   }
 
-  KeyEventContext getKeyEventContextByKey(Key key) {
+  private Optional<KeyEventContext> getKeyEventContextByKey(Key key) {
+    Preconditions.checkNotNull(key);
     for (KeyEventContext keyEventContext : keyEventContextMap.values()) {
-      if (keyEventContext != null && key == keyEventContext.key) {
-        return keyEventContext;
+      if (key == keyEventContext.key) {
+        return Optional.of(keyEventContext);
       }
     }
-    return null;
+    return Optional.absent();
   }
 
   private void disposeKeyEventContext(KeyEventContext keyEventContext) {
-    if (keyEventContext == null) {
-      return;
+    Preconditions.checkNotNull(keyEventContext);
+    if (keyEventHandler.isPresent()) {
+      keyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
     }
-    if (keyEventHandler != null) {
-      keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
-    }
-    backgroundSurface.requestUpdateKey(keyEventContext.key, null);
-    if (popupEnabled) {
+    backgroundSurface.requestUpdateKey(keyEventContext.key, Optional.<Flick.Direction>absent());
+    if (popupEnabled || keyEventContext.longPressCallback.isPresent()) {
       popupPreviewPool.releaseDelayed(keyEventContext.pointerId, popupDismissDelay);
     }
   }
@@ -186,7 +262,9 @@
     keyEventContextMap.clear();
   }
 
-  private void flushPendingKeyEvent(TouchEvent relativeTouchEvent) {
+  private void flushPendingKeyEvent(Optional<TouchEvent> relativeTouchEvent) {
+    Preconditions.checkNotNull(relativeTouchEvent);
+
     // Back up values and clear the map first to avoid stack overflow
     // in case this method is invoked recursively from the callback.
     // TODO(hidehiko): Refactor around keyEventHandler and keyEventContext. Also we should be
@@ -194,30 +272,30 @@
     KeyEventContext[] keyEventContextArray =
         keyEventContextMap.values().toArray(new KeyEventContext[keyEventContextMap.size()]);
     keyEventContextMap.clear();
-    KeyEventHandler keyEventHandler = this.keyEventHandler;
 
     for (KeyEventContext keyEventContext : keyEventContextArray) {
       int keyCode = keyEventContext.getKeyCode();
       int pressedKeyCode = keyEventContext.getPressedKeyCode();
       disposeKeyEventContext(keyEventContext);
-      if (keyEventHandler != null) {
+      if (keyEventHandler.isPresent()) {
         // Send relativeTouchEvent as well if exists.
-        List<TouchEvent> touchEventList = relativeTouchEvent == null
-            ? Collections.singletonList(keyEventContext.getTouchEvent())
-            : Arrays.asList(relativeTouchEvent, keyEventContext.getTouchEvent());
-        keyEventHandler.sendKey(keyCode, touchEventList);
-        keyEventHandler.sendRelease(pressedKeyCode);
+        // TODO(hsumita): Confirm that we can put null on touchEventList or not.
+        List<TouchEvent> touchEventList = relativeTouchEvent.isPresent()
+            ? Arrays.asList(relativeTouchEvent.get(), keyEventContext.getTouchEvent().orNull())
+            : Collections.singletonList(keyEventContext.getTouchEvent().orNull());
+        keyEventHandler.get().sendKey(keyCode, touchEventList);
+        keyEventHandler.get().sendRelease(pressedKeyCode);
       }
     }
   }
 
   /** Set a given keyboard to this view, and send a request to update. */
   public void setKeyboard(Keyboard keyboard) {
-    flushPendingKeyEvent(null);
+    flushPendingKeyEvent(Optional.<TouchEvent>absent());
 
-    this.keyboard = keyboard;
+    this.keyboard = Optional.of(keyboard);
     updateMetaStates(Collections.<MetaState>emptySet(), MetaState.CHAR_TYPE_EXCLUSIVE_GROUP);
-    accessibilityDelegate.setKeyboard(Optional.fromNullable(keyboard));
+    accessibilityDelegate.setKeyboard(this.keyboard);
     this.drawableCache.clear();
     backgroundSurface.requestUpdateKeyboard(keyboard, metaState);
     backgroundSurface.requestUpdateSize(keyboard.contentRight - keyboard.contentLeft,
@@ -244,93 +322,107 @@
   }
 
   /** @return the current keyboard instance */
-  public Keyboard getKeyboard() {
+  public Optional<Keyboard> getKeyboard() {
     return keyboard;
   }
 
-  public void setSkinType(SkinType skinType) {
-    this.skinType = skinType;
-    drawableCache.setSkinType(skinType);
-    backgroundDrawableFactory.setSkinType(skinType);
-    resetBackground();
-    if (keyboard != null) {
-      backgroundSurface.requestUpdateKeyboard(keyboard, metaState);
-    }
-  }
-
   @SuppressWarnings("deprecation")
-  private void resetBackground() {
-    Optional<Drawable> optionalKeyboardBackground =
-        drawableCache.getDrawable(skinType.windowBackgroundResourceId);
-    if (!optionalKeyboardBackground.isPresent()) {
-      setBackgroundColor(Color.BLACK);  // Set default background color.
-    } else {
-      Drawable keyboardBackground = optionalKeyboardBackground.get();
-      if (keyboardBackground instanceof BitmapDrawable) {
-        // If the background is bitmap resource, set repeat mode.
-        BitmapDrawable.class.cast(keyboardBackground).setTileModeXY(
-            TileMode.REPEAT, TileMode.REPEAT);
-      }
-      setBackgroundDrawable(keyboardBackground);
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    drawableCache.setSkin(skin);
+    backgroundDrawableFactory.setSkin(skin);
+    if (keyboard.isPresent()) {
+      backgroundSurface.requestUpdateKeyboard(keyboard.get(), metaState);
     }
+    setBackgroundDrawable(skin.windowBackgroundDrawable.getConstantState().newDrawable());
   }
 
   public void setKeyEventHandler(KeyEventHandler keyEventHandler) {
     // This method needs to be invoked from a thread which the looper held by older keyEventHandler
     // points. Otherwise, there can be inconsistent state.
-    KeyEventHandler oldKeyEventHandler = this.keyEventHandler;
-    if (oldKeyEventHandler != null) {
+    Optional<KeyEventHandler> oldKeyEventHandler = this.keyEventHandler;
+    if (oldKeyEventHandler.isPresent()) {
       // Cancel pending key event messages sent by this view.
       for (KeyEventContext keyEventContext : keyEventContextMap.values()) {
-        oldKeyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+        oldKeyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
       }
     }
-
-    this.keyEventHandler = keyEventHandler;
-    accessibilityDelegate.setKeyEventHandler(Optional.fromNullable(keyEventHandler));
+    this.keyEventHandler = Optional.of(keyEventHandler);
   }
 
   @Override
   public void onDraw(Canvas canvas) {
     super.onDraw(canvas);
 
-    if (keyboard == null) {
+    if (!keyboard.isPresent()) {
       // We have nothing to do.
       return;
     }
-
+    // Draw keyboard.
     backgroundSurface.update();
     backgroundSurface.draw(canvas);
   }
 
+  @SuppressLint("InlinedApi")
   private static int getPointerIndex(int action) {
     return
         (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
   }
 
   private void onDown(MotionEvent event) {
+    Preconditions.checkState(keyboard.isPresent());
+
     int pointerIndex = getPointerIndex(event.getAction());
     float x = event.getX(pointerIndex);
     float y = event.getY(pointerIndex);
 
-    Key key = getKeyByCoord(x, y);
-    if (key == null) {
+    Optional<Key> optionalKey = getKeyByCoord(x, y);
+    if (!optionalKey.isPresent()) {
       // Just ignore if a key isn't found.
       return;
     }
 
-    if (getKeyEventContextByKey(key) != null) {
+    if (getKeyEventContextByKey(optionalKey.get()).isPresent()) {
       // If the key is already pressed, we simply ignore event sequence related to this press.
       return;
     }
 
     // Create a new key event context.
     int pointerId = event.getPointerId(pointerIndex);
-    float flickThreshold = Math.max(keyboard.getFlickThreshold() + getFlickSensitivityInDip(), 1);
-    KeyEventContext keyEventContext = new KeyEventContext(
-        key, pointerId, x, y, getWidth(), getHeight(),
+    float flickThreshold =
+        Math.max(keyboard.get().getFlickThreshold() + getFlickSensitivityInDip(), 1);
+    final KeyEventContext keyEventContext = new KeyEventContext(
+        optionalKey.get(), pointerId, x, y, getWidth(), getHeight(),
         flickThreshold * flickThreshold, metaState);
 
+    // Show popup.
+    updatePopUp(keyEventContext, false);
+    Optional<KeyEntity> keyEntity =
+        KeyEventContext.getKeyEntity(keyEventContext.key, metaState,
+                                     Optional.of(Flick.Direction.CENTER));
+    if (keyEntity.isPresent() && keyEntity.get().getPopUp().isPresent()
+        && !keyEntity.get().isLongPressTimeoutTrigger()) {
+      keyEventContext.setLongPressCallback(new Runnable() {
+          @Override
+          public void run() {
+            updatePopUp(keyEventContext, true);
+          }
+        });
+    }
+
+    // Process the KeyEventContext (e.g., sending messages to KeyEventHandler, updating the surface,
+    // flushing pending key events and so on)
+    processKeyEventContextForOnDownEvent(keyEventContext);
+    // keyEventContextMap contains older event.
+    // TODO(hidehiko): Switch to ignoring new event, or overwriting the old event
+    //   not to show unknown exceptions to users.
+    Preconditions.checkState(
+        keyEventContextMap.put(pointerId, keyEventContext) == null,
+        "Conflicting keyEventContext is found: " + pointerId);
+  }
+
+  private void processKeyEventContextForOnDownEvent(
+      final KeyEventContext keyEventContext) {
     Set<MetaState> nextMetaStates = keyEventContext.getNextMetaStates(metaState);
 
     if (!nextMetaStates.equals(metaState)) {
@@ -350,41 +442,29 @@
       // Update the metaState and request to update the full keyboard image
       // to update all key icons.
       setMetaStates(nextMetaStates);
-      backgroundSurface.requestUpdateKeyboard(keyboard, nextMetaStates);
+      backgroundSurface.requestUpdateKeyboard(keyboard.get(), nextMetaStates);
     } else {
       // Remember if a non-modifier key is pressed.
       isKeyPressed = true;
 
       // Request to update the image of only this key on the view.
-      backgroundSurface.requestUpdateKey(key, keyEventContext.flickDirection);
+      backgroundSurface.requestUpdateKey(keyEventContext.key,
+                                         Optional.of(keyEventContext.flickDirection));
     }
-
-    if (keyEventContextMap.put(pointerId, keyEventContext) != null) {
-      // keyEventContextMap contains older event.
-      // TODO(hidehiko): Switch to ignoring new event, or overwriting the old event
-      //   not to show unknown exceptions to users.
-      throw new IllegalStateException("Conflicting keyEventContext is found: " + pointerId);
-    }
-
-    // Show popup.
-    if (popupEnabled) {
-      popupPreviewPool.getInstance(pointerId)
-          .showIfNecessary(key, keyEventContext.getCurrentPopUp());
-    }
-
-    if (keyEventHandler != null) {
+    if (keyEventHandler.isPresent()) {
       // Clear pending key events and overwrite by this press key's one.
       for (KeyEventContext context : keyEventContextMap.values()) {
-        keyEventHandler.cancelDelayedKeyEvent(context);
+        keyEventHandler.get().cancelDelayedKeyEvent(context);
       }
-      keyEventHandler.maybeStartDelayedKeyEvent(keyEventContext);
-
+      keyEventHandler.get().maybeStartDelayedKeyEvent(keyEventContext);
       // Finally we send a notification to listeners.
-      keyEventHandler.sendPress(keyEventContext.getPressedKeyCode());
+      keyEventHandler.get().sendPress(keyEventContext.getPressedKeyCode());
     }
   }
 
   private void onUp(MotionEvent event) {
+    Preconditions.checkState(keyboard.isPresent());
+
     int pointerIndex = getPointerIndex(event.getAction());
     KeyEventContext keyEventContext = keyEventContextMap.remove(event.getPointerId(pointerIndex));
     if (keyEventContext == null) {
@@ -396,21 +476,22 @@
     float y = event.getY(pointerIndex);
     keyEventContext.update(x, y, TouchAction.TOUCH_UP, event.getEventTime() - event.getDownTime());
 
-    int keyCode = keyEventContext.getKeyCode();
-    int pressedKeyCode = keyEventContext.getPressedKeyCode();
+    processKeyEventContextForOnUpEvent(keyEventContext);
+  }
+
+  private void processKeyEventContextForOnUpEvent(KeyEventContext keyEventContext) {
     disposeKeyEventContext(keyEventContext);
 
-    if (keyEventHandler != null) {
-      // In multi touch event, CursorView and SymbolInputView can't show by not primary touch event
-      // because user may intend to input characters rapidly by multi touch, not change mode.
-      // TODO(yoichio): Move this logic to ViewManager. "In theory" this should be done
-      // in the class.
-      if (keyCode != KeyEntity.INVALID_KEY_CODE &&
-          (keyCode != keycodeSymbol || event.getAction() == MotionEvent.ACTION_UP)) {
-        keyEventHandler.sendKey(keyCode,
-            Collections.singletonList(keyEventContext.getTouchEvent()));
+    int keyCode = keyEventContext.getKeyCode();
+    int pressedKeyCode = keyEventContext.getPressedKeyCode();
+
+    if (keyEventHandler.isPresent()) {
+      if (keyCode != KeyEntity.INVALID_KEY_CODE) {
+        // TODO(hsumita): Confirm that we can put null as a touch event or not.
+        keyEventHandler.get().sendKey(keyCode,
+            Collections.singletonList(keyEventContext.getTouchEvent().orNull()));
       }
-      keyEventHandler.sendRelease(pressedKeyCode);
+      keyEventHandler.get().sendRelease(pressedKeyCode);
     }
 
     if (keyEventContext.isMetaStateToggleEvent()) {
@@ -420,7 +501,7 @@
         // reset the keyboard's meta state to unmodified.
         flushPendingKeyEvent(keyEventContext.getTouchEvent());
         updateMetaStates(Collections.<MetaState>emptySet(), MetaState.CHAR_TYPE_EXCLUSIVE_GROUP);
-        backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
+        backgroundSurface.requestUpdateKeyboard(keyboard.get(), Collections.<MetaState>emptySet());
       }
     } else {
       if (!metaState.isEmpty() && keyEventContextMap.isEmpty()) {
@@ -434,7 +515,8 @@
         }
         if (!nextMetaState.equals(metaState)) {
           setMetaStates(nextMetaState);
-          backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
+          backgroundSurface.requestUpdateKeyboard(
+              keyboard.get(), Collections.<MetaState>emptySet());
         }
       }
     }
@@ -451,17 +533,17 @@
       Key key = keyEventContext.key;
       if (keyEventContext.update(event.getX(i), event.getY(i), TouchAction.TOUCH_MOVE,
                                  event.getEventTime() - event.getDownTime())) {
-        // The key's state is updated from, at least, initial state, so we'll cancel the
-        // pending key events.
-        if (keyEventHandler != null) {
-          keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+        if (keyEventHandler.isPresent()) {
+          // The key's state is updated from, at least, initial state, so we'll cancel the
+          // pending key events, and invoke new pending key events if necessary.
+          keyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
+          if (keyEventContext.flickDirection == Flick.Direction.CENTER) {
+            keyEventHandler.get().maybeStartDelayedKeyEvent(keyEventContext);
+          }
         }
-        if (popupEnabled) {
-          popupPreviewPool.getInstance(keyEventContext.pointerId).showIfNecessary(
-              key, keyEventContext.getCurrentPopUp());
-        }
+        updatePopUp(keyEventContext, false);
       }
-      backgroundSurface.requestUpdateKey(key, keyEventContext.flickDirection);
+      backgroundSurface.requestUpdateKey(key, Optional.of(keyEventContext.flickDirection));
     }
   }
 
@@ -469,8 +551,8 @@
   // other onXXX methods defined above.
   private void onCancel(@SuppressWarnings("unused") MotionEvent event) {
     resetState();
-    if (keyEventHandler != null) {
-      keyEventHandler.sendCancel();
+    if (keyEventHandler.isPresent()) {
+      keyEventHandler.get().sendCancel();
     }
   }
 
@@ -505,30 +587,31 @@
    * Finds a key containing the given coordinate.
    * @param x {@code x}-coordinate.
    * @param y {@code y}-coordinate.
-   * @return A corresponding {@code Key} instance, or {@code null} if not found.
+   * @return A corresponding {@code Key} instance, or {@code Optional.<Key>absent()} if not found.
    */
-  @VisibleForTesting Key getKeyByCoord(float x, float y) {
-    if (y < 0 || keyboard == null || keyboard.getRowList().isEmpty()) {
-      return null;
+  @VisibleForTesting Optional<Key> getKeyByCoord(float x, float y) {
+    if (y < 0 || !keyboard.isPresent() || keyboard.get().getRowList().isEmpty()) {
+      return Optional.absent();
     }
 
+    List<Row> rowList = keyboard.get().getRowList();
     int rowBottom = 0;
-    Row lastRow = keyboard.getRowList().get(keyboard.getRowList().size() - 1);
-    for (Row row : keyboard.getRowList()) {
+    Row lastRow = rowList.get(rowList.size() - 1);
+    for (Row row : rowList) {
       rowBottom += row.getHeight() + row.getVerticalGap();
       Key prevKey = null;
       for (Key key : row.getKeyList()) {
         if ((// Stick vertical gaps to the keys above.
-             y < key.getY() + key.getHeight() + row.getVerticalGap() ||
+             y < key.getY() + key.getHeight() + row.getVerticalGap()
              // Or the key is at the bottom of the keyboard.
              // Note: Some devices sense touch events of out-side of screen.
              //   So, for better user experiences, we return the bottom row
              //   if a user touches below the screen bottom boundary.
-             row == lastRow ||
-             key.getY() + key.getHeight() >= keyboard.contentBottom) &&
+             || row == lastRow
+             || key.getY() + key.getHeight() >= keyboard.get().contentBottom)
             // Horizontal gap is included in the width,
             // so we don't need to calculate horizontal gap in addition to width.
-            x < key.getX() + key.getWidth() &&
+            && x < key.getX() + key.getWidth()
             // The following condition selects a key hit in A, C, or D
             // (C and D are on the same key), and excludes a key hit in B.
             //                +---+---+
@@ -539,21 +622,21 @@
             // The condition y < rowBottom allows hits on A and C, and the other
             // condition key.getX() <= x allows hits on C and D but not B.
             // Hence, the hits on B are excluded.
-            (y < rowBottom || key.getX() <= x)) {
+            && (y < rowBottom || key.getX() <= x)) {
           if (!key.isSpacer()) {
-            return key;  // Found a key.
+            return Optional.of(key);  // Found a key.
           }
 
           switch (key.getStick()) {
             case LEFT:
               if (prevKey != null) {
-                return prevKey;
+                return Optional.of(prevKey);
               }
               break;
             case EVEN:
               // Split the spacer evenly, assuming we don't have any consecutive spacers.
               if (x < key.getX() + key.getWidth() / 2 && prevKey != null) {
-                return prevKey;
+                return Optional.of(prevKey);
               }
               break;
             case RIGHT:
@@ -567,11 +650,11 @@
       }
 
       if ((y < rowBottom || row == lastRow) && prevKey != null) {
-        return prevKey;
+        return Optional.of(prevKey);
       }
     }
 
-    return null;  // Not found.
+    return Optional.absent();  // Not found.
   }
 
   @Override
@@ -583,6 +666,7 @@
 
   @Override
   public boolean dispatchTouchEvent(MotionEvent event) {
+    Preconditions.checkNotNull(event);
     if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) {
       return accessibilityDelegate.dispatchTouchEvent(event);
     }
@@ -591,6 +675,7 @@
 
   @Override
   public boolean dispatchHoverEvent(MotionEvent event) {
+    Preconditions.checkNotNull(event);
     if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) {
       return accessibilityDelegate.dispatchHoverEvent(event);
     }
@@ -598,7 +683,7 @@
   }
 
   @VisibleForTesting
-  Set<MetaState> getMetaStates() {
+  public Set<MetaState> getMetaStates() {
     return this.metaState;
   }
 
@@ -607,6 +692,7 @@
     Preconditions.checkArgument(MetaState.isValidSet(metaState));
     this.metaState = metaState;
     accessibilityDelegate.setMetaState(metaState);
+    backgroundSurface.requestMetaState(metaState);
   }
 
   public void updateMetaStates(Set<MetaState> addedMetaStates, Set<MetaState> removedMetaStates) {
@@ -615,6 +701,7 @@
 
     setMetaStates(Sets.union(Sets.difference(metaState, removedMetaStates),
                              addedMetaStates).immutableCopy());
+    invalidate();
   }
 
   public void setPasswordField(boolean isPasswordField) {
@@ -625,31 +712,35 @@
     Preconditions.checkNotNull(editorInfo);
 
     Set<MetaState> metaStates = EnumSet.noneOf(MetaState.class);
-    switch (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION) {
-      case EditorInfo.IME_ACTION_DONE:
-        metaStates.add(MetaState.ACTION_DONE);
-        break;
-      case EditorInfo.IME_ACTION_GO:
-        metaStates.add(MetaState.ACTION_GO);
-        break;
-      case EditorInfo.IME_ACTION_NEXT:
-        metaStates.add(MetaState.ACTION_NEXT);
-        break;
-      case EditorInfo.IME_ACTION_NONE:
-        metaStates.add(MetaState.ACTION_NONE);
-        break;
-      case EditorInfo.IME_ACTION_PREVIOUS:
-        metaStates.add(MetaState.ACTION_PREVIOUS);
-        break;
-      case EditorInfo.IME_ACTION_SEARCH:
-        metaStates.add(MetaState.ACTION_SEARCH);
-        break;
-      case EditorInfo.IME_ACTION_SEND:
-        metaStates.add(MetaState.ACTION_SEND);
-        break;
-      default:
-        // Do nothing
+    // If IME_FLAG_NO_ENTER_ACTION is set, normal action icon should be shown.
+    if ((editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) {
+      switch (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION) {
+        case EditorInfo.IME_ACTION_DONE:
+          metaStates.add(MetaState.ACTION_DONE);
+          break;
+        case EditorInfo.IME_ACTION_GO:
+          metaStates.add(MetaState.ACTION_GO);
+          break;
+        case EditorInfo.IME_ACTION_NEXT:
+          metaStates.add(MetaState.ACTION_NEXT);
+          break;
+        case EditorInfo.IME_ACTION_NONE:
+          metaStates.add(MetaState.ACTION_NONE);
+          break;
+        case EditorInfo.IME_ACTION_PREVIOUS:
+          metaStates.add(MetaState.ACTION_PREVIOUS);
+          break;
+        case EditorInfo.IME_ACTION_SEARCH:
+          metaStates.add(MetaState.ACTION_SEARCH);
+          break;
+        case EditorInfo.IME_ACTION_SEND:
+          metaStates.add(MetaState.ACTION_SEND);
+          break;
+        default:
+          // Do nothing
+      }
     }
+
     // InputType variation is *NOT* bit-fields in fact.
     int clazz = editorInfo.inputType & InputType.TYPE_MASK_CLASS;
     int variation = editorInfo.inputType & InputType.TYPE_MASK_VARIATION;
@@ -674,4 +765,25 @@
     updateMetaStates(metaStates, Sets.union(MetaState.ACTION_EXCLUSIVE_GROUP,
                                             MetaState.VARIATION_EXCLUSIVE_GROUP));
   }
+
+  public void setGlobeButtonEnabled(boolean isGlobeButtonEnabled) {
+    if (isGlobeButtonEnabled) {
+      updateMetaStates(EnumSet.of(MetaState.GLOBE), EnumSet.of(MetaState.NO_GLOBE));
+    } else {
+      updateMetaStates(EnumSet.of(MetaState.NO_GLOBE), EnumSet.of(MetaState.GLOBE));
+    }
+  }
+
+  private void updatePopUp(KeyEventContext keyEventContext, boolean isDelayedPopUp) {
+    PopUpPreview popUpPreview = popupPreviewPool.getInstance(keyEventContext.pointerId);
+    // Even if popup is disabled by preference, delayed popup (== popup for long-press)
+    // is shown otherwise a user cannot know how long (s)he has to press the key
+    // to get a character corresponding to long-press.
+    if (popupEnabled || isDelayedPopUp) {
+      popUpPreview.showIfNecessary(
+          keyEventContext.key, keyEventContext.getCurrentPopUp(), isDelayedPopUp);
+    } else {
+      popUpPreview.dismiss();
+    }
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
index e1d10d6..8cd0023 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
@@ -32,8 +32,11 @@
 import org.mozc.android.inputmethod.japanese.MemoryManageable;
 import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
+import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.graphics.Bitmap;
@@ -49,6 +52,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.annotation.Nullable;
+
 /**
  * Implementation of the background surface for {@link KeyboardView}.
  * This class takes care of double-buffering and diff-only-updating to improve the rendering
@@ -73,7 +78,7 @@
  * backgroundSurface.requestUpdateKey(key3, Flick.Direction.RIGHT);
  *
  * // Set flick direction to null means the key is released.
- * backgroundSurface.requestUpdateKey(key1, null);
+ * backgroundSurface.requestUpdateKey(key1, Optional.<Direction>absent());
  *
  * // Actual update is done below.
  * backgroundSurface.update();
@@ -85,12 +90,12 @@
  * This class is exposed as public in order to mock for testing purpose.
  *
  */
-public class KeyboardViewBackgroundSurface implements MemoryManageable {
+@VisibleForTesting public class KeyboardViewBackgroundSurface implements MemoryManageable {
 
   /**
    * A simple rendering related utilities for keyboard rendering.
    */
-  interface SurfaceCanvas {
+  @VisibleForTesting interface SurfaceCanvas {
 
     /**
      * Clears a rectangle region of
@@ -123,12 +128,11 @@
     private final Canvas canvas;
 
     SurfaceCanvasImpl(Canvas canvas) {
-      this.canvas = canvas;
+      this.canvas = Preconditions.checkNotNull(canvas);
     }
 
     @Override
     public void clearRegion(int x, int y, int width, int height) {
-      Canvas canvas = this.canvas;
       int saveCount = canvas.save();
       try {
         canvas.clipRect(x, y, x + width, y + height, Op.REPLACE);
@@ -139,7 +143,7 @@
     }
 
     @Override
-    public void drawDrawable(Drawable drawable, int x, int y, int width, int height) {
+    public void drawDrawable(@Nullable Drawable drawable, int x, int y, int width, int height) {
       if (drawable == null) {
         return;
       }
@@ -149,7 +153,7 @@
 
     @Override
     public void drawDrawableAtCenterWithKeepAspectRatio(
-        Drawable drawable, int x, int y, int width, int height) {
+        @Nullable Drawable drawable, int x, int y, int width, int height) {
       if (drawable == null) {
         return;
       }
@@ -164,8 +168,6 @@
 
     private void drawDrawableInternal(Drawable drawable, int x, int y, int width, int height,
                                       float scale) {
-      Canvas canvas = this.canvas;
-
       int saveCount = canvas.save();
       try {
         canvas.translate(x, y);
@@ -205,24 +207,23 @@
   private final BackgroundDrawableFactory backgroundDrawableFactory;
   private final DrawableCache drawableCache;
 
-  public KeyboardViewBackgroundSurface(
-      BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
-    this.backgroundDrawableFactory = backgroundDrawableFactory;
-    this.drawableCache = drawableCache;
-  }
-
   // The current image and its rendering object.
-  // surfaceCanvas is package private for testing purpose.
-  private Bitmap surfaceBitmap;
-  SurfaceCanvas surfaceCanvas;
+  private Optional<Bitmap> surfaceBitmap = Optional.absent();
+  @VisibleForTesting Optional<SurfaceCanvas> surfaceCanvas = Optional.absent();
 
   // Width and height this background surface is to be in pixels
   private int requestedWidth;
   private int requestedHeight;
 
   private boolean fullUpdateRequested;
-  private Keyboard requestedKeyboard;
-  private Set<MetaState> requestedMetaState;
+  private Optional<Keyboard> requestedKeyboard = Optional.absent();
+  private Set<MetaState> requestedMetaState = Collections.emptySet();
+
+  public KeyboardViewBackgroundSurface(
+      BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
+    this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+    this.drawableCache = Preconditions.checkNotNull(drawableCache);
+  }
 
   /**
    * A set of pending keys to be updated.
@@ -233,29 +234,30 @@
    * TODO(hidehiko): We should have direction state in somewhere else, not in the pending requests,
    *   so that we can re-render the correct image even if we have any sequence of requests.
    */
-  private final Map<Key, Flick.Direction> pendingKeys = new HashMap<Key, Flick.Direction>();
+  @VisibleForTesting
+  final Map<Key, Optional<Flick.Direction>> pendingKeys =
+      new HashMap<Key, Optional<Flick.Direction>>();
 
   /**
    * Resets and release the current image this instance holds.
    * By this method's invocation, we assume all key's directions are also reset.
    */
   public void reset() {
-    if (surfaceBitmap != null) {
-      surfaceBitmap.recycle();
-      surfaceBitmap = null;
+    if (surfaceBitmap.isPresent()) {
+      surfaceBitmap.get().recycle();
+      surfaceBitmap = Optional.absent();
     }
-    surfaceCanvas = null;
+    surfaceCanvas = Optional.absent();
     pendingKeys.clear();
   }
 
   /**
    * Adds the given {@code key} to the pending key set to render it lazily.
    * In other words, the key isn't rendered until {@link #update()} is invoked.
-   * If {@code key} is {@code null}, it will be just ignored.
    */
-  public void requestUpdateKey(Key key, Flick.Direction flickDirection) {
-    if ((key != null) && !key.isSpacer()) {
-      pendingKeys.put(key, flickDirection);
+  public void requestUpdateKey(Key key, Optional<Flick.Direction> flickDirection) {
+    if (!Preconditions.checkNotNull(key).isSpacer()) {
+      pendingKeys.put(key, Preconditions.checkNotNull(flickDirection));
     }
   }
 
@@ -273,7 +275,7 @@
    * This also cancels all key's direction for now.
    */
   public void requestUpdateKeyboard(Keyboard keyboard, Set<MetaState> metaState) {
-    requestedKeyboard = Preconditions.checkNotNull(keyboard);
+    requestedKeyboard = Optional.of(keyboard);
     requestedMetaState = Preconditions.checkNotNull(metaState);
     fullUpdateRequested = true;
 
@@ -283,6 +285,41 @@
   }
 
   /**
+   * Requests new {@code metaState} to be rendered on this surface.
+   *
+   * This method requests redraw only the keys which are required to be redrawn according to
+   * metastate's change.
+   * This also cancels such keys' direction for now.
+   */
+  public void requestMetaState(Set<MetaState> newMetaState) {
+    Preconditions.checkNotNull(newMetaState);
+
+    Set<MetaState> previousMetaState = requestedMetaState;
+    requestedMetaState = newMetaState;
+
+    if (newMetaState.equals(previousMetaState) || !requestedKeyboard.isPresent()) {
+      return;
+    }
+
+    // Update only the keys which should update corresponding KeyState based on given metaState.
+    for (Row row : requestedKeyboard.get().getRowList()) {
+      for (Key key : row.getKeyList()) {
+        KeyState previousKeyState = key.getKeyState(previousMetaState).orNull();
+        KeyState newKeyState = key.getKeyState(newMetaState).orNull();
+        // Intentionally using != operator instead of equals method.
+        // - Faster than full-spec equals method.
+        // - The values of Optional which are returned by Key#getKeyState are always
+        //   the same object so equals is overkill.
+        if (previousKeyState != newKeyState) {
+          // Request to draw the key.
+          // pendingKeys may have already contained corresponding key but overwrite here.
+          pendingKeys.put(key, Optional.<Direction>absent());
+        }
+      }
+    }
+  }
+
+  /**
    * Actually updates the image this instance holds based on pending update requests.
    */
   public void update() {
@@ -292,7 +329,7 @@
       fullUpdateRequested = true;
     }
 
-    if (requestedKeyboard == null) {
+    if (!requestedKeyboard.isPresent()) {
       // We have nothing to do.
       return;
     }
@@ -311,25 +348,26 @@
   }
 
   /**
-   * Returns {@code true} iff (re-)initialization is needed. This method is package private
-   * just for testing purpose.
+   * Returns {@code true} iff (re-)initialization is needed.
    */
-  boolean isInitializationNeeded() {
+  @VisibleForTesting boolean isInitializationNeeded() {
     // We need to re-create background buffer if
     // - no initialization is done (after construction or reset).
     // - the size of view has been changed.
-    Bitmap bitmap = this.surfaceBitmap;
-    return (bitmap == null)
-        || (bitmap.getWidth() != requestedWidth)
-        || (bitmap.getHeight() != requestedHeight);
+    Optional<Bitmap> bitmap = surfaceBitmap;
+    return (!bitmap.isPresent())
+        || (bitmap.get().getWidth() != requestedWidth)
+        || (bitmap.get().getHeight() != requestedHeight);
   }
 
   void initialize() {
-    if (surfaceBitmap != null) {
-      surfaceBitmap.recycle();
+    if (surfaceBitmap.isPresent()) {
+      surfaceBitmap.get().recycle();
     }
-    surfaceBitmap = MozcUtil.createBitmap(requestedWidth, requestedHeight, Bitmap.Config.ARGB_8888);
-    surfaceCanvas = new SurfaceCanvasImpl(new Canvas(surfaceBitmap));
+    surfaceBitmap = Optional.of(
+        MozcUtil.createBitmap(requestedWidth, requestedHeight, Bitmap.Config.ARGB_8888));
+    surfaceCanvas = Optional.<SurfaceCanvas>of(
+        new SurfaceCanvasImpl(new Canvas(surfaceBitmap.get())));
   }
 
   /**
@@ -337,57 +375,84 @@
    * It is required to invoke update() method before this method's invocation.
    */
   public void draw(Canvas canvas) {
-    canvas.drawBitmap(surfaceBitmap, requestedKeyboard.contentLeft, requestedKeyboard.contentTop,
-                      null);
+    canvas.drawBitmap(
+        surfaceBitmap.orNull(), requestedKeyboard.get().contentLeft,
+        requestedKeyboard.get().contentTop, null);
   }
 
   private void clearCanvas() {
-    Bitmap bitmap = this.surfaceBitmap;
-    surfaceCanvas.clearRegion(0, 0, bitmap.getWidth(), bitmap.getHeight());
+    if (surfaceBitmap.isPresent() && surfaceCanvas.isPresent()) {
+      Bitmap bitmap = surfaceBitmap.get();
+      surfaceCanvas.get().clearRegion(0, 0, bitmap.getWidth(), bitmap.getHeight());
+    }
   }
 
-  private void renderKey(Key key, Flick.Direction flickDirection) {
+  private void renderKey(Key key, Optional<Flick.Direction> flickDirection) {
+    Preconditions.checkNotNull(key);
+    Preconditions.checkNotNull(flickDirection);
+    Preconditions.checkState(surfaceCanvas.isPresent());
+    Preconditions.checkState(requestedKeyboard.isPresent());
+    SurfaceCanvas canvas = surfaceCanvas.get();
+
     int horizontalGap = key.getHorizontalGap();
     int leftGap = horizontalGap / 2;
-    boolean isPressed = flickDirection != null;
+    boolean isPressed = flickDirection.isPresent();
 
     // We split the gap to both sides evenly.
-    int x = key.getX() + leftGap - requestedKeyboard.contentLeft;
-    int y = key.getY() - requestedKeyboard.contentTop;
-    int width = key.getWidth() - horizontalGap;
-    int height = key.getHeight();
+    int x = key.getX() + leftGap - requestedKeyboard.get().contentLeft;
+    int y = key.getY() - requestedKeyboard.get().contentTop;
+    // Given width/height for the key.
+    // The icon is drawn inside the width/height.
+    int givenWidth = key.getWidth() - horizontalGap;
+    int givenHeight = key.getHeight();
 
-    KeyEntity keyEntity = getKeyEntityForRendering(key, requestedMetaState, flickDirection);
-    surfaceCanvas.drawDrawable(getKeyBackground(keyEntity, isPressed), x, y, width, height);
-    if (keyEntity != null && keyEntity.isFlickHighlightEnabled() &&
-        KeyEventContext.getKeyEntity(key, requestedMetaState, flickDirection) == keyEntity) {
-      surfaceCanvas.drawDrawable(
-          backgroundDrawableFactory.getDrawable(FLICK_DRAWABLE_TYPE_MAP.get(flickDirection)),
-          x, y, width, height);
+    canvas.drawDrawable(getKeyBackground(key, isPressed).orNull(), x, y, givenWidth, givenHeight);
+    Optional<KeyEntity> keyEntity =
+        getKeyEntityForRendering(key, requestedMetaState, flickDirection);
+    if (flickDirection.isPresent() && keyEntity.isPresent()
+        && keyEntity.get().isFlickHighlightEnabled()
+        && KeyEventContext.getKeyEntity(key, requestedMetaState, flickDirection)
+            .equals(keyEntity)) {
+      DrawableType drawableType = FLICK_DRAWABLE_TYPE_MAP.get(flickDirection.get());
+      Drawable backgroundDrawable = (drawableType != null)
+          ? backgroundDrawableFactory.getDrawable(drawableType) : null;
+      canvas.drawDrawable(backgroundDrawable, x, y, givenWidth, givenHeight);
     }
-    surfaceCanvas.drawDrawableAtCenterWithKeepAspectRatio(
-        getKeyIcon(drawableCache, keyEntity, isPressed), x, y, width, height);
+    int horizontalPadding = keyEntity.isPresent() ? keyEntity.get().getHorizontalPadding() : 0;
+    int verticalPadding = keyEntity.isPresent() ? keyEntity.get().getVerticalPadding() : 0;
+    int iconWidth = keyEntity.isPresent() ? keyEntity.get().getIconWidth() : givenWidth;
+    int iconHeight = keyEntity.isPresent() ? keyEntity.get().getIconHeight() : givenHeight;
+    iconWidth = Math.min(iconWidth, givenWidth - horizontalPadding * 2);
+    iconHeight = Math.min(iconHeight, givenHeight - verticalPadding * 2);
+    canvas.drawDrawableAtCenterWithKeepAspectRatio(
+        getKeyIcon(drawableCache, keyEntity, isPressed).orNull(),
+        x + (givenWidth - iconWidth) / 2, y + (givenHeight - iconHeight) / 2,
+        iconWidth, iconHeight);
   }
 
   /**
    * Draws all keys in the keyboard.
    */
   private void renderKeyboard() {
-    for (Row row : requestedKeyboard.getRowList()) {
+    for (Row row : requestedKeyboard.get().getRowList()) {
       for (Key key : row.getKeyList()) {
-        if (!key.isSpacer()) {
-          renderKey(key, pendingKeys.get(key));
+        Optional<Direction> direction = pendingKeys.get(key);
+        if (direction == null) {
+          renderKey(key, Optional.<Direction>absent());
+        } else {
+          renderKey(key, direction);
         }
       }
     }
   }
 
   private void renderPendingKeys() {
+    Preconditions.checkState(surfaceCanvas.isPresent());
     // The canvas object is used many times, so cache it on local stack.
-    SurfaceCanvas canvas = this.surfaceCanvas;
-    int offsetX = requestedKeyboard.contentLeft;
-    int offsetY = requestedKeyboard.contentTop;
-    for (Map.Entry<Key, Flick.Direction> entry : pendingKeys.entrySet()) {
+    SurfaceCanvas canvas = surfaceCanvas.get();
+    int offsetX = requestedKeyboard.get().contentLeft;
+    int offsetY = requestedKeyboard.get().contentTop;
+    for (Map.Entry<Key, Optional<Flick.Direction>> entry : pendingKeys.entrySet()) {
       Key key = entry.getKey();
 
       // Clear the key's region and then draw the key there.
@@ -399,55 +464,52 @@
 
   /**
    * Returns KeyEntity which should be used for the {@code key}'s rendering with the given state.
-   * {@code null} will be returned if we don't need to render the key.
-   * This is package private for testing purpose.
+   * {@code Optional.absent()} will be returned if we don't need to render the key.
    */
-  static KeyEntity getKeyEntityForRendering(
-      Key key, Set<MetaState> metaState, Flick.Direction flickDirection) {
-    if (flickDirection != null) {
+  @VisibleForTesting static Optional<KeyEntity> getKeyEntityForRendering(
+      Key key, Set<MetaState> metaState, Optional<Flick.Direction> flickDirection) {
+    if (flickDirection.isPresent()) {
       // If the key is under flick state, check if there is corresponding key entity for the
       // direction first.
-      KeyEntity keyEntity = KeyEventContext.getKeyEntity(key, metaState, flickDirection);
-      if (keyEntity != null) {
+      Optional<KeyEntity> keyEntity = KeyEventContext.getKeyEntity(key, metaState, flickDirection);
+      if (keyEntity.isPresent()) {
         return keyEntity;
       }
     }
 
     // Use CENTER direction for released key, or a key flicked to a unsupported direction.
-    return KeyEventContext.getKeyEntity(key, metaState, Flick.Direction.CENTER);
+    return KeyEventContext.getKeyEntity(key, metaState, Optional.of(Flick.Direction.CENTER));
   }
 
-  private static Drawable setDrawableState(Drawable drawable, boolean isPressed) {
-    if (drawable != null) {
-      drawable.setState(isPressed ? STATE_PRESSED : STATE_DEFAULT);
+  private static Optional<Drawable> setDrawableState(
+      Optional<Drawable> drawable, boolean isPressed) {
+    if (drawable.isPresent()) {
+      drawable.get().setState(isPressed ? STATE_PRESSED : STATE_DEFAULT);
     }
     return drawable;
   }
 
   /**
    * Returns {@code Drawable} for the given key's background with setting appropriate state.
-   * This method is package private just for testing purpose.
    */
-  Drawable getKeyBackground(KeyEntity keyEntity, boolean isPressed) {
-    if (keyEntity == null) {
-      return null;
-    }
+  @VisibleForTesting Optional<Drawable> getKeyBackground(Key key, boolean isPressed) {
+    Preconditions.checkNotNull(key);
     return setDrawableState(
-        backgroundDrawableFactory.getDrawable(keyEntity.getKeyBackgroundDrawableType()),
+        Optional.of(backgroundDrawableFactory.getDrawable(key.getKeyBackgroundDrawableType())),
         isPressed);
  }
 
   /**
    * Returns {@code Drawable} for the given key's icon with setting appropriate state.
-   * This method is package private just for testing purpose.
    */
-  static Drawable getKeyIcon(
-      DrawableCache drawableCache, KeyEntity keyEntity, boolean isPressed) {
-    if (keyEntity == null) {
-      return null;
+  @VisibleForTesting static Optional<Drawable> getKeyIcon(
+      DrawableCache drawableCache, Optional<KeyEntity> keyEntity, boolean isPressed) {
+    if (!keyEntity.isPresent()) {
+      return Optional.absent();
     }
+
     return setDrawableState(
-        drawableCache.getDrawable(keyEntity.getKeyIconResourceId()).orNull(), isPressed);
+        drawableCache.getDrawable(keyEntity.get().getKeyIconResourceId()), isPressed);
   }
 
   @Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
index ffc11be..81527cc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
@@ -29,29 +29,36 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+
 /**
  */
 public class PopUp {
+
   private final int popUpIconResourceId;
-  private final int width;
+  private final int longPressPopUpIconResourceId;
   private final int height;
   private final int xOffset;
   private final int yOffset;
+  private final int iconWidth;
+  private final int iconHeight;
 
-  public PopUp(int popUpIconResourceId, int width, int height, int xOffset, int yOffset) {
+  public PopUp(int popUpIconResourceId, int popUpLongPressIconResourceId,
+               int height, int xOffset, int yOffset, int iconWidth, int iconHeight) {
     this.popUpIconResourceId = popUpIconResourceId;
-    this.width = width;
+    this.longPressPopUpIconResourceId = popUpLongPressIconResourceId;
     this.height = height;
     this.xOffset = xOffset;
     this.yOffset = yOffset;
+    this.iconWidth = iconWidth;
+    this.iconHeight = iconHeight;
   }
 
   public int getPopUpIconResourceId() {
     return popUpIconResourceId;
   }
 
-  public int getWidth() {
-    return width;
+  public int getPopUpLongPressIconResourceId() {
+    return longPressPopUpIconResourceId;
   }
 
   public int getHeight() {
@@ -65,4 +72,12 @@
   public int getYOffset() {
     return yOffset;
   }
+
+  public int getIconWidth() {
+    return iconWidth;
+  }
+
+  public int getIconHeight() {
+    return iconHeight;
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
index a14ca79..727ce16 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
@@ -30,18 +30,21 @@
 package org.mozc.android.inputmethod.japanese.keyboard;
 
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.ui.PopUpLayouter;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
+import android.annotation.SuppressLint;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.util.SparseArray;
-import android.view.Gravity;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import java.util.ArrayList;
@@ -57,7 +60,7 @@
  * Production clients shouldn't use this class from outside of this package.
  *
  */
-public class PopUpPreview {
+@VisibleForTesting public class PopUpPreview {
 
   /**
    * For performance reason, we want to reuse instances of {@link PopUpPreview}.
@@ -68,6 +71,7 @@
    *
    */
   static class Pool {
+
     // Typically 2 or 3 popups are shown in maximum.
     private final SparseArray<PopUpPreview> pool = new SparseArray<PopUpPreview>(3);
     private final List<PopUpPreview> freeList = new ArrayList<PopUpPreview>();
@@ -78,13 +82,13 @@
 
     Pool(View parent, Looper looper,
          BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
-      this.parent = parent;
-      this.backgroundDrawableFactory = backgroundDrawableFactory;
-      this.drawableCache = drawableCache;
-      this.dismissHandler = new Handler(looper, new Handler.Callback() {
+      this.parent = Preconditions.checkNotNull(parent);
+      this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+      this.drawableCache = Preconditions.checkNotNull(drawableCache);
+      this.dismissHandler = new Handler(Preconditions.checkNotNull(looper), new Handler.Callback() {
         @Override
         public boolean handleMessage(Message message) {
-          PopUpPreview preview = PopUpPreview.class.cast(message.obj);
+          PopUpPreview preview = PopUpPreview.class.cast(Preconditions.checkNotNull(message).obj);
           preview.dismiss();
           freeList.add(preview);
           return true;
@@ -133,96 +137,81 @@
     }
   }
 
-  private static final float POPUP_VIEW_PADDING = 12f;
-
-  private final int padding;
-  private final View parent;
   private final BackgroundDrawableFactory backgroundDrawableFactory;
   private final DrawableCache drawableCache;
-  @VisibleForTesting final ImageView popupView;
+  @VisibleForTesting final PopUpLayouter<ImageView> popUp;
 
   protected PopUpPreview(
       View parent, BackgroundDrawableFactory backgroundDrawableFactory,
       DrawableCache drawableCache) {
-    this.parent = parent;
-    this.backgroundDrawableFactory = backgroundDrawableFactory;
-    this.drawableCache = drawableCache;
-    this.popupView = new ImageView(parent.getContext());
-    popupView.setVisibility(View.GONE);
-    View rootView = parent.getRootView();
-    if (rootView != null) {
-      FrameLayout screenContent =
-          FrameLayout.class.cast(rootView.findViewById(android.R.id.content));
-      if (screenContent != null) {
-        screenContent.addView(
-            popupView, new FrameLayout.LayoutParams(0, 0, Gravity.LEFT | Gravity.TOP));
-      }
-    }
-    padding = (int) (popupView.getResources().getDisplayMetrics().density * POPUP_VIEW_PADDING);
+    this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+    this.drawableCache = Preconditions.checkNotNull(drawableCache);
+    ImageView popUpView = new ImageView(Preconditions.checkNotNull(parent).getContext());
+    // To use Canvas#drawPicture(), the view shouldn't be h/w accelerated.
+    popUpView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+    popUpView.setVisibility(View.GONE);
+    this.popUp = new PopUpLayouter<ImageView>(parent, popUpView);
   }
 
   /**
-   * Shows the popup preview of the given {@code key} and {@code popup} if needed.
+   * Shows the pop-up preview of the given {@code key} and {@code optionalPopup} if needed.
    */
+  @SuppressLint("NewApi")
   @SuppressWarnings("deprecation")
-  protected void showIfNecessary(Key key, PopUp popup) {
-    if (key == null || popup == null) {
-      // No images to be rendered.
+  protected void showIfNecessary(Key key, Optional<PopUp> optionalPopup, boolean isDelayedPopup) {
+    Preconditions.checkNotNull(key);
+    if (!Preconditions.checkNotNull(optionalPopup).isPresent()) {
+      hidePopupView();
+      return;
+    }
+    PopUp popup = optionalPopup.get();
+    Optional<Drawable> popUpIconDrawable = drawableCache.getDrawable(isDelayedPopup
+        ? popup.getPopUpLongPressIconResourceId() : popup.getPopUpIconResourceId());
+    if (!popUpIconDrawable.isPresent()) {
       hidePopupView();
       return;
     }
 
-    // Set images.
-    popupView.setImageDrawable(drawableCache.getDrawable(popup.getPopUpIconResourceId()).orNull());
+    ImageView popupView = popUp.getContentView();
+    Resources resources = popupView.getContext().getResources();
+    float density = resources.getDisplayMetrics().density;
+    int popUpWindowPadding = (int) (BackgroundDrawableFactory.POPUP_WINDOW_PADDING * density);
+    int width =
+        Math.min(key.getWidth(), resources.getDimensionPixelSize(R.dimen.popup_width_limitation))
+        + popUpWindowPadding * 2;
+    int height = popup.getHeight() + popUpWindowPadding * 2;
+
+    popupView.setImageDrawable(popUpIconDrawable.get());
     popupView.setBackgroundDrawable(
         backgroundDrawableFactory.getDrawable(DrawableType.POPUP_BACKGROUND_WINDOW));
-    popupView.setPadding(padding, padding, padding, padding);
 
-    // Calculate the location to show the popup in window's coordinate system.
+    Preconditions.checkState(popup.getIconWidth() != 0 || popup.getIconHeight() != 0);
+    int horizontalPadding = (popup.getIconWidth() == 0)
+        ? popUpWindowPadding : (width - popup.getIconWidth()) / 2;
+    int verticalPadding = (popup.getIconHeight() == 0)
+        ? popUpWindowPadding : (height - popup.getIconHeight()) / 2;
+    popupView.setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding);
+
+    // Calculate the location to show the pop-up in window's coordinate system.
     int centerX = key.getX() + key.getWidth() / 2;
     int centerY = key.getY() + key.getHeight() / 2;
 
-    int width = popup.getWidth();
-    int height = popup.getHeight();
-
-    ViewGroup.LayoutParams layoutParams = popupView.getLayoutParams();
-    if (layoutParams != null) {
-      layoutParams.width = width;
-      layoutParams.height = height;
-    }
-
-    if (MarginLayoutParams.class.isInstance(layoutParams)) {
-      int x = centerX + popup.getXOffset() - width / 2;
-      int y = centerY + popup.getYOffset() - height / 2;
-
-      int[] location = new int[2];
-      parent.getLocationInWindow(location);
-      x += location[0];
-      y += location[1];
-
-      MarginLayoutParams marginLayoutParams = MarginLayoutParams.class.cast(layoutParams);
-      // Clip XY.
-      View root = View.class.cast(popupView.getParent());
-      if (root != null) {
-        x = Math.max(Math.min(x, root.getWidth() - width), 0);
-        y = Math.max(Math.min(y, root.getHeight() - height), 0);
-      }
-      marginLayoutParams.setMargins(x, y, 0, 0);
-    }
-    popupView.setLayoutParams(layoutParams);
+    int left = centerX + popup.getXOffset() - width / 2;
+    int top = centerY + popup.getYOffset() - height / 2;
+    popUp.setBounds(left, top, left + width, top + height);
     popupView.setVisibility(View.VISIBLE);
   }
 
   /**
    * Hides the pop up preview.
-   * protected only for testing.
    */
-  protected void dismiss() {
+  void dismiss() {
     hidePopupView();
   }
 
   @SuppressWarnings("deprecation")
   private void hidePopupView() {
+    ImageView popupView = popUp.getContentView();
     popupView.setVisibility(View.GONE);
     popupView.setImageDrawable(null);
     popupView.setBackgroundDrawable(null);
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
index 9f646cf..507388f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
@@ -29,7 +29,6 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
 import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.MozcUtil;
@@ -64,8 +63,6 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.Nullable;
-
 /**
  * An object which guesses probable key events for typing correction feature.
  *
@@ -90,7 +87,7 @@
    */
   @VisibleForTesting
   interface StatsFileAccessor {
-    InputStream openStream(JapaneseKeyboard japaneseKeyboard, Configuration configuration)
+    InputStream openStream(Keyboard keyboard, Configuration configuration)
         throws IOException;
   }
 
@@ -104,8 +101,8 @@
     private final List<String> assetFileNames;
 
     StatsFileAccessorImpl(AssetManager assetManager) {
-      this.assetManager = assetManager;
-      this.assetFileNames = getAssetFileNameList(assetManager);
+      this.assetManager = Preconditions.checkNotNull(assetManager);
+      this.assetFileNames = Preconditions.checkNotNull(getAssetFileNameList(assetManager));
     }
 
     private static List<String> getAssetFileNameList(AssetManager assetManager) {
@@ -118,15 +115,17 @@
     }
 
     @Override
-    public InputStream openStream(JapaneseKeyboard japaneseKeyboard, Configuration configuration)
+    public InputStream openStream(Keyboard keyboard, Configuration configuration)
         throws IOException {
+      Preconditions.checkNotNull(keyboard);
+      Preconditions.checkNotNull(configuration);
+
       String baseName =
-          japaneseKeyboard.getSpecification().getKeyboardSpecificationName().baseName;
+          keyboard.getSpecification().getKeyboardSpecificationName().baseName;
       String orientation = KeyboardSpecificationName.getDeviceOrientationString(configuration);
       String fileName = String.format("%s_%s.touch_stats", baseName, orientation);
-      if (fileName.indexOf(File.separator) != -1) {
-        throw new IllegalArgumentException("fileName shouldn't include separator.");
-      }
+      Preconditions.checkArgument(
+          fileName.indexOf(File.separator) == -1, "fileName shouldn't include separator.");
       for (String file : assetFileNames) {
         if (file.equals(fileName)) {
           return assetManager.open(fileName);
@@ -157,6 +156,8 @@
     @Override
     public double getLikelihood(float firstX, float firstY, float deltaX, float deltaY,
         float[] probableEvent) {
+      Preconditions.checkNotNull(probableEvent);
+
       float sdx = firstX - probableEvent[START_X_AVG];
       float sdy = firstY - probableEvent[START_Y_AVG];
       // Keys that are too far away from user's touch-down position
@@ -198,32 +199,34 @@
       void updateStats(String formattedKeyboardName, SparseArray<float[]> stats);
     }
 
-    private final JapaneseKeyboard japaneseKeyboard;
+    private final Keyboard keyboard;
     private final Configuration configuration;
     private final StatsFileAccessor statsFileAccessor;
     private final UpdateStatsListener updateStatsListener;
 
     /**
      * @param statsFileAccessor an accessor for stats files. Must be non-null.
-     * @param japaneseKeyboard a {@link JapaneseKeyboard} to specify the file to be loaded.
+     * @param keyboard a {@link Keyboard} to specify the file to be loaded.
      * @param configuration a {@link Configuration} to specify the file to be loaded
      * @param formattedKeyboardNameToStats a {@link Map} to be updated. Must be non-null.
      * @param updateStatsExecutor an Executor on which the result is propagated
      */
     private StatisticsLoader(
         StatsFileAccessor statsFileAccessor,
-        JapaneseKeyboard japaneseKeyboard,
+        Keyboard keyboard,
         Configuration configuration,
         final Map<String, SparseArray<float[]>> formattedKeyboardNameToStats,
         final Executor updateStatsExecutor) {
       this(
           statsFileAccessor,
-          japaneseKeyboard,
+          keyboard,
           configuration,
           new UpdateStatsListener() {
             @Override
             public void updateStats(final String formattedKeyboardName,
                                     final SparseArray<float[]> stats) {
+              Preconditions.checkNotNull(formattedKeyboardName);
+              Preconditions.checkNotNull(stats);
               updateStatsExecutor.execute(new Runnable() {
                 @Override
                 public void run() {
@@ -234,14 +237,13 @@
           });
     }
 
-    // For testing purpose.
     @VisibleForTesting
     StatisticsLoader(StatsFileAccessor statsFileAccessor,
-        JapaneseKeyboard japaneseKeyboard,
+        Keyboard keyboard,
         Configuration configuration,
         UpdateStatsListener updateStatsListener) {
       this.statsFileAccessor = Preconditions.checkNotNull(statsFileAccessor);
-      this.japaneseKeyboard = Preconditions.checkNotNull(japaneseKeyboard);
+      this.keyboard = Preconditions.checkNotNull(keyboard);
       this.configuration = Preconditions.checkNotNull(configuration);
       this.updateStatsListener = Preconditions.checkNotNull(updateStatsListener);
     }
@@ -275,7 +277,7 @@
       SparseArray<float[]> result = new SparseArray<float[]>(MAX_KEY_NUMBER_IN_KEYBOARD);
       InputStream inputStream = null;
       try {
-        inputStream = statsFileAccessor.openStream(japaneseKeyboard, configuration);
+        inputStream = statsFileAccessor.openStream(keyboard, configuration);
         readStream(new DataInputStream(inputStream), result);
       } catch (IOException e) {
         MozcLog.d("Stream access fails.", e);
@@ -290,7 +292,7 @@
         }
       }
       // Successfully loaded the file so call back updateStatsListener.
-      String formattedKeyboardName = japaneseKeyboard.getSpecification()
+      String formattedKeyboardName = keyboard.getSpecification()
           .getKeyboardSpecificationName().formattedKeyboardName(configuration);
       updateStatsListener.updateStats(formattedKeyboardName, result);
     }
@@ -351,14 +353,14 @@
   // Invoked from the thread which dataLoadExecutor uses.
   private final Executor dataPropagationExecutor;
 
-  // Current JapaneseKeyboard.
-  private Optional<JapaneseKeyboard> japaneseKeyboard = Optional.absent();
+  // Current Keyboard.
+  private Optional<Keyboard> keyboard = Optional.absent();
 
   // Current Configuration.
   private Optional<Configuration> configuration = Optional.absent();
 
   // Formatted keyboard name.
-  // This can be calculated from japaneseKeyboard and configuration so is derivative variable.
+  // This can be calculated from keyboard and configuration so is derivative variable.
   // Just for cache.
   private Optional<String> formattedKeyboardName = Optional.absent();
 
@@ -410,17 +412,16 @@
   }
 
   /**
-   * Sets a {@link JapaneseKeyboard}.
+   * Sets a {@link Keyboard}.
    *
    * This invocation might load a stats data file (typically) asynchronously.
    * Before the loading has finished
    * {@link #getProbableKeyEvents(List)} cannot return any probable key events.
    * @see #getProbableKeyEvents(List)
-   * @param japaneseKeyboard a {@link JapaneseKeyboard} to be set.
-   * If null {@link #getProbableKeyEvents(List)} will return null.
+   * @param keyboard a {@link Keyboard} to be set.
    */
-  public void setJapaneseKeyboard(@Nullable JapaneseKeyboard japaneseKeyboard) {
-    this.japaneseKeyboard = Optional.fromNullable(japaneseKeyboard);
+  public void setKeyboard(Keyboard keyboard) {
+    this.keyboard = Optional.of(keyboard);
     updateFormattedKeyboardName();
     maybeUpdateEventStatistics();
   }
@@ -428,11 +429,11 @@
   /**
    * Sets a {@link Configuration}.
    *
-   * Behaves almost the same as {@link #setJapaneseKeyboard(JapaneseKeyboard)}.
+   * Behaves almost the same as {@link #setKeyboard(Keyboard)}.
    * @param configuration a {@link Configuration} to be set.
    */
-  public void setConfiguration(@Nullable Configuration configuration) {
-    this.configuration = Optional.fromNullable(configuration);
+  public void setConfiguration(Optional<Configuration> configuration) {
+    this.configuration = Preconditions.checkNotNull(configuration);
     updateFormattedKeyboardName();
     maybeUpdateEventStatistics();
   }
@@ -441,11 +442,11 @@
    * Updates (cached) {@link #formattedKeyboardName}.
    */
   private void updateFormattedKeyboardName() {
-    if (!japaneseKeyboard.isPresent() || !configuration.isPresent()) {
+    if (!keyboard.isPresent() || !configuration.isPresent()) {
       formattedKeyboardName = Optional.absent();
       return;
     }
-    formattedKeyboardName = Optional.of(japaneseKeyboard.get()
+    formattedKeyboardName = Optional.of(keyboard.get()
                                                         .getSpecification()
                                                         .getKeyboardSpecificationName()
                                                         .formattedKeyboardName(
@@ -453,7 +454,7 @@
   }
 
   /**
-   * If stats for current JapaneseKeyboard and Configuration has not been loaded,
+   * If stats for current {@code Keyboard} and {@code Configuration} has not been loaded,
    * load and update it asynchronously.
    *
    * Loading queue contains only the latest task.
@@ -461,7 +462,7 @@
    */
   private void maybeUpdateEventStatistics() {
     if (!formattedKeyboardName.isPresent()
-        || !japaneseKeyboard.isPresent()
+        || !keyboard.isPresent()
         || !configuration.isPresent()) {
       return;
     }
@@ -471,7 +472,7 @@
       }
       dataLoadExecutor.execute(
           new StatisticsLoader(
-              statsFileAccessor, japaneseKeyboard.get(), configuration.get(),
+              statsFileAccessor, keyboard.get(), configuration.get(),
               formattedKeyboardNameToStats,
               dataPropagationExecutor));
     }
@@ -480,25 +481,25 @@
   /**
    * Calculates probable key events for given {@code touchEventList}.
    *
-   * A List is returned (null will not be returned).
    * If corresponding stats data has not been loaded yet (file access is done asynchronously),
    * empty list is returned.
    *
    * TODO(matsuzakit): Change the caller side which expects null-return-value,
    *                   before submitting this CL.
    *
-   * @param touchEventList a List of TouchEvents. If null, empty List is returned.
+   * @param touchEventList a List of TouchEvents.
    */
-  public List<ProbableKeyEvent> getProbableKeyEvents(
-      @Nullable List<? extends TouchEvent> touchEventList) {
+  public List<ProbableKeyEvent> getProbableKeyEvents(List<TouchEvent> touchEventList) {
+    Preconditions.checkNotNull(touchEventList);
+
     // This method's responsibility is to pre-check the condition.
     // Calculation itself is done in getProbableKeyEventsInternal method.
-    if (!japaneseKeyboard.isPresent() || !configuration.isPresent()) {
+    if (!keyboard.isPresent() || !configuration.isPresent()) {
       // Keyboard has not been set up.
       return Collections.emptyList();
     }
-    if (touchEventList == null || touchEventList.size() != 1) {
-      // If null || size == 0 , we can do nothing.
+    if (touchEventList.size() != 1) {
+      // If size == 0 , we can do nothing.
       // If size >= 2, this is special situation (saturating touch event) so do nothing.
       return Collections.emptyList();
     }
@@ -507,7 +508,7 @@
     if (eventStatistics == null) {
       // No corresponding stats is available. Returning null.
       // The stats we need might be pushed out from the LRU cache because of bulk-updates of
-      // JapaneseKeyboard or Configuration.
+      // Keyboard or Configuration.
       // For such case we invoke maybeUpdateEventStatistics method to load the stats.
       // This is very rare (and usually not happen) but just in case.
       maybeUpdateEventStatistics();
@@ -566,13 +567,14 @@
   private SparseArray<Double> getLikelihoodArray(SparseArray<float[]> eventStatistics,
                                                  float firstX, float firstY,
                                                  float deltaX, float deltaY) {
-    Preconditions.checkState(japaneseKeyboard.isPresent());
+    Preconditions.checkNotNull(eventStatistics);
+    Preconditions.checkState(keyboard.isPresent());
 
     SparseArray<Double> result = new SparseArray<Double>(eventStatistics.size());
-    JapaneseKeyboard japaneseKeyboard = this.japaneseKeyboard.get();
+    Keyboard keyboard = this.keyboard.get();
     for (int i = 0; i < eventStatistics.size(); ++i) {
       int sourceId = eventStatistics.keyAt(i);
-      int keyCode = japaneseKeyboard.getKeyCode(sourceId);
+      int keyCode = keyboard.getKeyCode(sourceId);
       // Special key or non-existent-key.
       // Don't produce probable key events.
       if (keyCode <= 0) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
index 611d807..08a1bd2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
@@ -29,6 +29,8 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import com.google.common.base.Preconditions;
+
 import java.util.Collections;
 import java.util.List;
 
@@ -50,7 +52,7 @@
   private final int verticalGap;
 
   public Row(List<? extends Key> keyList, int height, int verticalGap) {
-    this.keyList = Collections.unmodifiableList(keyList);
+    this.keyList = Collections.unmodifiableList(Preconditions.checkNotNull(keyList));
     this.height = height;
     this.verticalGap = verticalGap;
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java b/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
index df2a0ae..57cc82e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
@@ -29,8 +29,9 @@
 
 package org.mozc.android.inputmethod.japanese.model;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import com.google.common.base.Optional;
@@ -50,22 +51,19 @@
  * <li>{@code qwertyLayoutForAlphabet}
  * </ul>
  *
- * We have two {@code KeyboardLayout}, which are {@code TWELVE_KEY} and {@code QWERTY},
- * and one experimental layout, {@code GODAN}.
- *
  * For {@code TWLEVE_KEY} layout, we have three {@code InputStyle}, which are {@code TOGGLE},
  * {@code FLICK} and {@code TOGGLE_FLICK}.
  * Also, users can use {@code QWERTY} style layout for alphabet mode by setting
  * {@code qwertyLayoutForAlphabet} {@code true}.
  *
- * {@code TWLEVE_KEY} layout has mainly three {@code KeyboardMode}, which are {@code KANA},
- * {@code ALPHABET} and {@code KANA_NUMBER}. If a user uses {@code QWERTY} style layout for
- * alphabet mode, s/he can use {@code ALPHABET_NUMBER} mode, which is {@code QWERTY} style number
- * key layout, as well in addition to the three {@code KeyboardMode}.
+ * {@code TWLEVE_KEY} layout has two {@code KeyboardMode}, which are {@code KANA}, {@code ALPHABET}.
  *
- * For {@code QWERTY} layout, we have four {@code KeyboardMode}, which are {@code KANA},
- * {@code ALPHABET}, {@code KANA_NUMBER} and {@code ALPHABET_NUMBER}. The parameters,
- * {@code InputStyle} and {@code qwertyLayoutForAlphabet}, are simply ignored.
+ * On {@code SymbolInputView}, we have a special {@code KeyboardMode}, which is
+ * {@code SYMBOL_NUMBER}. It is NOT used on normal view.
+ *
+ * For {@code QWERTY} layout, we have two {@code KeyboardMode}, which are {@code KANA},
+ * {@code ALPHABET}. The parameters, {@code InputStyle} and {@code qwertyLayoutForAlphabet}, are
+ * simply ignored.
  *
  * This class manages the "default mode" of software keyboard depending on {@code inputType}.
  * It is expected that the {@code inputType} is given by system via
@@ -79,7 +77,7 @@
    * Keyboard mode that indicates supported character types.
    */
   public enum KeyboardMode {
-    KANA, ALPHABET, KANA_NUMBER, ALPHABET_NUMBER,
+    KANA, ALPHABET, ALPHABET_NUMBER, NUMBER, SYMBOL_NUMBER,
   }
 
   private KeyboardLayout keyboardLayout = KeyboardLayout.TWELVE_KEYS;
@@ -160,24 +158,24 @@
     }
   }
 
-  private static Optional<KeyboardMode> getPreferredKeyboardMode(
+  public static Optional<KeyboardMode> getPreferredKeyboardMode(
       int inputType, KeyboardLayout layout) {
-    Preconditions.checkNotNull(layout);
-    switch (inputType & InputType.TYPE_MASK_CLASS) {
-      case InputType.TYPE_CLASS_DATETIME:
-      case InputType.TYPE_CLASS_PHONE:
-      case InputType.TYPE_CLASS_NUMBER:
-        return layout == KeyboardLayout.TWELVE_KEYS
-            ? Optional.of(KeyboardMode.KANA_NUMBER)
-            : Optional.of(KeyboardMode.ALPHABET_NUMBER);
-      case InputType.TYPE_CLASS_TEXT:
-        switch (inputType & InputType.TYPE_MASK_VARIATION) {
-          case InputType.TYPE_TEXT_VARIATION_PASSWORD:
-          case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
-          case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
-          case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
-            return Optional.of(KeyboardMode.ALPHABET);
-        }
+    if (MozcUtil.isNumberKeyboardPreferred(inputType)) {
+      switch (Preconditions.checkNotNull(layout)) {
+        case GODAN:
+        case QWERTY:
+        case TWELVE_KEYS:
+          return Optional.of(KeyboardMode.NUMBER);
+      }
+    }
+    if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) {
+      switch (inputType & InputType.TYPE_MASK_VARIATION) {
+        case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+        case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+        case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+        case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+          return Optional.of(KeyboardMode.ALPHABET);
+      }
     }
     // KeyboardMode recommended strongly is not found here, so just return null.
     return Optional.<KeyboardMode>absent();
@@ -218,9 +216,7 @@
   }
 
   private static KeyboardSpecification getTwelveKeysKeyboardSpecification(
-      KeyboardMode keyboardMode,
-      InputStyle inputStyle,
-      boolean qwertyLayoutForAlphabet) {
+      KeyboardMode keyboardMode, InputStyle inputStyle, boolean qwertyLayoutForAlphabet) {
     switch (keyboardMode) {
       case KANA: {
         switch (inputStyle) {
@@ -252,14 +248,10 @@
         }
         break;
       }
-      case KANA_NUMBER: {
-        switch (inputStyle) {
-          case TOGGLE: return KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER;
-          case FLICK: return KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER;
-          case TOGGLE_FLICK: return KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER;
-        }
-        break;
-      }
+      case NUMBER:
+        return KeyboardSpecification.NUMBER;
+      case SYMBOL_NUMBER:
+        return KeyboardSpecification.SYMBOL_NUMBER;
     }
     throw new IllegalArgumentException(
         "Unknown keyboard state: "
@@ -269,9 +261,10 @@
   private static KeyboardSpecification getQwertyKeyboardSpecification(KeyboardMode keyboardMode) {
     switch (keyboardMode) {
       case KANA: return KeyboardSpecification.QWERTY_KANA;
-      case KANA_NUMBER: return KeyboardSpecification.QWERTY_KANA_NUMBER;
       case ALPHABET: return KeyboardSpecification.QWERTY_ALPHABET;
       case ALPHABET_NUMBER: return KeyboardSpecification.QWERTY_ALPHABET_NUMBER;
+      case NUMBER: return KeyboardSpecification.NUMBER;
+      case SYMBOL_NUMBER: return KeyboardSpecification.SYMBOL_NUMBER;
     }
     throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
   }
@@ -281,10 +274,10 @@
       case KANA: return KeyboardSpecification.GODAN_KANA;
       case ALPHABET: return KeyboardSpecification.QWERTY_ALPHABET;
       case ALPHABET_NUMBER: return KeyboardSpecification.QWERTY_ALPHABET_NUMBER;
-      default:
-        // KANA_NUMBER must be never used.
-        throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
+      case NUMBER: return KeyboardSpecification.NUMBER;
+      case SYMBOL_NUMBER: return KeyboardSpecification.SYMBOL_NUMBER;
     }
+    throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
   }
 
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
index 4c1ce91..e98504b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
@@ -226,6 +226,10 @@
   /** @return the {@link CandidateList} instance for the given {@code minorCategory}. */
   public CandidateList getCandidateList(SymbolMinorCategory minorCategory) {
     switch (minorCategory) {
+      // NUMBER major category candidates.
+      case NUMBER:
+        return CandidateList.getDefaultInstance();
+
       // SYMBOL major category candidates.
       case SYMBOL_HISTORY:
         return toCandidateList(symbolHistoryStorage.getAllHistory(SymbolMajorCategory.SYMBOL));
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
index 7f7ef36..2a5dc18 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
@@ -30,18 +30,29 @@
 package org.mozc.android.inputmethod.japanese.model;
 
 import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
 import com.google.common.base.Preconditions;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
  * Symbol's major category to which the minor categories belong.
  */
 public enum SymbolMajorCategory {
+  NUMBER(
+      R.id.category_selector_major_number,
+      R.raw.symbol__major__number,
+      R.dimen.symbol_major_number_height,
+      Collections.singletonList(SymbolMinorCategory.NUMBER),
+      R.dimen.symbol_view_symbol_min_column_width,
+      DescriptionLayoutPolicy.GONE),  // DescriptionLayoutPolicy is not effective for NUMBER.
   SYMBOL(
       R.id.category_selector_major_symbol,
       R.raw.symbol__major__symbol,
+      R.dimen.symbol_major_symbol_height,
       Arrays.asList(
           SymbolMinorCategory.SYMBOL_HISTORY,
           SymbolMinorCategory.SYMBOL_GENERAL,
@@ -50,10 +61,12 @@
           SymbolMinorCategory.SYMBOL_ARROW,
           SymbolMinorCategory.SYMBOL_MATH
       ),
-      R.dimen.symbol_view_symbol_min_column_width),
+      R.dimen.symbol_view_symbol_min_column_width,
+      DescriptionLayoutPolicy.OVERLAY),
   EMOTICON(
       R.id.category_selector_major_emoticon,
       R.raw.symbol__major__emoticon,
+      R.dimen.symbol_major_emoticon_height,
       Arrays.asList(
           SymbolMinorCategory.EMOTICON_HISTORY,
           SymbolMinorCategory.EMOTICON_SMILE,
@@ -62,10 +75,12 @@
           SymbolMinorCategory.EMOTICON_SADNESS,
           SymbolMinorCategory.EMOTICON_DISPLEASURE
       ),
-      R.dimen.symbol_view_emoticon_min_column_width),
+      R.dimen.symbol_view_emoticon_min_column_width,
+      DescriptionLayoutPolicy.OVERLAY),
   EMOJI(
       R.id.category_selector_major_emoji,
       R.raw.symbol__major__emoji,
+      R.dimen.symbol_major_emoji_height,
       Arrays.asList(
           SymbolMinorCategory.EMOJI_HISTORY,
           SymbolMinorCategory.EMOJI_FACE,
@@ -74,14 +89,17 @@
           SymbolMinorCategory.EMOJI_CITY,
           SymbolMinorCategory.EMOJI_NATURE
       ),
-      R.dimen.symbol_view_emoji_min_column_width)
+      R.dimen.symbol_view_emoji_min_column_width,
+      DescriptionLayoutPolicy.GONE)  // Description is not show in the light of UX
   ;
 
   // All fields are invariant so access directly.
   public final int buttonResourceId;
   public final int buttonImageResourceId;
+  public final int maxImageHeightResourceId;
   public final List<SymbolMinorCategory> minorCategories;
   public final int minColumnWidthResourceId;
+  public final DescriptionLayoutPolicy layoutPolicy;
 
   /**
    * @param buttonResourceId the resource id (R.id.xxxx) of corresponding selector button.
@@ -95,14 +113,18 @@
   private SymbolMajorCategory(
       int buttonResourceId,
       int buttonImageResourceId,
+      int maxImageHeightResourceId,
       List<SymbolMinorCategory> minorCategories,
-      int minColumnWidthResourceId) {
+      int minColumnWidthResourceId,
+      CandidateLayoutRenderer.DescriptionLayoutPolicy layoutPolicy) {
     // We just store resource id instead of real bitmap/integer
     // because we cannot obtain them here (Context instance is needed).
     this.buttonResourceId = buttonResourceId;
     this.buttonImageResourceId = buttonImageResourceId;
+    this.maxImageHeightResourceId = maxImageHeightResourceId;
     this.minorCategories = Preconditions.checkNotNull(minorCategories);
     this.minColumnWidthResourceId = minColumnWidthResourceId;
+    this.layoutPolicy = layoutPolicy;
   }
 
   /**
@@ -116,7 +138,7 @@
   }
 
   public SymbolMinorCategory getMinorCategoryByRelativeIndex(SymbolMinorCategory minorCategory,
-                                                      int relativeIndex) {
+                                                             int relativeIndex) {
     int index = minorCategories.indexOf(Preconditions.checkNotNull(minorCategory));
     int newIndex = (index + relativeIndex + minorCategories.size())
         % minorCategories.size();
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
index 3eff2bb..9335aa7 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
@@ -35,32 +35,59 @@
  * Symbol's minor category to which the candidates belong.
  */
 public enum SymbolMinorCategory {
-  SYMBOL_HISTORY(R.string.symbol_minor_symbol_history_title),
-  SYMBOL_GENERAL(R.string.symbol_minor_symbol_general_title),
-  SYMBOL_HALF(R.string.symbol_minor_symbol_half_title),
-  SYMBOL_PARENTHESIS(R.string.symbol_minor_symbol_parenthesis_title),
-  SYMBOL_ARROW(R.string.symbol_minor_symbol_arrow_title),
-  SYMBOL_MATH(R.string.symbol_minor_symbol_math_title),
-  EMOTICON_HISTORY(R.string.symbol_minor_emoticon_history_title),
-  EMOTICON_SMILE(R.string.symbol_minor_emoticon_smile_title),
-  EMOTICON_SWEAT(R.string.symbol_minor_emoticon_sweat_title),
-  EMOTICON_SURPRISE(R.string.symbol_minor_emoticon_surprise_title),
-  EMOTICON_SADNESS(R.string.symbol_minor_emoticon_sadness_title),
-  EMOTICON_DISPLEASURE(R.string.symbol_minor_emoticon_displeasure_title),
-  EMOJI_HISTORY(R.string.symbol_minor_emoji_history_title),
-  EMOJI_FACE(R.string.symbol_minor_emoji_face_title),
-  EMOJI_FOOD(R.string.symbol_minor_emoji_food_title),
-  EMOJI_ACTIVITY(R.string.symbol_minor_emoji_activity_title),
-  EMOJI_CITY(R.string.symbol_minor_emoji_city_title),
-  EMOJI_NATURE(R.string.symbol_minor_emoji_nature_title)
+  NUMBER(SymbolMinorCategory.INVALID_RESOURCE_ID, SymbolMinorCategory.INVALID_RESOURCE_ID,
+         SymbolMinorCategory.INVALID_RESOURCE_ID),
+  SYMBOL_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+                 R.string.cd_symbol_window_minor_history),
+  SYMBOL_GENERAL(R.raw.symbol__minor__general, R.dimen.symbol_minor_default_height,
+                 R.string.cd_symbol_window_minor_symbol_general),
+  SYMBOL_HALF(R.raw.symbol__minor__fullhalf, R.dimen.symbol_minor_default_height,
+              R.string.cd_symbol_window_minor_symbol_half),
+  SYMBOL_PARENTHESIS(R.raw.symbol__minor__parenthesis, R.dimen.symbol_minor_default_height,
+                     R.string.cd_symbol_window_minor_symbol_parenthesis),
+  SYMBOL_ARROW(R.raw.symbol__minor__arrow, R.dimen.symbol_minor_default_height,
+               R.string.cd_symbol_window_minor_symbol_arrow),
+  SYMBOL_MATH(R.raw.symbol__minor__math, R.dimen.symbol_minor_default_height,
+              R.string.cd_symbol_window_minor_symbol_math),
+  EMOTICON_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+                   R.string.cd_symbol_window_minor_history),
+  EMOTICON_SMILE(R.raw.symbol__minor__smile, R.dimen.symbol_minor_emoticon_height,
+                 R.string.cd_symbol_window_minor_emoticon_smile),
+  EMOTICON_SWEAT(R.raw.symbol__minor__sweat, R.dimen.symbol_minor_emoticon_height,
+                 R.string.cd_symbol_window_minor_emoticon_sweat),
+  EMOTICON_SURPRISE(R.raw.symbol__minor__surprise, R.dimen.symbol_minor_emoticon_height,
+                    R.string.cd_symbol_window_minor_emoticon_surprise),
+  EMOTICON_SADNESS(R.raw.symbol__minor__sadness, R.dimen.symbol_minor_emoticon_height,
+                   R.string.cd_symbol_window_minor_emoticon_sadness),
+  EMOTICON_DISPLEASURE(R.raw.symbol__minor__displeasure, R.dimen.symbol_minor_emoticon_height,
+                       R.string.cd_symbol_window_minor_emoticon_displeasure),
+  EMOJI_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+                R.string.cd_symbol_window_minor_history),
+  EMOJI_FACE(R.raw.symbol__minor__face, R.dimen.symbol_minor_default_height,
+             R.string.cd_symbol_window_minor_emoji_face),
+  EMOJI_FOOD(R.raw.symbol__minor__food, R.dimen.symbol_minor_default_height,
+             R.string.cd_symbol_window_minor_emoji_food),
+  EMOJI_ACTIVITY(R.raw.symbol__minor__activity, R.dimen.symbol_minor_default_height,
+                 R.string.cd_symbol_window_minor_emoji_activity),
+  EMOJI_CITY(R.raw.symbol__minor__city, R.dimen.symbol_minor_default_height,
+             R.string.cd_symbol_window_minor_emoji_city),
+  EMOJI_NATURE(R.raw.symbol__minor__nature, R.dimen.symbol_minor_default_height,
+               R.string.cd_symbol_window_minor_emoji_nature)
   ;
 
-  public final int textResourceId;
+  public static final int INVALID_RESOURCE_ID = 0;
+  public final int drawableResourceId;
+  public final int maxImageHeightResourceId;
+  public final int contentDescriptionResourceId;
 
   /**
-   * @param textResourceId the resource id of the corresponding text title.
+   * @param drawableResourceId the resource id of the corresponding drawable.
+   * @param contentDescriptionResourceId the resource id of the corresponding content description.
    */
-  SymbolMinorCategory(int textResourceId) {
-    this.textResourceId = textResourceId;
+  SymbolMinorCategory(int drawableResourceId, int maxImageHeightResourceId,
+                      int contentDescriptionResourceId) {
+    this.drawableResourceId = drawableResourceId;
+    this.maxImageHeightResourceId = maxImageHeightResourceId;
+    this.contentDescriptionResourceId = contentDescriptionResourceId;
   }
 }
\ No newline at end of file
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java b/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
index 7f47fa7..250326f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
@@ -31,12 +31,14 @@
 
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
+import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 
 /**
  * This class expresses the client-side preferences which corresponds to current
@@ -87,7 +89,6 @@
   public enum HardwareKeyMap {
     DEFAULT,
     JAPANESE109A,
-    TWELVEKEY,
   }
 
   private final boolean isHapticFeedbackEnabled;
@@ -103,6 +104,7 @@
   private final EmojiProviderType emojiProviderType;
   private final HardwareKeyMap hardwareKeyMap;
   private final SkinType skinType;
+  private final boolean isMicrophoneButtonEnabled;
   private final LayoutAdjustment layoutAdjustment;
 
   /** Percentage of keyboard height */
@@ -110,14 +112,15 @@
 
   /**
    * If you want to use this method,
-   * consider using {@link #ClientSidePreference(SharedPreferences, int)} instead.
+   * consider using {@link #ClientSidePreference(SharedPreferences, Resources, int)} instead.
    */
   @VisibleForTesting public ClientSidePreference(
       boolean isHapticFeedbackEnabled, long hapticFeedbackDuration, boolean isSoundFeedbackEnabled,
       int soundFeedbackVolume, boolean isPopupFeedbackEnabled, KeyboardLayout keyboardLayout,
       InputStyle inputStyle, boolean qwertyLayoutForAlphabet, boolean fullscreenMode,
       int flickSensitivity, EmojiProviderType emojiProviderType, HardwareKeyMap hardwareKeyMap,
-      SkinType skinType, LayoutAdjustment layoutAdjustment, int keyboardHeightRatio) {
+      SkinType skinType, boolean isMicrophoneButtonEnabled, LayoutAdjustment layoutAdjustment,
+      int keyboardHeightRatio) {
     this.isHapticFeedbackEnabled = isHapticFeedbackEnabled;
     this.hapticFeedbackDuration = hapticFeedbackDuration;
     this.isSoundFeedbackEnabled = isSoundFeedbackEnabled;
@@ -131,11 +134,13 @@
     this.emojiProviderType = Preconditions.checkNotNull(emojiProviderType);
     this.hardwareKeyMap = Preconditions.checkNotNull(hardwareKeyMap);
     this.skinType = Preconditions.checkNotNull(skinType);
+    this.isMicrophoneButtonEnabled = isMicrophoneButtonEnabled;
     this.layoutAdjustment = Preconditions.checkNotNull(layoutAdjustment);
     this.keyboardHeightRatio = keyboardHeightRatio;
   }
 
-  public ClientSidePreference(SharedPreferences sharedPreferences, int deviceOrientation) {
+  public ClientSidePreference(
+      SharedPreferences sharedPreferences, Resources resources, int deviceOrientation) {
     Preconditions.checkNotNull(sharedPreferences);
 
     isHapticFeedbackEnabled =
@@ -148,6 +153,8 @@
         sharedPreferences.getInt(PreferenceUtil.PREF_SOUND_FEEDBACK_VOLUME_KEY, 50);
     isPopupFeedbackEnabled =
         sharedPreferences.getBoolean(PreferenceUtil.PREF_POPUP_FEEDBACK_KEY, true);
+    isMicrophoneButtonEnabled =
+        sharedPreferences.getBoolean(PreferenceUtil.PREF_VOICE_INPUT_KEY, true);
 
     String keyboardLayoutKey;
     String inputStyleKey;
@@ -197,9 +204,11 @@
         EmojiProviderType.NONE);
 
     hardwareKeyMap = PreferenceUtil.getEnum(
-        sharedPreferences, PreferenceUtil.PREF_HARDWARE_KEYMAP, HardwareKeyMap.class, null);
+        sharedPreferences, PreferenceUtil.PREF_HARDWARE_KEYMAP, HardwareKeyMap.class,
+        HardwareKeyMap.DEFAULT);
     skinType = PreferenceUtil.getEnum(
-        sharedPreferences, PreferenceUtil.PREF_SKIN_TYPE, SkinType.class, SkinType.BLUE_LIGHTGRAY);
+        sharedPreferences, resources.getString(R.string.pref_skin_type_key),
+        SkinType.class, SkinType.valueOf(resources.getString(R.string.pref_skin_type_default)));
     layoutAdjustment = PreferenceUtil.getEnum(
         sharedPreferences, layoutAdjustmentKey, LayoutAdjustment.class, LayoutAdjustment.FILL);
     keyboardHeightRatio = sharedPreferences.getInt(keyboardHeightRatioKey, 100);
@@ -257,6 +266,10 @@
     return skinType;
   }
 
+  public boolean isMicrophoneButtonEnabled() {
+    return isMicrophoneButtonEnabled;
+  }
+
   public LayoutAdjustment getLayoutAdjustment() {
     return layoutAdjustment;
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
index 3b6db3b..f17a3d1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
@@ -30,9 +30,12 @@
 package org.mozc.android.inputmethod.japanese.preference;
 
 import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
+import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -67,13 +70,13 @@
 
   static class Item {
     final KeyboardLayout keyboardLayout;
-    final int keyboardResourceId;
+    final KeyboardSpecification specification;
     final int titleResId;
     final int descriptionResId;
-    Item(KeyboardLayout keyboardLayout, int keyboardResourceId,
+    Item(KeyboardLayout keyboardLayout, KeyboardSpecification specification,
          int titleResId, int descriptionResId) {
       this.keyboardLayout = keyboardLayout;
-      this.keyboardResourceId = keyboardResourceId;
+      this.specification = specification;
       this.titleResId = titleResId;
       this.descriptionResId = descriptionResId;
     }
@@ -87,7 +90,7 @@
       for (Item item : itemList) {
         drawableMap.put(
             item.keyboardLayout,
-            new KeyboardPreviewDrawable(resources, item.keyboardLayout, item.keyboardResourceId));
+            new KeyboardPreviewDrawable(resources, item.keyboardLayout, item.specification));
       }
     }
 
@@ -136,9 +139,10 @@
       return convertView;
     }
 
-    void setSkinType(SkinType skinType) {
+    void setSkin(Skin skin) {
+      Preconditions.checkNotNull(skin);
       for (KeyboardPreviewDrawable drawable : drawableMap.values()) {
-        drawable.setSkinType(skinType);
+        drawable.setSkin(skin);
       }
     }
   }
@@ -175,17 +179,17 @@
   static final List<Item> itemList = Collections.unmodifiableList(Arrays.asList(
       new Item(
           KeyboardLayout.TWELVE_KEYS,
-          R.xml.kbd_12keys_flick_kana,
+          KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
           R.string.pref_keyboard_layout_title_12keys,
           R.string.pref_keyboard_layout_description_12keys),
       new Item(
           KeyboardLayout.QWERTY,
-          R.xml.kbd_qwerty_kana,
+          KeyboardSpecification.QWERTY_KANA,
           R.string.pref_keyboard_layout_title_qwerty,
           R.string.pref_keyboard_layout_description_qwerty),
       new Item(
           KeyboardLayout.GODAN,
-          R.xml.kbd_godan_kana,
+          KeyboardSpecification.GODAN_KANA,
           R.string.pref_keyboard_layout_title_godan,
           R.string.pref_keyboard_layout_description_godan)));
 
@@ -195,8 +199,8 @@
       new OnSharedPreferenceChangeListener() {
         @Override
         public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
-          if (key.equals(PreferenceUtil.PREF_SKIN_TYPE)) {
-            updateSkinType();
+          if (key.equals(getContext().getResources().getString(R.string.pref_skin_type_key))) {
+            updateSkin();
           }
         }
       };
@@ -288,7 +292,7 @@
     gallery.setOnItemClickListener(galleryEventListener);
     gallery.setSelection(getActiveIndex());
 
-    updateSkinType();
+    updateSkin();
   }
 
   private static void updateAllItemBackground(AdapterView<?> gallery, int activeIndex) {
@@ -311,7 +315,7 @@
   @Override
   protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
     super.onAttachedToHierarchy(preferenceManager);
-    updateSkinType();
+    updateSkin();
     getSharedPreferences().registerOnSharedPreferenceChangeListener(
         sharedPreferenceChangeListener);
   }
@@ -323,10 +327,12 @@
     super.onPrepareForRemoval();
   }
 
-  void updateSkinType() {
+  void updateSkin() {
+    Resources resources = getContext().getResources();
     SkinType skinType = PreferenceUtil.getEnum(
         getSharedPreferences(),
-        PreferenceUtil.PREF_SKIN_TYPE, SkinType.class, SkinType.ORANGE_LIGHTGRAY);
-    imageAdapter.setSkinType(skinType);
+        resources.getString(R.string.pref_skin_type_key),
+        SkinType.class, SkinType.valueOf(resources.getString(R.string.pref_skin_type_default)));
+    imageAdapter.setSkin(skinType.getSkin(resources));
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
index 94c5f87..6c113c5 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
@@ -34,14 +34,14 @@
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardViewBackgroundSurface;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
-import com.google.common.base.Optional;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Preconditions;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -51,8 +51,6 @@
 import android.graphics.Paint;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -63,6 +61,8 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
+import javax.annotation.Nullable;
+
 /**
  * A Drawable to render keyboard preview.
  *
@@ -118,7 +118,7 @@
 
     private final Map<KeyboardLayout, Bitmap> map =
         new EnumMap<KeyboardLayout, Bitmap>(KeyboardLayout.class);
-    private SkinType skinType = null;
+    private Skin skin = Skin.getFallbackInstance();
     private final WeakHashMap<CacheReferenceKey, Object> referenceMap =
         new WeakHashMap<CacheReferenceKey, Object>();
 
@@ -129,12 +129,13 @@
       return INSTANCE;
     }
 
-    Bitmap get(KeyboardLayout keyboardLayout, int width, int height, SkinType skinType) {
-      if (keyboardLayout == null || width <= 0 || height <= 0 || skinType == null) {
+    @Nullable Bitmap get(KeyboardLayout keyboardLayout, int width, int height, Skin skin) {
+      Preconditions.checkNotNull(skin);
+      if (keyboardLayout == null || width <= 0 || height <= 0) {
         return null;
       }
 
-      if (skinType != this.skinType) {
+      if (!skin.equals(this.skin)) {
         return null;
       }
 
@@ -149,14 +150,15 @@
       return result;
     }
 
-    void put(KeyboardLayout keyboardLayout, SkinType skinType, Bitmap bitmap) {
-      if (keyboardLayout == null || skinType == null || bitmap == null) {
+    void put(@Nullable KeyboardLayout keyboardLayout, Skin skin, @Nullable Bitmap bitmap) {
+      Preconditions.checkNotNull(skin);
+      if (keyboardLayout == null || bitmap == null) {
         return;
       }
 
-      if (skinType != this.skinType) {
+      if (!skin.equals(this.skin)) {
         clear();
-        this.skinType = skinType;
+        this.skin = skin;
       }
 
       Bitmap oldBitmap = map.put(keyboardLayout, bitmap);
@@ -187,23 +189,23 @@
       }
 
       map.clear();
-      skinType = null;
+      skin = Skin.getFallbackInstance();
     }
   }
 
   private final Resources resources;
   private final KeyboardLayout keyboardLayout;
-  private final int keyboardResourceId;
+  private final KeyboardSpecification specification;
   private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
 
-  private SkinType skinType = SkinType.BLUE_LIGHTGRAY;
+  private Skin skin = Skin.getFallbackInstance();
   private boolean enabled = true;
 
   KeyboardPreviewDrawable(
-      Resources resources, KeyboardLayout keyboardLayout, int keyboardResourceId) {
+      Resources resources, KeyboardLayout keyboardLayout, KeyboardSpecification specification) {
     this.resources = resources;
     this.keyboardLayout = keyboardLayout;
-    this.keyboardResourceId = keyboardResourceId;
+    this.specification = specification;
   }
 
   @Override
@@ -215,12 +217,13 @@
 
     // Look up cache.
     BitmapCache cache = BitmapCache.getInstance();
-    Bitmap bitmap = cache.get(keyboardLayout, bounds.width(), bounds.height(), skinType);
+    Bitmap bitmap = cache.get(keyboardLayout, bounds.width(), bounds.height(), skin);
     if (bitmap == null) {
       bitmap = createBitmap(
-          resources, keyboardResourceId, bounds.width(), bounds.height(), skinType);
+          resources, specification, bounds.width(), bounds.height(),
+          resources.getDimensionPixelSize(R.dimen.pref_inputstyle_reference_width), skin);
       if (bitmap != null) {
-        cache.put(keyboardLayout, skinType, bitmap);
+        cache.put(keyboardLayout, skin, bitmap);
       }
     }
 
@@ -234,48 +237,48 @@
     }
   }
 
+  /**
+   * @param width width of returned {@code Bitmap}
+   * @param height height of returned {@code Bitmap}
+   * @param virtualWidth virtual width of keyboard. This value is used when rendering.
+   *        virtualHeight is internally calculated based on given arguments keeping aspect ratio.
+   */
+  @Nullable
   private static Bitmap createBitmap(
-      Resources resources, int resourceId, int width, int height, SkinType skinType) {
-    Keyboard keyboard = getParsedKeyboard(resources, resourceId, width, height);
+      Resources resources, KeyboardSpecification specification, int width, int height,
+      int virtualWidth, Skin skin) {
+    Preconditions.checkNotNull(skin);
+    // Scaling is required because some icons are draw with specified fixed size.
+    float scale = width / (float) virtualWidth;
+    int virtualHeight = (int) (height / scale);
+    Keyboard keyboard = getParsedKeyboard(resources, specification, virtualWidth, virtualHeight);
     if (keyboard == null) {
       return null;
     }
 
     Bitmap bitmap = MozcUtil.createBitmap(width, height, Config.ARGB_8888);
     Canvas canvas = new Canvas(bitmap);
-    DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
-    drawableCache.setSkinType(skinType);
+    canvas.scale(scale, scale);
+    DrawableCache drawableCache = new DrawableCache(resources);
+    drawableCache.setSkin(skin);
 
     // Fill background.
     {
-      Optional<Drawable> optionalKeyboardBackground =
-          drawableCache.getDrawable(skinType.windowBackgroundResourceId);
-      if (!optionalKeyboardBackground.isPresent()) {
-        // Default black drawing.
-        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-        paint.setColor(0xFF000000);
-        canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
-      } else {
-        Drawable keyboardBackground = optionalKeyboardBackground.get();
-        if (keyboardBackground instanceof BitmapDrawable) {
-          // If the background is bitmap resource, set repeat mode.
-          BitmapDrawable.class.cast(keyboardBackground).setTileModeXY(
-              TileMode.REPEAT, TileMode.REPEAT);
-        }
-        keyboardBackground.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
-        keyboardBackground.draw(canvas);
-      }
+      Drawable keyboardBackground =
+          skin.windowBackgroundDrawable.getConstantState().newDrawable();
+      keyboardBackground.setBounds(0, 0, virtualWidth, virtualHeight);
+      keyboardBackground.draw(canvas);
     }
 
     // Draw keyboard layout.
     {
       BackgroundDrawableFactory backgroundDrawableFactory =
-          new BackgroundDrawableFactory(resources.getDisplayMetrics().density);
-      backgroundDrawableFactory.setSkinType(skinType);
+          new BackgroundDrawableFactory(resources);
+      backgroundDrawableFactory.setSkin(skin);
       KeyboardViewBackgroundSurface backgroundSurface =
           new KeyboardViewBackgroundSurface(backgroundDrawableFactory, drawableCache);
       backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
-      backgroundSurface.requestUpdateSize(bitmap.getWidth(), bitmap.getHeight());
+      backgroundSurface.requestUpdateSize(virtualWidth, virtualHeight);
       backgroundSurface.update();
       backgroundSurface.draw(canvas);
       backgroundSurface.reset();  // Release the background bitmap and its canvas.
@@ -285,10 +288,11 @@
   }
 
   /** Create a Keyboard instance which fits the current bitmap. */
+  @Nullable
   private static Keyboard getParsedKeyboard(
-      Resources resources, int resourceId, int width, int height) {
+      Resources resources, KeyboardSpecification specification, int width, int height) {
     KeyboardParser parser = new KeyboardParser(
-        resources, resources.getXml(resourceId), width, height);
+        resources, width, height, specification);
     try {
       return parser.parseKeyboard();
     } catch (XmlPullParserException e) {
@@ -300,8 +304,8 @@
     return null;
   }
 
-  void setSkinType(SkinType skinType) {
-    this.skinType = skinType;
+  void setSkin(Skin skin) {
+    this.skin = skin;
     invalidateSelf();
   }
 
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
index 6ee4c0e..304add1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
@@ -80,24 +80,32 @@
 
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {
-      Preconditions.checkNotNull(view);
-      Preconditions.checkNotNull(url);
+      try {
+        Preconditions.checkNotNull(view);
+        Preconditions.checkNotNull(url);
 
-      // Use temporary matcher intentionally.
-      // Regex engine is rather heavy to instantiate so use it as less as possible.
-      if (!Pattern.matches(restrictionPattern, url)) {
-        // If the URL's doesn't match restriction pattern,
-        // delegate the operation to the default browser.
-        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
-        if (!packageManager.queryIntentActivities(browserIntent, 0).isEmpty()) {
-          context.startActivity(browserIntent);
+        // Use temporary matcher intentionally.
+        // Regex engine is rather heavy to instantiate so use it as less as possible.
+        if (!Pattern.matches(restrictionPattern, url)) {
+          // If the URL's doesn't match restriction pattern,
+          // delegate the operation to the default browser.
+          Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+          if (!packageManager.queryIntentActivities(browserIntent, 0).isEmpty()) {
+            context.startActivity(browserIntent);
+          }
+          // If no default browser is available, do nothing.
+          return true;
         }
-        // If no default browser is available, do nothing.
+        // Prevent from invoking default browser.
+        // In some special environment default browser is not installed.
+        return false;
+      } catch (Throwable e) {
+        // This method might be called from native layer.
+        // Therefore throwing something from here causes native crash.
+        // To prevent from native crash, catches all here.
+        // At least SecurityException must be caught here for Android-TV.
         return true;
       }
-      // Prevent from invoking default browser.
-      // In some special environment default browser is not installed.
-      return false;
     }
   }
 
@@ -116,6 +124,15 @@
   }
 
   @Override
+  protected void onPause() {
+    // Clear cache in order to show appropriate website even if system locale is changed.
+    if (this.webView.isPresent()) {
+      this.webView.get().clearCache(true);
+    }
+    super.onPause();
+  }
+
+  @Override
   public boolean onKeyDown(int keyCode, KeyEvent event) {
     Preconditions.checkNotNull(event);
 
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
index 2593853..75160c6 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
@@ -37,6 +37,7 @@
 import org.mozc.android.inputmethod.japanese.preference.KeyboardPreviewDrawable.BitmapCache;
 import org.mozc.android.inputmethod.japanese.preference.KeyboardPreviewDrawable.CacheReferenceKey;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 
@@ -155,12 +156,13 @@
   @VisibleForTesting
   void onPostResumeInternal(ApplicationInitializer initializer) {
     Context context = getApplicationContext();
-    boolean omitWelcomeActivity = false;
     Optional<Intent> forwardIntent = initializer.initialize(
-        omitWelcomeActivity,
+        MozcUtil.isSystemApplication(context),
         MozcUtil.isDevChannel(context),
         DependencyFactory.getDependency(getApplicationContext()).isWelcomeActivityPreferrable(),
-        MozcUtil.getAbiIndependentVersionCode(context));
+        MozcUtil.getAbiIndependentVersionCode(context),
+        LauncherIconManagerFactory.getDefaultInstance(),
+        PreferenceUtil.getDefaultPreferenceManagerStatic());
     if (forwardIntent.isPresent()) {
       startActivity(forwardIntent.get());
     } else {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
index b403565..873ae27 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
@@ -29,12 +29,46 @@
 
 package org.mozc.android.inputmethod.japanese.preference;
 
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
+
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.preference.PreferenceManager;
+
 /**
  * Main Activity class for the fragment based preference UI on Android with API Level &gt;= 11.
  *
  */
 public class MozcFragmentPreferenceActivity extends MozcFragmentBasePreferenceActivity {
+
   public MozcFragmentPreferenceActivity() {
     super(PreferencePage.FLAT);
   }
+
+  private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener =
+      new OnSharedPreferenceChangeListener() {
+        @Override
+        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+          if (PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY.equals(key)) {
+            LauncherIconManagerFactory.getDefaultInstance()
+                .updateLauncherIconVisibility(MozcFragmentPreferenceActivity.this);
+          }
+        }
+      };
+
+  @Override
+  protected void onResume() {
+    super.onResume();
+    PreferenceManager
+        .getDefaultSharedPreferences(this)
+        .registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+  }
+
+  @Override
+  protected void onPause() {
+    PreferenceManager
+        .getDefaultSharedPreferences(this)
+        .unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+    super.onPause();
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java b/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
index 324c3ca..169d671 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
@@ -33,6 +33,7 @@
 import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.content.Context;
@@ -45,6 +46,9 @@
 import android.preference.PreferenceManager;
 import android.util.DisplayMetrics;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * Utilities for Mozc preferences.
  *
@@ -56,7 +60,14 @@
     public Preference findPreference(CharSequence key);
   }
 
-  private static class PreferenceManagerInterfaceImpl implements PreferenceManagerInterface {
+  /** Simple {@code PreferenceManager} wrapper for testing purpose.
+   *  This interface wraps static method so no constructor is required.
+   */
+  public interface PreferenceManagerStaticInterface {
+    public void setDefaultValues(Context context, int id, boolean readAgain);
+  }
+
+  static class PreferenceManagerInterfaceImpl implements PreferenceManagerInterface {
     private final PreferenceManager preferenceManager;
 
     PreferenceManagerInterfaceImpl(PreferenceManager preferenceManager) {
@@ -69,6 +80,24 @@
     }
   }
 
+  private static Optional<PreferenceManagerStaticInterface> defaultPreferenceManagerStatic =
+      Optional.absent();
+
+  public static PreferenceManagerStaticInterface getDefaultPreferenceManagerStatic() {
+    // As construction cost of defaultPrereferenceManagerStatic is cheap and it is invariant,
+    // no lock mechanism is employed here.
+    if (!defaultPreferenceManagerStatic.isPresent()) {
+      defaultPreferenceManagerStatic = Optional.<PreferenceManagerStaticInterface>of(
+          new PreferenceManagerStaticInterface() {
+            @Override
+            public void setDefaultValues(Context context, int id, boolean readAgain) {
+              PreferenceManager.setDefaultValues(context, id, readAgain);
+            }
+          });
+    }
+    return defaultPreferenceManagerStatic.get();
+  }
+
   static class CurrentKeyboardLayoutPreferenceChangeListener implements OnPreferenceChangeListener {
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -133,10 +162,10 @@
       "pref_portrait_fullscreen_key";
   public static final String PREF_LANDSCAPE_FULLSCREEN_KEY =
       "pref_landscape_fullscreen_key";
-  public static final String PREF_SKIN_TYPE = "pref_skin_type_key";
-  public static final String PREF_HARDWARE_KEYMAP = "pref_hardware_keymap";
 
   // Keys for generic preferences.
+  public static final String PREF_HARDWARE_KEYMAP = "pref_hardware_keymap";
+  public static final String PREF_VOICE_INPUT_KEY = "pref_voice_input_key";
   public static final String PREF_HAPTIC_FEEDBACK_KEY = "pref_haptic_feedback_key";
   public static final String PREF_HAPTIC_FEEDBACK_DURATION_KEY =
       "pref_haptic_feedback_duration_key";
@@ -159,6 +188,10 @@
   public static final String PREF_OTHER_INCOGNITO_MODE_KEY = "pref_other_anonimous_mode_key";
   public static final String PREF_OTHER_USAGE_STATS_KEY = "pref_other_usage_stats_key";
   public static final String PREF_ABOUT_VERSION = "pref_about_version";
+  public static final String PREF_LAUNCHER_ICON_VISIBILITY_KEY = "pref_launcher_icon_visibility";
+  // Application lifecycle
+  public static final String PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE =
+      "pref_last_launch_abi_independent_version_code";
 
   private static final OnPreferenceChangeListener
       CURRENT_KEYBOARD_LAYOUT_PREFERENCE_CHANGE_LISTENER =
@@ -168,8 +201,8 @@
   private PreferenceUtil() {
   }
 
-  static boolean isLandscapeKeyboardSettingActive(SharedPreferences sharedPreferences,
-                                                  int deviceOrientation) {
+  public static boolean isLandscapeKeyboardSettingActive(
+      SharedPreferences sharedPreferences, int deviceOrientation) {
     Preconditions.checkNotNull(sharedPreferences);
     if (sharedPreferences.getBoolean(PREF_USE_PORTRAIT_KEYBOARD_SETTINGS_FOR_LANDSCAPE_KEY, true)) {
       // Always use portrait configuration.
@@ -340,4 +373,25 @@
       SharedPreferences sharedPreference, String key, Class<T> type, T defaultValue) {
     return getEnum(sharedPreference, key, type, defaultValue, defaultValue);
   }
+
+  public static void setDefaultValues(PreferenceManagerStaticInterface preferenceManager,
+                                      Context context, boolean isDebug, boolean useUsageStats) {
+    Preconditions.checkNotNull(preferenceManager);
+    Preconditions.checkNotNull(context);
+    Set<Integer> preferenceResources = new HashSet<Integer>();
+    // Collect all the preferences resource ids from possible preference pages,
+    // removing duplication.
+    for (PreferencePage page : PreferencePage.values()) {
+      for (int id : PreferencePage.getResourceIdList(page, isDebug, useUsageStats)) {
+        preferenceResources.add(id);
+      }
+    }
+    for (int id : preferenceResources) {
+      // 'true' here means the preferences which have not set yet are *always* set here.
+      // This doesn't mean *Reset all the preferences*.
+      // (if 'false' the process will be done once on the first launch
+      //  so even if new preferences are added their default values will not be set here)
+      preferenceManager.setDefaultValues(context, id, true);
+    }
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java b/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
index ccd1a3b..4cb0c15 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
@@ -32,6 +32,7 @@
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
 import org.mozc.android.inputmethod.japanese.util.ZipFileUtil;
+import com.google.common.base.Preconditions;
 import com.google.protobuf.InvalidProtocolBufferException;
 
 import android.content.Context;
@@ -50,6 +51,7 @@
  *
  */
 class LocalSessionHandler implements SessionHandler {
+
   private static final String USER_PROFILE_DIRECTORY_NAME = ".mozc";
   // The file name of the system dictionary and connection data file in the apk.
   // This is determined in build.xml.
@@ -60,7 +62,7 @@
   @Override
   public void initialize(Context context) {
     try {
-      ApplicationInfo info = context.getApplicationInfo();
+      ApplicationInfo info = Preconditions.checkNotNull(context).getApplicationInfo();
 
       // Ensure the user profile directory exists.
       File userProfileDirectory = new File(info.dataDir, USER_PROFILE_DIRECTORY_NAME);
@@ -104,7 +106,7 @@
 
   @Override
   public Command evalCommand(Command command) {
-    byte[] inBytes = command.toByteArray();
+    byte[] inBytes = Preconditions.checkNotNull(command).toByteArray();
     byte[] outBytes = null;
     outBytes = MozcJNI.evalCommand(inBytes);
     try {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java b/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
index 802b1ce..d56dd8f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
@@ -31,6 +31,7 @@
 
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import com.google.common.base.Preconditions;
 
 /**
  * This class logs only input/output protocol buffer Command for MozcJNI.
@@ -44,11 +45,11 @@
 
   static void inLog(Command inCommand) {
     MozcLog.v("<evaluate>");
-    MozcLog.v(inCommand.getInput().toString());
+    MozcLog.v(Preconditions.checkNotNull(inCommand).getInput().toString());
   }
 
   static void outLog(Command outCommand) {
-    MozcLog.v(outCommand.getOutput().toString());
+    MozcLog.v(Preconditions.checkNotNull(outCommand).getOutput().toString());
     MozcLog.v("</evaluate>");
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java b/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
index 307326e..1e29c1f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
@@ -30,6 +30,7 @@
 package org.mozc.android.inputmethod.japanese.session;
 
 import org.mozc.android.inputmethod.japanese.MozcLog;
+import com.google.common.base.Preconditions;
 
 import java.nio.Buffer;
 
@@ -53,6 +54,11 @@
   static void load(
       String userProfileDirectoryPath, Buffer dictionaryBuffer, Buffer connectionDataBuffer,
       String expectedVersion) {
+    Preconditions.checkNotNull(userProfileDirectoryPath);
+    Preconditions.checkNotNull(dictionaryBuffer);
+    Preconditions.checkNotNull(connectionDataBuffer);
+    Preconditions.checkNotNull(expectedVersion);
+
     if (isLoaded) {
       return;
     }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java b/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
index bfee8be..07b3c29 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
@@ -31,6 +31,7 @@
 
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Capability;
@@ -60,6 +61,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
@@ -83,27 +85,29 @@
  *
  */
 public class SessionExecutor {
+
   // At the moment we call mozc server via JNI interface directly,
   // while other platforms, e.g. Win/Mac/Linux etc, use IPC.
   // In order to keep the call order correctly, we call it from the single worker thread.
   // Note that we use well-known double check lazy initialization,
   // so that we can inject instances via reflections for testing purposes.
-  @VisibleForTesting static volatile SessionExecutor instance;
+  @VisibleForTesting static volatile Optional<SessionExecutor> instance = Optional.absent();
+
   private static SessionExecutor getInstanceInternal(
-      SessionHandlerFactory factory, Context applicationContext) {
-    SessionExecutor result = instance;
-    if (result == null) {
+      Optional<SessionHandlerFactory> factory, Context applicationContext) {
+    Optional<SessionExecutor> result = instance;
+    if (!result.isPresent()) {
       synchronized (SessionExecutor.class) {
         result = instance;
-        if (result == null) {
-          result = instance = new SessionExecutor();
-          if (factory != null) {
-            result.reset(factory, applicationContext);
+        if (!result.isPresent()) {
+          result = instance = Optional.of(new SessionExecutor());
+          if (factory.isPresent()) {
+            result.get().reset(factory.get(), applicationContext);
           }
         }
       }
     }
-    return result;
+    return result.get();
   }
 
   /**
@@ -112,10 +116,11 @@
    * @param executor the new instance to replace the old one.
    * @return the old instance.
    */
-  public static SessionExecutor setInstanceForTest(SessionExecutor executor) {
+  @VisibleForTesting public static Optional<SessionExecutor> setInstanceForTest(
+      Optional<SessionExecutor> executor) {
     synchronized (SessionExecutor.class) {
-      SessionExecutor old = instance;
-      instance = executor;
+      Optional<SessionExecutor> old = instance;
+      instance = Preconditions.checkNotNull(executor);
       return old;
     }
   }
@@ -126,7 +131,8 @@
    * by client in appropriate timing.
    */
   public static SessionExecutor getInstance(Context applicationContext) {
-    return getInstanceInternal(null, applicationContext);
+    return getInstanceInternal(
+        Optional.<SessionHandlerFactory>absent(), Preconditions.checkNotNull(applicationContext));
   }
 
   /**
@@ -135,81 +141,84 @@
    */
   public static SessionExecutor getInstanceInitializedIfNecessary(
       SessionHandlerFactory factory, Context applicationContext) {
-    return getInstanceInternal(factory, applicationContext);
+    return getInstanceInternal(
+        Optional.of(factory), Preconditions.checkNotNull(applicationContext));
   }
 
-  private static volatile HandlerThread sessionHandlerThread;
+  private static volatile Optional<HandlerThread> sessionHandlerThread = Optional.absent();
   private static HandlerThread getHandlerThread() {
-    HandlerThread result = sessionHandlerThread;
-    if (result == null) {
+    Optional<HandlerThread> result = sessionHandlerThread;
+    if (!result.isPresent()) {
       synchronized (SessionExecutor.class) {
         result = sessionHandlerThread;
-        if (result == null) {
-          result = new HandlerThread("Session worker thread");
-          result.setDaemon(true);
-          result.start();
+        if (!result.isPresent()) {
+          result = Optional.of(new HandlerThread("Session worker thread"));
+          result.get().setDaemon(true);
+          result.get().start();
           sessionHandlerThread = result;
         }
       }
     }
-    return result;
+    return result.get();
   }
 
   /**
    * An interface to accept the result of asynchronous evaluation.
    */
   public interface EvaluationCallback {
-    void onCompleted(Command command, KeyEventInterface triggeringKeyEvent);
+    void onCompleted(Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent);
   }
 
-  // Context class during each evaluation. Package private for testing purpose.
-  static class AsynchronousEvaluationContext {
+  @VisibleForTesting static class AsynchronousEvaluationContext {
+
     // For asynchronous evaluation, we set the sessionId in the callback running on the worker
     // thread. So, this class has Input.Builer as an argument for an evaluation, while
     // SynchronousEvaluationContext has Input because it is not necessary to be set sessionId.
     final long timeStamp;
     final Input.Builder inputBuilder;
-    volatile Command outCommand;
-    final KeyEventInterface triggeringKeyEvent;
-    final EvaluationCallback callback;
-    final Handler callbackHandler;
+    volatile Optional<Command> outCommand = Optional.absent();
+    final Optional<KeyEventInterface> triggeringKeyEvent;
+    final Optional<EvaluationCallback> callback;
+    final Optional<Handler> callbackHandler;
 
     AsynchronousEvaluationContext(long timeStamp,
                                   Input.Builder inputBuilder,
-                                  KeyEventInterface triggeringKeyEvent,
-                                  EvaluationCallback callback,
-                                  Handler callbackHandler) {
+                                  Optional<KeyEventInterface> triggeringKeyEvent,
+                                  Optional<EvaluationCallback> callback,
+                                  Optional<Handler> callbackHandler) {
       this.timeStamp = timeStamp;
-      this.inputBuilder = inputBuilder;
-      this.triggeringKeyEvent = triggeringKeyEvent;
-      this.callback = callback;
-      this.callbackHandler = callbackHandler;
+      this.inputBuilder = Preconditions.checkNotNull(inputBuilder);
+      this.triggeringKeyEvent = Preconditions.checkNotNull(triggeringKeyEvent);
+      this.callback = Preconditions.checkNotNull(callback);
+      this.callbackHandler = Preconditions.checkNotNull(callbackHandler);
     }
   }
 
-  static class SynchronousEvaluationContext {
+  @VisibleForTesting static class SynchronousEvaluationContext {
+
     final Input input;
-    volatile Command outCommand;
+    volatile Optional<Command> outCommand = Optional.absent();
     final CountDownLatch evaluationSynchronizer;
 
     SynchronousEvaluationContext(Input input, CountDownLatch evaluationSynchronizer) {
-      this.input = input;
-      this.evaluationSynchronizer = evaluationSynchronizer;
+      this.input = Preconditions.checkNotNull(input);
+      this.evaluationSynchronizer = Preconditions.checkNotNull(evaluationSynchronizer);
     }
   }
 
-  // Context class just lines handler queue.
-  static class KeyEventCallBackContext {
+  /** Context class just lines handler queue. */
+  @VisibleForTesting static class KeyEventCallbackContext {
+
     final KeyEventInterface triggeringKeyEvent;
     final EvaluationCallback callback;
     final Handler callbackHandler;
 
-    KeyEventCallBackContext(KeyEventInterface triggeringKeyEvent,
+    KeyEventCallbackContext(KeyEventInterface triggeringKeyEvent,
                             EvaluationCallback callback,
                             Handler callbackHandler) {
-      this.triggeringKeyEvent = triggeringKeyEvent;
-      this.callback = callback;
-      this.callbackHandler = callbackHandler;
+      this.triggeringKeyEvent = Preconditions.checkNotNull(triggeringKeyEvent);
+      this.callback = Preconditions.checkNotNull(callback);
+      this.callbackHandler = Preconditions.checkNotNull(callbackHandler);
     }
   }
 
@@ -222,9 +231,8 @@
    * the UI thread if necessary.
    * All evaluations should be done with this class in order to keep evaluation in the incoming
    * order.
-   * Package private for testing purpose.
    */
-  static class ExecutorMainCallback implements Handler.Callback {
+  @VisibleForTesting static class ExecutorMainCallback implements Handler.Callback {
 
     /**
      * Initializes the currently connected sesion handler.
@@ -292,20 +300,19 @@
     // Mozc session's ID.
     // Set on CREATE_SESSION and will not be updated.
     @VisibleForTesting long sessionId = INVALID_SESSION_ID;
-    @VisibleForTesting Request.Builder request;
+    @VisibleForTesting Optional<Request.Builder> request = Optional.absent();
 
     // The logging for debugging is disabled by default.
     boolean isLogging = false;
 
-    ExecutorMainCallback(SessionHandler sessionHandler) {
-      if (sessionHandler == null) {
-        throw new NullPointerException("sessionHandler is null.");
-      }
-      this.sessionHandler = sessionHandler;
+    @VisibleForTesting ExecutorMainCallback(SessionHandler sessionHandler) {
+      this.sessionHandler = Preconditions.checkNotNull(sessionHandler);
     }
 
     @Override
     public boolean handleMessage(Message message) {
+      Preconditions.checkNotNull(message);
+
       // Dispatch the message.
       switch (message.what) {
         case INITIALIZE_SESSION_HANDLER:
@@ -322,12 +329,11 @@
         case EVALUATE_SYNCHRONOUSLY:
           evaluateSynchronously(SynchronousEvaluationContext.class.cast(message.obj));
           break;
-        case UPDATE_REQUEST: {
+        case UPDATE_REQUEST:
           updateRequest(Input.Builder.class.cast(message.obj));
           break;
-        }
         case PASS_TO_CALLBACK:
-          passToCallBack(KeyEventCallBackContext.class.cast(message.obj));
+          passToCallBack(KeyEventCallbackContext.class.cast(message.obj));
           break;
         default:
           // We don't process unknown messages.
@@ -353,7 +359,7 @@
       return outCommand;
     }
 
-    void ensureSession() {
+    @VisibleForTesting void ensureSession() {
       if (sessionId != INVALID_SESSION_ID) {
         return;
       }
@@ -370,15 +376,13 @@
       // with ignoring its result.
       // Set mobile dedicated fields, which will not be changed.
       // Other fields may be set when the input view is changed.
-      request = Request.newBuilder()
-          .setMixedConversion(true)
-          .setZeroQuerySuggestion(true)
-          .setUpdateInputModeFromSurroundingText(false)
-          .setAutoPartialSuggestion(true);
+      Request.Builder builder = Request.newBuilder();
+      MozcUtil.setSoftwareKeyboardRequest(builder);
+      request = Optional.of(builder);
       evaluate(Input.newBuilder()
           .setId(sessionId)
           .setType(CommandType.SET_REQUEST)
-          .setRequest(request)
+          .setRequest(request.get())
           .build());
     }
 
@@ -393,7 +397,7 @@
           .build();
       evaluate(input);
       sessionId = INVALID_SESSION_ID;
-      request = null;
+      request = Optional.<Request.Builder>absent();
     }
 
     /**
@@ -407,7 +411,7 @@
      * result). Squashing will happen when an output consists from only overwritable fields and
      * then another output, which will overwrite the UI change caused by the older output, comes.
      */
-    static boolean isSquashableOutput(Output output) {
+    @VisibleForTesting static boolean isSquashableOutput(Output output) {
       // - If the output contains a result, it is not squashable because it is necessary
       //   to commit the string to the client application.
       // - If it has deletion_range, it is not squashable either because it is necessary
@@ -429,22 +433,22 @@
      * @return {@code true} if the given {@code inputBuilder} needs to be set session id.
      *   Otherwise {@code false}.
      */
-    static boolean isSessionIdRequired(InputOrBuilder input) {
+    @VisibleForTesting static boolean isSessionIdRequired(InputOrBuilder input) {
       return !SESSION_INDEPENDENT_COMMAND_TYPE_SET.contains(input.getType());
     }
 
-    void evaluateAsynchronously(AsynchronousEvaluationContext context,
-                                Handler sessionExecutorHandler) {
+    @VisibleForTesting void evaluateAsynchronously(AsynchronousEvaluationContext context,
+                                                   Handler sessionExecutorHandler) {
       // Before the evaluation, we remove all pending squashable result callbacks for performance
       // reason of less powerful devices.
       Input.Builder inputBuilder = context.inputBuilder;
-      Handler callbackHandler = context.callbackHandler;
-      if (callbackHandler != null &&
-          inputBuilder.getCommand().getType() != SessionCommand.CommandType.EXPAND_SUGGESTION) {
+      Optional<Handler> callbackHandler = context.callbackHandler;
+      if (callbackHandler.isPresent()
+          && inputBuilder.getCommand().getType() != SessionCommand.CommandType.EXPAND_SUGGESTION) {
         // Do not squash by EXPAND_SUGGESTION request, because the result of EXPAND_SUGGESTION
         // won't affect the inputConnection in MozcService, as the result should update
         // only candidates conceptually.
-        callbackHandler.removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
+        callbackHandler.get().removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
       }
 
       if (inputBuilder.hasKey() &&
@@ -463,51 +467,50 @@
         ensureSession();
         inputBuilder.setId(sessionId);
       }
-      context.outCommand = evaluate(inputBuilder.build());
+      context.outCommand = Optional.of(evaluate(inputBuilder.build()));
 
       // Invoke callback handler if necessary.
-      if (callbackHandler != null) {
+      if (callbackHandler.isPresent()) {
         // For performance reason of, especially, less powerful devices, we want to skip
         // rendering whose effect will be overwritten by following (pending) rendering.
         // We annotate if the output can be overwritten or not here, so that we can remove
         // only those messages in later evaluation.
-        Output output = context.outCommand.getOutput();
-        Message message = callbackHandler.obtainMessage(
+        Output output = context.outCommand.get().getOutput();
+        Message message = callbackHandler.get().obtainMessage(
             isSquashableOutput(output) ? CallbackHandler.SQUASHABLE_OUTPUT
                                        : CallbackHandler.UNSQUASHABLE_OUTPUT,
             context);
-        callbackHandler.sendMessage(message);
+        callbackHandler.get().sendMessage(message);
       }
     }
 
-    void evaluateSynchronously(SynchronousEvaluationContext context) {
+    @VisibleForTesting void evaluateSynchronously(SynchronousEvaluationContext context) {
       Input input = context.input;
-      if (isSessionIdRequired(input)) {
-        // We expect only non-session-id-related input for synchronous evaluation.
-        throw new IllegalArgumentException(
-            "session id is required in evaluateSynchronously, but we don't expect it: " + input);
-      }
+      Preconditions.checkArgument(
+          !isSessionIdRequired(input),
+          "We expect only non-session-id-related input for synchronous evaluation: " + input);
 
-      context.outCommand = evaluate(input);
+      context.outCommand = Optional.of(evaluate(input));
 
        // The client thread is waiting for the evaluation by evaluationSynchronizer,
        // so notify the thread via the lock.
        context.evaluationSynchronizer.countDown();
     }
 
-    void updateRequest(Input.Builder inputBuilder) {
+    @VisibleForTesting void updateRequest(Input.Builder inputBuilder) {
       ensureSession();
-      request.mergeFrom(inputBuilder.getRequest());
+      Preconditions.checkState(request.isPresent());
+      request.get().mergeFrom(inputBuilder.getRequest());
       Input input = inputBuilder
           .setId(sessionId)
           .setType(CommandType.SET_REQUEST)
-          .setRequest(request)
+          .setRequest(request.get())
           .build();
       // Do not render the result because the result does not have preedit.
       evaluate(input);
     }
 
-    void passToCallBack(KeyEventCallBackContext context) {
+    @VisibleForTesting void passToCallBack(KeyEventCallbackContext context) {
       Handler callbackHandler = context.callbackHandler;
       Message message = callbackHandler.obtainMessage(CallbackHandler.UNSQUASHABLE_OUTPUT, context);
       callbackHandler.sendMessage(message);
@@ -517,7 +520,7 @@
   /**
    * A handler to process callback for asynchronous evaluation on the UI thread.
    */
-  static class CallbackHandler extends Handler {
+  @VisibleForTesting static class CallbackHandler extends Handler {
     /**
      * The message with this {@code what} cannot be overwritten by following evaluation.
      */
@@ -536,30 +539,28 @@
 
     @Override
     public void handleMessage(Message message) {
-      if (message.obj.getClass() == KeyEventCallBackContext.class) {
-        KeyEventCallBackContext keyEventContext = KeyEventCallBackContext.class.cast(message.obj);
-        keyEventContext.callback.onCompleted(null, keyEventContext.triggeringKeyEvent);
+      if (Preconditions.checkNotNull(message).obj.getClass() == KeyEventCallbackContext.class) {
+        KeyEventCallbackContext keyEventContext = KeyEventCallbackContext.class.cast(message.obj);
+        keyEventContext.callback.onCompleted(
+            Optional.<Command>absent(), Optional.of(keyEventContext.triggeringKeyEvent));
         return;
       }
-      AsynchronousEvaluationContext context =
-          AsynchronousEvaluationContext.class.cast(message.obj);
+      AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
       // Note that this method should be run on the UI thread, where removePendingEvaluations runs,
       // so we don't need to take a lock here.
       if (context.timeStamp - cancelTimeStamp > 0) {
-        context.callback.onCompleted(context.outCommand, context.triggeringKeyEvent);
+        Preconditions.checkState(context.callback.isPresent());
+        context.callback.get().onCompleted(context.outCommand, context.triggeringKeyEvent);
       }
     }
   }
 
-  @VisibleForTesting Handler handler;
-  private ExecutorMainCallback mainCallback;
+  @VisibleForTesting Optional<Handler> handler = Optional.absent();
+  private Optional<ExecutorMainCallback> mainCallback = Optional.absent();
   private final CallbackHandler callbackHandler;
 
   // Note that theoretically the constructor should be private in order to keep this singleton,
-  // but we use protected for testing purpose.
-  protected SessionExecutor() {
-    handler = null;
-    mainCallback = null;
+  @VisibleForTesting protected SessionExecutor() {
     callbackHandler = new CallbackHandler(Looper.getMainLooper());
   }
 
@@ -583,7 +584,8 @@
    */
   @VisibleForTesting
   public void waitForAllQueuesForEmpty() {
-    waitForQueueForEmpty(handler);
+    Preconditions.checkState(handler.isPresent());
+    waitForQueueForEmpty(handler.get());
     waitForQueueForEmpty(callbackHandler);
   }
 
@@ -591,19 +593,21 @@
    * Resets the instance by setting {@code SessionHandler} created by the given {@code factory}.
    */
   public void reset(SessionHandlerFactory factory, Context applicationContext) {
+    Preconditions.checkNotNull(factory);
+    Preconditions.checkNotNull(applicationContext);
     HandlerThread thread = getHandlerThread();
-    mainCallback = new ExecutorMainCallback(factory.create());
-    handler = new Handler(thread.getLooper(), mainCallback);
-    handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.INITIALIZE_SESSION_HANDLER,
-                                              applicationContext));
+    mainCallback = Optional.of(new ExecutorMainCallback(factory.create()));
+    handler = Optional.of(new Handler(thread.getLooper(), mainCallback.get()));
+    handler.get().sendMessage(handler.get().obtainMessage(
+        ExecutorMainCallback.INITIALIZE_SESSION_HANDLER, applicationContext));
   }
 
   /**
    * @param isLogging Set {@code true} if logging of evaluations is needed.
    */
   public void setLogging(boolean isLogging) {
-    if (mainCallback != null) {
-      mainCallback.isLogging = isLogging;
+    if (mainCallback.isPresent()) {
+      mainCallback.get().isLogging = isLogging;
     }
   }
 
@@ -612,18 +616,19 @@
    */
   public void removePendingEvaluations() {
     callbackHandler.cancelTimeStamp = System.nanoTime();
-    if (handler != null) {
-      handler.removeMessages(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY);
-      handler.removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
-      handler.removeMessages(ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY);
-      handler.removeMessages(ExecutorMainCallback.UPDATE_REQUEST);
+    if (handler.isPresent()) {
+      handler.get().removeMessages(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY);
+      handler.get().removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
+      handler.get().removeMessages(ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY);
+      handler.get().removeMessages(ExecutorMainCallback.UPDATE_REQUEST);
     }
     callbackHandler.removeMessages(CallbackHandler.UNSQUASHABLE_OUTPUT);
     callbackHandler.removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
   }
 
   public void deleteSession() {
-    handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.DELETE_SESSION));
+    Preconditions.checkState(handler.isPresent());
+    handler.get().sendMessage(handler.get().obtainMessage(ExecutorMainCallback.DELETE_SESSION));
   }
 
   /**
@@ -634,71 +639,84 @@
    * This method returns immediately, i.e., even after this method's invocation,
    * it shouldn't be assumed that the evaluation is done.
    *
-   * Note that this method is exposed as package private for testing purpose.
-   *
    * @param inputBuilder the input data
    * @param triggeringKeyEvent a key event which triggers this evaluation
    * @param callback a callback handler if needed
    */
-  void evaluateAsynchronously(Input.Builder inputBuilder, KeyEventInterface triggeringKeyEvent,
-                                     EvaluationCallback callback) {
+  @VisibleForTesting void evaluateAsynchronously(
+      Input.Builder inputBuilder, Optional<KeyEventInterface> triggeringKeyEvent,
+      Optional<EvaluationCallback> callback) {
+    Preconditions.checkState(handler.isPresent());
     AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
-        System.nanoTime(), inputBuilder, triggeringKeyEvent,
-        callback, callback == null ? null : callbackHandler);
-    int type = (triggeringKeyEvent != null)
+        System.nanoTime(), Preconditions.checkNotNull(inputBuilder),
+        Preconditions.checkNotNull(triggeringKeyEvent), Preconditions.checkNotNull(callback),
+        callback.isPresent() ? Optional.<Handler>of(callbackHandler) : Optional.<Handler>absent());
+    int type = (triggeringKeyEvent.isPresent())
         ? ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY
         : ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY;
-    handler.sendMessage(handler.obtainMessage(type, context));
+    handler.get().sendMessage(handler.get().obtainMessage(type, context));
   }
 
   /**
    * Sends {@code SEND_KEY} command to the server asynchronously.
    */
   public void sendKey(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface triggeringKeyEvent,
-                      List<? extends TouchEvent> touchEventList, EvaluationCallback callback) {
+                      List<TouchEvent> touchEventList, EvaluationCallback callback) {
+    Preconditions.checkNotNull(mozcKeyEvent);
+    Preconditions.checkNotNull(triggeringKeyEvent);
+    Preconditions.checkNotNull(touchEventList);
+    Preconditions.checkNotNull(callback);
+
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_KEY)
         .setKey(mozcKeyEvent)
         .addAllTouchEvents(touchEventList);
-    evaluateAsynchronously(inputBuilder, triggeringKeyEvent, callback);
+    evaluateAsynchronously(inputBuilder, Optional.of(triggeringKeyEvent), Optional.of(callback));
   }
 
   /**
    * Sends {@code SUBMIT} command to the server asynchronously.
    */
   public void submit(EvaluationCallback callback) {
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.SUBMIT));
-    evaluateAsynchronously(inputBuilder, null, callback);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
   }
 
   /**
    * Sends {@code SWITCH_INPUT_MODE} command to the server asynchronously.
    */
-  public void switchInputMode(KeyEventInterface triggeringKeyEvent, CompositionMode mode,
+  public void switchInputMode(Optional<KeyEventInterface> triggeringKeyEvent, CompositionMode mode,
                               EvaluationCallback callback) {
+    Preconditions.checkNotNull(triggeringKeyEvent);
+    Preconditions.checkNotNull(mode);
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
             .setCompositionMode(mode));
-    evaluateAsynchronously(inputBuilder, triggeringKeyEvent, callback);
+    evaluateAsynchronously(inputBuilder, triggeringKeyEvent, Optional.of(callback));
   }
 
   /**
    * Sends {@code SUBMIT_CANDIDATE} command to the server asynchronously.
    */
   public void submitCandidate(int candidateId, Optional<Integer> rowIndex,
-      EvaluationCallback callback) {
+                              EvaluationCallback callback) {
     Preconditions.checkNotNull(rowIndex);
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.SUBMIT_CANDIDATE)
             .setId(candidateId));
-    evaluateAsynchronously(inputBuilder, null, callback);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
 
     if (rowIndex.isPresent()) {
       candidateSubmissionStatsEvent(rowIndex.get());
@@ -753,45 +771,78 @@
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.RESET_CONTEXT));
-    evaluateAsynchronously(inputBuilder, null, null);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   /**
    * Sends {@code MOVE_CURSOR} command to the server asynchronously.
    */
   public void moveCursor(int cursorPosition, EvaluationCallback callback) {
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(ProtoCommands.SessionCommand.CommandType.MOVE_CURSOR)
             .setCursorPosition(cursorPosition));
-    evaluateAsynchronously(inputBuilder, null, callback);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
+  }
+
+  /**
+   * Sends {@code CONVERT_NEXT_PAGE} command to the server asynchronously.
+   */
+  public void pageDown(EvaluationCallback callback) {
+    Preconditions.checkNotNull(callback);
+    Input.Builder inputBuilder = Input.newBuilder()
+        .setType(CommandType.SEND_COMMAND)
+        .setCommand(SessionCommand.newBuilder()
+            .setType(SessionCommand.CommandType.CONVERT_NEXT_PAGE));
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
+  }
+
+  /**
+   * Sends {@code CONVERT_PREV_PAGE} command to the server asynchronously.
+   */
+  public void pageUp(EvaluationCallback callback) {
+    Preconditions.checkNotNull(callback);
+    Input.Builder inputBuilder = Input.newBuilder()
+        .setType(CommandType.SEND_COMMAND)
+        .setCommand(SessionCommand.newBuilder()
+            .setType(SessionCommand.CommandType.CONVERT_PREV_PAGE));
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
   }
 
   /**
    * Sends {@code SWITCH_INPUT_FIELD_TYPE} command to the server asynchronously.
    */
   public void switchInputFieldType(InputFieldType inputFieldType) {
+    Preconditions.checkNotNull(inputFieldType);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(ProtoCommands.SessionCommand.CommandType.SWITCH_INPUT_FIELD_TYPE))
         .setContext(ProtoCommands.Context.newBuilder()
             .setInputFieldType(inputFieldType));
-    evaluateAsynchronously(inputBuilder, null, null);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   /**
    * Sends {@code UNDO_OR_REWIND} command to the server asynchronously.
    */
-  public void undoOrRewind(List<? extends TouchEvent> touchEventList,
-                           EvaluationCallback callback) {
+  public void undoOrRewind(List<TouchEvent> touchEventList, EvaluationCallback callback) {
+    Preconditions.checkNotNull(touchEventList);
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.UNDO_OR_REWIND))
         .addAllTouchEvents(touchEventList);
-    evaluateAsynchronously(inputBuilder, null, callback);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
   }
 
   /**
@@ -799,28 +850,36 @@
    * to the server asynchronously.
    */
   public void insertToStorage(StorageType type, String key, List<ByteString> values) {
+    Preconditions.checkNotNull(type);
+    Preconditions.checkNotNull(key);
+    Preconditions.checkNotNull(values);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.INSERT_TO_STORAGE)
         .setStorageEntry(GenericStorageEntry.newBuilder()
             .setType(type)
             .setKey(key)
             .addAllValue(values));
-    evaluateAsynchronously(inputBuilder, null, null);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   public void expandSuggestion(EvaluationCallback callback) {
+    Preconditions.checkNotNull(callback);
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SEND_COMMAND)
         .setCommand(
             SessionCommand.newBuilder().setType(SessionCommand.CommandType.EXPAND_SUGGESTION));
-    evaluateAsynchronously(inputBuilder, null, callback);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
   }
 
-  public void preferenceUsageStatsEvent(SharedPreferences sharedPreferences) {
+  public void preferenceUsageStatsEvent(SharedPreferences sharedPreferences, Resources resources) {
     Preconditions.checkNotNull(sharedPreferences);
+    Preconditions.checkNotNull(resources);
 
     ClientSidePreference landscapePreference =
-        new ClientSidePreference(sharedPreferences, Configuration.ORIENTATION_LANDSCAPE);
+        new ClientSidePreference(
+            sharedPreferences, resources, Configuration.ORIENTATION_LANDSCAPE);
     evaluateAsynchronously(
         Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
@@ -828,10 +887,11 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
                 .setUsageStatsEventIntValue(landscapePreference.getKeyboardLayout().getId())),
-        null, null);
+        Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
 
     ClientSidePreference portraitPreference =
-        new ClientSidePreference(sharedPreferences, Configuration.ORIENTATION_PORTRAIT);
+        new ClientSidePreference(
+            sharedPreferences, resources, Configuration.ORIENTATION_PORTRAIT);
     evaluateAsynchronously(
         Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
@@ -839,10 +899,10 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
                 .setUsageStatsEventIntValue(portraitPreference.getKeyboardLayout().getId())),
-        null, null);
+        Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
-  public void touchEventUsageStatsEvent(List<? extends TouchEvent> touchEventList) {
+  public void touchEventUsageStatsEvent(List<TouchEvent> touchEventList) {
     if (Preconditions.checkNotNull(touchEventList).isEmpty()) {
       return;
     }
@@ -852,26 +912,27 @@
         .setCommand(SessionCommand.newBuilder()
             .setType(SessionCommand.CommandType.USAGE_STATS_EVENT))
         .addAllTouchEvents(touchEventList);
-    evaluateAsynchronously(inputBuilder, null, null);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   public void syncData() {
     Input.Builder inputBuilder = Input.newBuilder()
         .setType(CommandType.SYNC_DATA);
-    evaluateAsynchronously(inputBuilder, null, null);
+    evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   /**
    * Evaluates the input on the JNI worker thread, and wait that the evaluation is done.
    * This method blocks (typically <30ms).
-   *
-   * Note that this method is exposed as package private for testing purpose.
    */
-  Output evaluateSynchronously(Input input) {
+  @VisibleForTesting Output evaluateSynchronously(Input input) {
+    Preconditions.checkState(handler.isPresent());
     CountDownLatch evaluationSynchronizer = new CountDownLatch(1);
     SynchronousEvaluationContext context =
           new SynchronousEvaluationContext(input, evaluationSynchronizer);
-    handler.sendMessage(handler.obtainMessage(
+    handler.get().sendMessage(handler.get().obtainMessage(
         ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY, context));
 
     try {
@@ -880,7 +941,7 @@
       MozcLog.w("Session thread is interrupted during evaluation.");
     }
 
-    return context.outCommand.getOutput();
+    return context.outCommand.get().getOutput();
   }
 
   /**
@@ -895,19 +956,22 @@
    * Sets the given {@code config} to the server.
    */
   public void setConfig(Config config) {
+    Preconditions.checkNotNull(config);
     // Ignore output.
     evaluateAsynchronously(
-        Input.newBuilder().setType(Input.CommandType.SET_CONFIG).setConfig(config), null, null);
+        Input.newBuilder().setType(Input.CommandType.SET_CONFIG).setConfig(config),
+        Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   /**
    * Sets the given {@code config} to the server as imposed config.
    */
   public void setImposedConfig(Config config) {
+    Preconditions.checkNotNull(config);
     // Ignore output.
     evaluateAsynchronously(
         Input.newBuilder().setType(Input.CommandType.SET_IMPOSED_CONFIG).setConfig(config),
-        null, null);
+        Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 
   /**
@@ -939,6 +1003,7 @@
    * @param storageType the storage to be cleared
    */
   public void clearStorage(StorageType storageType) {
+    Preconditions.checkNotNull(storageType);
     evaluateSynchronously(
         Input.newBuilder()
             .setType(CommandType.CLEAR_STORAGE)
@@ -950,6 +1015,7 @@
    * Reads stored values of the given {@code type} from the server, and returns it.
    */
   public List<ByteString> readAllFromStorage(StorageType type) {
+    Preconditions.checkNotNull(type);
     Input input = Input.newBuilder()
         .setType(CommandType.READ_ALL_FROM_STORAGE)
         .setStorageEntry(GenericStorageEntry.newBuilder()
@@ -965,13 +1031,15 @@
   public void reload() {
     // Ignore output.
     evaluateAsynchronously(
-        Input.newBuilder().setType(Input.CommandType.RELOAD), null, null);
+        Input.newBuilder().setType(Input.CommandType.RELOAD), Optional.<KeyEventInterface>absent(),
+        Optional.<EvaluationCallback>absent());
   }
 
   /**
    * Sends SEND_USER_DICTIONARY_COMMAND to edit user dictionaries.
    */
   public UserDictionaryCommandStatus sendUserDictionaryCommand(UserDictionaryCommand command) {
+    Preconditions.checkNotNull(command);
     Output output = evaluateSynchronously(Input.newBuilder()
         .setType(CommandType.SEND_USER_DICTIONARY_COMMAND)
         .setUserDictionaryCommand(command)
@@ -982,26 +1050,34 @@
   /**
    * Sends an UPDATE_REQUEST command to the evaluation thread.
    */
-  public void updateRequest(Request update, List<? extends TouchEvent> touchEventList) {
+  public void updateRequest(Request update, List<TouchEvent> touchEventList) {
+    Preconditions.checkNotNull(update);
+    Preconditions.checkNotNull(touchEventList);
+    Preconditions.checkState(handler.isPresent());
     Input.Builder inputBuilder = Input.newBuilder()
         .setRequest(update)
         .addAllTouchEvents(touchEventList);
-    handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.UPDATE_REQUEST, inputBuilder));
+    handler.get().sendMessage(
+        handler.get().obtainMessage(ExecutorMainCallback.UPDATE_REQUEST, inputBuilder));
   }
 
   public void sendKeyEvent(KeyEventInterface triggeringKeyEvent, EvaluationCallback callback) {
-    KeyEventCallBackContext context = new KeyEventCallBackContext(
-        triggeringKeyEvent, callback, callbackHandler);
-    handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.PASS_TO_CALLBACK, context));
+    Preconditions.checkNotNull(triggeringKeyEvent);
+    Preconditions.checkNotNull(callback);
+    Preconditions.checkState(handler.isPresent());
+    KeyEventCallbackContext context =
+        new KeyEventCallbackContext(triggeringKeyEvent, callback, callbackHandler);
+    handler.get().sendMessage(
+        handler.get().obtainMessage(ExecutorMainCallback.PASS_TO_CALLBACK, context));
   }
 
   public void sendUsageStatsEvent(UsageStatsEvent event) {
     evaluateAsynchronously(
         Input.newBuilder()
-        .setType(CommandType.SEND_COMMAND)
-        .setCommand(SessionCommand.newBuilder()
-            .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
-            .setUsageStatsEvent(event)),
-        null, null);
+            .setType(CommandType.SEND_COMMAND)
+            .setCommand(SessionCommand.newBuilder()
+                .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
+                .setUsageStatsEvent(event)),
+        Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
index 6911632..e352752 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
@@ -31,6 +31,8 @@
 
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -48,6 +50,7 @@
  *
  */
 public class SessionHandlerFactory {
+
   @VisibleForTesting static final String PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY =
       "pref_tweak_use_socket_session_handler";
   @VisibleForTesting static final String PREF_TWEAK_SOCKET_SESSION_HANDLER_ADDRESS_KEY =
@@ -55,25 +58,26 @@
   @VisibleForTesting static final String PREF_TWEAK_SOCKET_SESSION_HANDLER_PORT_KEY =
       "pref_tweak_socket_session_handler_port";
 
-  private final SharedPreferences sharedPreferences;
+  private final Optional<SharedPreferences> sharedPreferences;
 
   public SessionHandlerFactory(Context context) {
-    this(context == null ? null : PreferenceManager.getDefaultSharedPreferences(context));
+    this(Optional.of(
+        PreferenceManager.getDefaultSharedPreferences(Preconditions.checkNotNull(context))));
   }
 
   /**
    * @param sharedPreferences the preferences. The type to be created is based on the preference.
    */
-  public SessionHandlerFactory(SharedPreferences sharedPreferences) {
-    this.sharedPreferences = sharedPreferences;
+  public SessionHandlerFactory(Optional<SharedPreferences> sharedPreferences) {
+    this.sharedPreferences = Preconditions.checkNotNull(sharedPreferences);
   }
 
   /**
    * Creates a session handler.
    */
   public SessionHandler create() {
-    if (sharedPreferences != null &&
-        sharedPreferences.getBoolean(PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY, false)) {
+    if (sharedPreferences.isPresent()
+        && sharedPreferences.get().getBoolean(PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY, false)) {
       try {
         MozcLog.i("Trying to connect to Mozc server via network");
         // If PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY is enabled,
@@ -81,10 +85,10 @@
         // "10.0.2.2" is the host PC's address in emulator environment.
         // 8000 is the server's default port.
         int port =
-            Integer.parseInt(sharedPreferences.getString(
+            Integer.parseInt(sharedPreferences.get().getString(
                 PREF_TWEAK_SOCKET_SESSION_HANDLER_PORT_KEY, "8000"));
         InetAddress hostAddress =
-            InetAddress.getByName(sharedPreferences.getString(
+            InetAddress.getByName(sharedPreferences.get().getString(
                 PREF_TWEAK_SOCKET_SESSION_HANDLER_ADDRESS_KEY, "10.0.2.2"));
         SocketSessionHandler socketSessionHandler = new SocketSessionHandler(hostAddress, port);
         if (socketSessionHandler.isReachable()) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java b/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
index 2546393..6d2e5dc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
@@ -32,6 +32,7 @@
 import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import com.google.common.base.Preconditions;
 
 import android.content.Context;
 
@@ -58,7 +59,7 @@
   private final InetAddress host;
   private final int port;
   SocketSessionHandler(InetAddress host, int port) {
-    this.host = host;
+    this.host = Preconditions.checkNotNull(host);
     this.port = port;
   }
 
@@ -69,6 +70,8 @@
 
   @Override
   public Command evalCommand(Command command) {
+    Preconditions.checkNotNull(command);
+
     // We should be in a worker thread so below invocation is not needed. Just in case.
     MozcUtil.relaxMainthreadStrictMode();
     try {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java b/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
index 18f3860..a29ee1e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
@@ -29,12 +29,12 @@
 
 package org.mozc.android.inputmethod.japanese.ui;
 
-import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
 import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -42,17 +42,18 @@
 import android.annotation.SuppressLint;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Paint;
 import android.graphics.Paint.Align;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.StaticLayout;
 import android.text.TextPaint;
-import android.util.FloatMath;
-import android.view.View;
 
 import java.util.List;
+import java.util.Locale;
 
 /**
  * Renders the {@link CandidateLayout} instance to the {@link Canvas}.
@@ -102,6 +103,11 @@
      * won't be overlapped).
      */
     EXCLUSIVE,
+
+    /**
+     * Like View.GONE, the descriptor is not shown and doesn't occupy any are.
+     */
+    GONE,
   }
 
   private static final int[] STATE_EMPTY = {};
@@ -110,9 +116,14 @@
   // Should not edit its contents.
   private static final int[] STATE_FOCUSED = { android.R.attr.state_focused };
 
-  private final CarrierEmojiRenderHelper carrierEmojiRenderHelper;
+  /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+  private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+      ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
+
   private final TextPaint valuePaint = createTextPaint(true, Color.BLACK, Align.LEFT);
+  private final TextPaint focusedValuePaint = createTextPaint(true, Color.BLACK, Align.LEFT);
   private final TextPaint descriptionPaint = createTextPaint(true, Color.GRAY, Align.RIGHT);
+  private final Paint separatorPaint = new Paint();
 
   /**
    * The cache of Rect instance for the clip used in drawCandidateList method to reduce the
@@ -130,18 +141,21 @@
   private ValueScalingPolicy valueScalingPolicy = ValueScalingPolicy.UNIFORM;
   private DescriptionLayoutPolicy descriptionLayoutPolicy = DescriptionLayoutPolicy.OVERLAY;
 
-  private Optional<Drawable> spanBackgroundDrawable;
+  private Optional<Drawable> spanBackgroundDrawable = Optional.absent();
   @VisibleForTesting int focusedIndex = -1;
 
-  public CandidateLayoutRenderer(View targetView) {
-    carrierEmojiRenderHelper = new CarrierEmojiRenderHelper(Preconditions.checkNotNull(targetView));
+  public CandidateLayoutRenderer() {
   }
 
+  @SuppressLint("NewApi")
   private static TextPaint createTextPaint(boolean antiAlias, int color, Align align) {
     TextPaint textPaint = new TextPaint();
     textPaint.setAntiAlias(antiAlias);
     textPaint.setColor(color);
     textPaint.setTextAlign(Preconditions.checkNotNull(align));
+    if (TEXT_LOCALE.isPresent()) {
+      textPaint.setTextLocale(TEXT_LOCALE.get());
+    }
     return textPaint;
   }
 
@@ -151,10 +165,16 @@
     return (index == focusedIndex) || (index == pressedCandidateIndex);
   }
 
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    valuePaint.setColor(skin.candidateValueTextColor);
+    focusedValuePaint.setColor(skin.candidateValueFocusedTextColor);
+    descriptionPaint.setColor(skin.candidateDescriptionTextColor);
+  }
+
   public void setValueTextSize(float valueTextSize) {
     this.valueTextSize = valueTextSize;
     this.valuePaint.setTextSize(valueTextSize);
-    this.carrierEmojiRenderHelper.setCandidateTextSize(valueTextSize);
   }
 
   public void setValueHorizontalPadding(float valueHorizontalPadding) {
@@ -182,11 +202,6 @@
     this.descriptionLayoutPolicy = Preconditions.checkNotNull(descriptionLayoutPolicy);
   }
 
-  public void setEmojiProviderType(EmojiProviderType emojiProviderType) {
-    this.carrierEmojiRenderHelper.setEmojiProviderType(
-        Preconditions.checkNotNull(emojiProviderType));
-  }
-
   public void setSpanBackgroundDrawable(Optional<Drawable> drawable) {
     this.spanBackgroundDrawable = Preconditions.checkNotNull(drawable);
   }
@@ -196,31 +211,22 @@
     focusedIndex = (candidateList.isPresent() && candidateList.get().hasFocusedIndex())
         ? candidateList.get().getFocusedIndex()
         : -1;
-    carrierEmojiRenderHelper.setCandidateList(candidateList);
   }
 
-  /**
-   * In order to support emoji rendering, the client of this class must invoke this method
-   * in its onAttachedToWindow method.
-   */
-  public void onAttachedToWindow() {
-    carrierEmojiRenderHelper.onAttachedToWindow();
+  public void setSeparatorWidth(float separatorWidth) {
+    separatorPaint.setStrokeWidth(separatorWidth);
   }
 
-  /**
-   * In order to support emoji rendering, the client of this class must invoke this method
-   * in its onDeachedFromWindow method.
-   */
-  @SuppressLint("MissingSuperCall")
-  public void onDetachedFromWindow() {
-    carrierEmojiRenderHelper.onDetachedFromWindow();
+  public void setSeparatorColor(int color) {
+    separatorPaint.setColor(color);
   }
 
   /**
    * Renders the {@code candidateLayout} to the given {@code canvas}.
    */
   public void drawCandidateLayout(
-      Canvas canvas, CandidateLayout candidateLayout, int pressedCandidateIndex) {
+      Canvas canvas, CandidateLayout candidateLayout, int pressedCandidateIndex,
+      CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
     Preconditions.checkNotNull(canvas);
     Preconditions.checkNotNull(candidateLayout);
 
@@ -237,6 +243,10 @@
         continue;
       }
 
+      float separatorMargin = row.getHeight() * 0.2f;
+      float separatorTop = row.getTop() + separatorMargin;
+      float separatorBottom = row.getTop() + row.getHeight() - separatorMargin;
+
       for (Span span : row.getSpanList()) {
         if (span.getLeft() > clipBounds.right) {
           break;
@@ -244,16 +254,23 @@
         if (span.getRight() < clipBounds.left) {
           continue;
         }
-
-        if (span.getCandidateWord().isPresent()) {
-          drawSpan(canvas, row, span,
-                   isFocused(span.getCandidateWord().get(), focusedIndex, pressedCandidateIndex));
+        // Even if span.getCandidateWord() is absent, draw the span in order to draw the background.
+        drawSpan(canvas, row, span,
+                 span.getCandidateWord().isPresent()
+                     && isFocused(span.getCandidateWord().get(),
+                                  focusedIndex, pressedCandidateIndex),
+                 carrierEmojiRenderHelper);
+        if (span.getLeft() != 0f) {
+          float separatorX = span.getLeft();
+          canvas.drawLine(separatorX, separatorTop, separatorX, separatorBottom, separatorPaint);
         }
       }
     }
   }
 
-  @VisibleForTesting void drawSpan(Canvas canvas, Row row, Span span, boolean isFocused) {
+  @VisibleForTesting void drawSpan(
+      Canvas canvas, Row row, Span span, boolean isFocused,
+      CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
     drawSpanBackground(
         Preconditions.checkNotNull(canvas), Preconditions.checkNotNull(row), span, isFocused);
     if (!span.getCandidateWord().isPresent()) {
@@ -261,15 +278,9 @@
     }
 
     if (carrierEmojiRenderHelper.isRenderableEmoji(span.getCandidateWord().get().getValue())) {
-      drawCarrierEmoji(canvas, row, span);
-      if (descriptionLayoutPolicy == DescriptionLayoutPolicy.OVERLAY) {
-        // Hack: This is a quick hack to keep the current behavior (especially on SymbolInputView).
-        // TODO(hidehiko): Remove this hack from here, instead, do not attach the description
-        //   to the candidate.
-        return;
-      }
+      drawCarrierEmoji(canvas, row, span, carrierEmojiRenderHelper);
     } else {
-      drawText(canvas, row, span);
+      drawText(canvas, row, span, isFocused);
     }
 
     drawDescription(canvas, row, span);
@@ -289,7 +300,8 @@
     spanBackgroundDrawable.draw(canvas);
   }
 
-  private void drawCarrierEmoji(Canvas canvas, Row row, Span span) {
+  private void drawCarrierEmoji(
+      Canvas canvas, Row row, Span span, CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
     Preconditions.checkState(span.getCandidateWord().isPresent());
 
     float descriptionWidth = (descriptionLayoutPolicy == DescriptionLayoutPolicy.EXCLUSIVE)
@@ -300,7 +312,7 @@
     carrierEmojiRenderHelper.drawEmoji(canvas, span.getCandidateWord().get(), centerX, centerY);
   }
 
-  private void drawText(Canvas canvas, Row row, Span span) {
+  private void drawText(Canvas canvas, Row row, Span span, boolean isFocused) {
     Preconditions.checkState(span.getCandidateWord().isPresent());
 
     String valueText = span.getCandidateWord().get().getValue();
@@ -308,25 +320,26 @@
       // No value is available.
       return;
     }
-
-    if (!span.getCachedLayout().isPresent()) {
+    // Calculate layout or get cached one.
+    // If isFocused is true, special paint should be applied.
+    // The resulting drawing is so special that it will not re reused.
+    // Therefore if isFocused is true cache is not used and always calculate the layout.
+    // In this case calculated layout is not cached.
+    Layout layout;
+    if (!isFocused && span.getCachedLayout().isPresent()) {
+      layout = span.getCachedLayout().get();
+    } else {
       // Set the scaling of the text.
       float descriptionWidth = (descriptionLayoutPolicy == DescriptionLayoutPolicy.EXCLUSIVE)
           ? span.getDescriptionWidth() : 0;
+      // Ensure that StaticLayout instance has positive width.
       float displayValueWidth =
-          span.getWidth() - valueHorizontalPadding * 2 - descriptionWidth;
+          Math.max(1f, span.getWidth() - valueHorizontalPadding * 2 - descriptionWidth);
       float textScale = Math.min(1f, displayValueWidth / span.getValueWidth());
-      TextPaint valuePaint = this.valuePaint;
+      TextPaint textPaint = isFocused ? this.focusedValuePaint : this.valuePaint;
       if (valueScalingPolicy == ValueScalingPolicy.HORIZONTAL) {
-        valuePaint.setTextSize(valueTextSize);
-        valuePaint.setTextScaleX(textScale);
-        // The scaled rendered text sometimes exceeds the available width for some reasons.
-        // In this case, the candidate word is unexpectedly rendered in two lines.
-        // To avoid this situation, textScale is gradually reduced to fit the available width.
-        for (int i = 0; valuePaint.measureText(valueText) > displayValueWidth && i < 10; ++i) {
-          textScale *= 0.97;
-          valuePaint.setTextScaleX(textScale);
-        }
+        textPaint.setTextSize(valueTextSize);
+        textPaint.setTextScaleX(textScale);
       } else {
         // Calculate the max limit of the "text size", in which we can render the candidate text
         // inside the given span.
@@ -334,19 +347,25 @@
         // Adjustment by font size can keep aspect ratio,
         // which is important for Emoticon especially.
         // Calculate the width with the default text size.
-        valuePaint.setTextSize(valueTextSize * textScale);
+        textPaint.setTextSize(valueTextSize * textScale);
       }
-
-      // Layout the text. In order to avoid unexpected line breaking, we include the horizontal
-      // padding (on both sides) into the width for the layout. It should be safe,
-      // because the Alignment is ALIGN_CENTER, so that having the padding should have
-      // no bad effect.
-      span.setCachedLayout(new StaticLayout(
-          valueText, new TextPaint(valuePaint),
-          (int) FloatMath.ceil(span.getWidth() - descriptionWidth),
-          Alignment.ALIGN_CENTER, 1, 0, false));
+      // Layout's width is theoretically `span.getWidth() - descriptionWidth`.
+      // However because of the spec of Paint#setTextScaleX() and Paint#setTextSize(),
+      // Paint#measureText() might return larger width than what both above methods expect it to be.
+      // As a workaround, if theoretical width is smaller than the result of Paint#measureText(),
+      // employ the width returned by Paint#measureText().
+      // This workaround is to avoid from unexpected line-break.
+      // NOTE: Canvas#scale() cannot be used here because we have to use StaticLayout to draw
+      //       Emoji and StaticLayout requires width in its constructor.
+      layout = new StaticLayout(
+          valueText, new TextPaint(textPaint),
+          (int) Math.ceil(Math.max(span.getWidth() - descriptionWidth,
+                                   textPaint.measureText(valueText))),
+          Alignment.ALIGN_CENTER, 1, 0, false);
+      if (!isFocused) {
+        span.setCachedLayout(layout);
+      }
     }
-    Layout layout = span.getCachedLayout().get();
 
     // Actually render the image to the canvas.
     int saveCount = canvas.save();
@@ -360,19 +379,25 @@
 
   private void drawDescription(Canvas canvas, Row row, Span span) {
     List<String> descriptionList = span.getSplitDescriptionList();
-    if (span.getDescriptionWidth() <= 0 || descriptionList.isEmpty()) {
-      // No description available.
+    if (span.getDescriptionWidth() <= 0 || descriptionList.isEmpty()
+        || descriptionLayoutPolicy == DescriptionLayoutPolicy.GONE) {
+      // No description available or the layout policy is GONE.
       return;
     }
 
     // Set the x-orientation scale based on the description's width to fit the span's region.
     TextPaint descriptionPaint = this.descriptionPaint;
     descriptionPaint.setTextSize(descriptionTextSize);
+    float centerOrRight;
     if (descriptionLayoutPolicy == DescriptionLayoutPolicy.OVERLAY) {
       float displayWidth = span.getWidth() - descriptionHorizontalPadding * 2;
       descriptionPaint.setTextScaleX(Math.min(1f, displayWidth / span.getDescriptionWidth()));
+      descriptionPaint.setTextAlign(Align.CENTER);
+      centerOrRight = (span.getLeft() + span.getRight()) / 2f;
     } else {
       descriptionPaint.setTextScaleX(1f);
+      descriptionPaint.setTextAlign(Align.RIGHT);
+      centerOrRight = span.getRight() - descriptionHorizontalPadding;
     }
 
     // Render first "N" description lines based on the layout height.
@@ -383,9 +408,8 @@
 
     float top = row.getTop() + row.getHeight()
         - descriptionVerticalPadding - descriptionTextSize * (numDescriptionLines - 1);
-    float right = span.getRight() - descriptionHorizontalPadding;
     for (String description : descriptionList.subList(0, numDescriptionLines)) {
-      canvas.drawText(description, right, top, descriptionPaint);
+      canvas.drawText(description, centerOrRight, top, descriptionPaint);
       top += descriptionTextSize;
     }
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java b/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
index 6c527c7..6580820 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
@@ -33,11 +33,10 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
-import android.util.FloatMath;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -84,7 +83,7 @@
       Preconditions.checkNotNull(span);
       float compressedValueWidth =
           compressValueWidth(span.getValueWidth(), compressionRatio, horizontalPadding, minWidth);
-      return (int) FloatMath.ceil((compressedValueWidth + span.getDescriptionWidth()) / chunkWidth);
+      return (int) Math.ceil((compressedValueWidth + span.getDescriptionWidth()) / chunkWidth);
     }
 
     static float compressValueWidth(
@@ -196,7 +195,7 @@
   }
 
   public int getRowHeight() {
-    return (int) FloatMath.ceil(valueHeight + valueVerticalPadding * 2);
+    return (int) Math.ceil(valueHeight + valueVerticalPadding * 2);
   }
 
   @Override
@@ -252,6 +251,7 @@
    *
    * The order of the candidates will be kept.
    */
+  @VisibleForTesting
   static List<Row> buildRowList(
       CandidateList candidateList, SpanFactory spanFactory,
       int numChunks, ChunkMetrics chunkMetrics, boolean enableSpan) {
@@ -297,6 +297,7 @@
    * The size of the buffer must be equal to or greater than {@code spanList.size()}.
    * Its elements needn't be initialized.
    */
+  @VisibleForTesting
   static void layoutSpanList(
       List<Span> spanList, int pageWidth,
       int numChunks, ChunkMetrics chunkMetrics, int[] numAllocatedChunks) {
@@ -317,10 +318,9 @@
       }
     }
 
-    // Then assign remaining chunks to each span as even as possible by round-robin
-    // from tail to head to keep the backward compatibility.
-    for (int index = spanList.size() - 1; numRemainingChunks > 0;
-         --numRemainingChunks, index = (index + spanList.size() - 1) % spanList.size()) {
+    // Then assign remaining chunks to each span as even as possible by round-robin.
+    for (int index = 0; numRemainingChunks > 0;
+         --numRemainingChunks, index = (index + 1) % spanList.size()) {
       ++numAllocatedChunks[index];
     }
 
@@ -344,6 +344,7 @@
   }
 
   /** Sets top, width and height to the each row. */
+  @VisibleForTesting
   static void layoutRowList(List<Row> rowList, int pageWidth, int rowHeight) {
     int top = 0;
     for (Row row : Preconditions.checkNotNull(rowList)) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java
new file mode 100644
index 0000000..1376ce2
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java
@@ -0,0 +1,500 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.ViewEventListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.FontMetrics;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.view.MotionEvent;
+
+import java.util.Locale;
+
+/**
+ * Layouts floating candidate window and draw it's contents on canvas.
+ *
+ * The point of origin of layout is NOT a left-top corner of candidate list BUT the left-top corner
+ * of the candidate column and the right-top corner of the shortcut column.
+ *
+ * TODO(hsumita): Rewrite using LinearLayout or something.
+ */
+public class FloatingCandidateLayoutRenderer {
+
+  private static class WindowRects {
+
+    public final Rect window;
+    public final Optional<Rect> focus;
+    public final Optional<Rect> pageIndicator;
+    public final Optional<RectF> scrollIndicator;
+
+    WindowRects(Rect window, Optional<Rect> focus, Optional<Rect> pageIndicator,
+                Optional<RectF> scrollIndicator) {
+      this.window = Preconditions.checkNotNull(window);
+      this.focus = Preconditions.checkNotNull(focus);
+      this.pageIndicator = Preconditions.checkNotNull(pageIndicator);
+      this.scrollIndicator = Preconditions.checkNotNull(scrollIndicator);
+    }
+  }
+
+  /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+  private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+      ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
+
+  private static final String FOOTER_TEXT_FORMAT = "%d / %d";
+
+  private final Paint candidatePaint;
+  private final Paint focusedCandidatePaint;
+  private final Paint descriptionPaint;
+  private final Paint shortcutPaint;
+  private final Paint footerPaint;
+  private final Paint separatorPaint;
+  private final Paint windowBackgroundPaint;
+  private final Paint focuseBackgroundPaint;
+  private final Paint scrollIndicatorPaint;
+
+  private final int windowMinimumWidth;
+  private final int windowHorizontalPadding;
+  private final float windowRoundRectRadius;
+  private final int candidateHeight;
+  private final int candidateOffsetY;
+  private final int candidateDescriptionMinimumPadding;
+  private final int footerHeight;
+  private final float footerTextCenterToBaseLineOffset;
+  private final int horizontalSeparatorPadding;
+  private final int shortcutWidth;
+  private final float shortcutCenterX;
+  private final int scrollIndicatorWidth;
+  private final int scrollIndicatorRadius;
+
+  private Optional<WindowRects> windowRects = Optional.absent();
+  private Optional<ViewEventListener> viewEventListener = Optional.absent();
+  private Optional<Candidates> candidates = Optional.absent();
+  private Optional<Integer> maxWidth = Optional.absent();
+  /** Focused candidate index, or tapped candidate index if exists. */
+  private Optional<Integer> focusedOrTappedCandidateIndexOnPage = Optional.absent();
+  /** TappedInfo for the current touch operation. Set on TOUCH_DOWN, reset on TOUCH_UP. */
+  private Optional<Integer> tappingCandidateIndex = Optional.absent();
+  private int totalCandidatesCount;
+  private int maxCandidateWidth;
+  private int maxDescriptionWidth;
+
+  public FloatingCandidateLayoutRenderer(Resources res) {
+    Preconditions.checkNotNull(res);
+
+    candidatePaint = new Paint();
+    candidatePaint.setColor(res.getColor(R.color.floating_candidate_text));
+    candidatePaint.setTextSize(res.getDimension(R.dimen.floating_candidate_text_size));
+    candidatePaint.setAntiAlias(true);
+    if (TEXT_LOCALE.isPresent()) {
+      candidatePaint.setTextLocale(TEXT_LOCALE.get());
+    }
+
+    focusedCandidatePaint = new Paint(candidatePaint);
+    focusedCandidatePaint.setColor(res.getColor(R.color.floating_candidate_focused_text));
+
+    descriptionPaint = new Paint(candidatePaint);
+    descriptionPaint.setTextSize(
+        res.getDimension(R.dimen.floating_candidate_description_text_size));
+    descriptionPaint.setColor(res.getColor(R.color.floating_candidate_description_text));
+
+    shortcutPaint = new Paint(candidatePaint);
+    shortcutPaint.setTextSize(res.getDimension(R.dimen.floating_candidate_shortcut_text_size));
+    shortcutPaint.setColor(res.getColor(R.color.floating_candidate_shortcut_text));
+
+    scrollIndicatorPaint = new Paint();
+    scrollIndicatorPaint.setColor(res.getColor(R.color.floating_candidate_scroll_indicator));
+
+    footerPaint = new Paint(candidatePaint);
+    footerPaint.setTextSize(res.getDimension(R.dimen.floating_candidate_footer_text_size));
+    footerPaint.setColor(res.getColor(R.color.floating_candidate_footer_text));
+
+    separatorPaint = new Paint();
+    separatorPaint.setStrokeWidth(
+        res.getDimension(R.dimen.floating_candidate_separator_width));
+    separatorPaint.setColor(res.getColor(R.color.floating_candidate_footer_separator));
+
+    windowBackgroundPaint = new Paint();
+    windowBackgroundPaint.setColor(res.getColor(R.color.floating_candidate_window_background));
+    windowBackgroundPaint.setShadowLayer(
+        res.getDimension(R.dimen.floating_candidate_window_shadow_radius),
+        0, res.getDimension(R.dimen.floating_candidate_window_shadow_offset_y),
+        res.getColor(R.color.floating_candidate_shadow));
+
+    focuseBackgroundPaint = new Paint();
+    focuseBackgroundPaint.setColor(res.getColor(R.color.floating_candidate_focus_background));
+
+    float candidateVerticalPadding =
+        res.getDimension(R.dimen.floating_candidate_candidate_vertical_padding);
+    FontMetrics candidateMetrics = candidatePaint.getFontMetrics();
+    candidateHeight = (int) Math.ceil(
+        candidateMetrics.descent - candidateMetrics.ascent + candidateVerticalPadding * 2);
+    candidateOffsetY = (int) Math.ceil(-candidateMetrics.ascent + candidateVerticalPadding);
+
+    windowMinimumWidth = res.getDimensionPixelSize(R.dimen.floating_candidate_window_minimum_width);
+    windowHorizontalPadding =
+        res.getDimensionPixelOffset(R.dimen.floating_candidate_window_horizontal_padding);
+    windowRoundRectRadius = res.getDimension(R.dimen.floating_candidate_window_round_rect_radius);
+    candidateDescriptionMinimumPadding =
+        res.getDimensionPixelSize(R.dimen.floating_candidate_candidate_description_minimum_padding);
+    horizontalSeparatorPadding =
+        res.getDimensionPixelSize(R.dimen.floating_candidate_separator_horizontal_padding);
+
+    scrollIndicatorWidth =
+        res.getDimensionPixelSize(R.dimen.floating_candidate_scroll_indicator_width);
+    scrollIndicatorRadius =
+        res.getDimensionPixelSize(R.dimen.floating_candidate_scroll_indicator_radius);
+
+    FontMetrics footerMetrics = footerPaint.getFontMetrics();
+    float footerTextHeight = -footerMetrics.ascent + footerMetrics.descent;
+    footerHeight = Math.round(footerTextHeight * 2f);
+    footerTextCenterToBaseLineOffset = (-footerMetrics.ascent - footerMetrics.descent) / 2f;
+
+    float shortcutCharacterWidth = shortcutPaint.measureText("m");
+    float shortcutCandidatePadding =
+        res.getDimensionPixelSize(R.dimen.floating_candidate_shortcut_candidate_padding);
+    shortcutWidth = Math.round(shortcutCharacterWidth + shortcutCandidatePadding);
+    shortcutCenterX = -shortcutCharacterWidth / 2f - shortcutCandidatePadding;
+
+    updateLayout();
+  }
+
+  /** Handle touch event and invoke some actions. */
+  public void onTouchEvent(MotionEvent event) {
+    if (!candidates.isPresent() || !viewEventListener.isPresent()) {
+      return;
+    }
+    ViewEventListener listener = viewEventListener.get();
+
+    Optional<Integer> optionalCandidateIndex = getTappingCandidate(event);
+
+    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+      tappingCandidateIndex = optionalCandidateIndex;
+      updateLayout();
+      return;
+    }
+    if (event.getActionMasked() != MotionEvent.ACTION_UP) {
+      return;
+    }
+
+    if (!optionalCandidateIndex.isPresent() || !tappingCandidateIndex.isPresent()
+        || !optionalCandidateIndex.equals(tappingCandidateIndex)) {
+      tappingCandidateIndex = Optional.absent();
+      updateLayout();
+      return;
+    }
+    int candidateIndex = optionalCandidateIndex.get();
+    tappingCandidateIndex = Optional.absent();
+
+    listener.onConversionCandidateSelected(
+        candidates.get().getCandidate(candidateIndex).getId(),
+        Optional.<Integer>absent());
+  }
+
+  /** Sets the max width of this window. */
+  public void setMaxWidth(int maxWidth) {
+    if (maxWidth > 0) {
+      this.maxWidth = Optional.of(maxWidth);
+    } else {
+      this.maxWidth = Optional.absent();
+    }
+    updateLayout();
+  }
+
+  /** Sets candidates. */
+  public void setCandidates(Command outCommand) {
+    Preconditions.checkNotNull(outCommand);
+    if (outCommand.getOutput().getCandidates().getCandidateCount() == 0) {
+      candidates = Optional.<Candidates>absent();
+      totalCandidatesCount = 0;
+    } else {
+      candidates = Optional.of(outCommand.getOutput().getCandidates());
+      totalCandidatesCount = outCommand.getOutput().getAllCandidateWords().getCandidatesCount();
+    }
+    updateLayout();
+  }
+
+  /** Sets a view event listener to handle touch events. */
+  public void setViewEventListener(ViewEventListener listener) {
+    viewEventListener = Optional.of(listener);
+  }
+
+  /**
+   * Gets the rectangle of this window.
+   * Defensive-copied value is returned so caller-side can modify it.
+   */
+  public Optional<Rect> getWindowRect() {
+    if (windowRects.isPresent()) {
+      return Optional.of(new Rect(windowRects.get().window));
+    } else {
+      return Optional.absent();
+    }
+  }
+
+  /** Draws this candidate window. */
+  public void draw(Canvas canvas) {
+    Preconditions.checkNotNull(canvas);
+    Preconditions.checkState(candidates.isPresent());
+    Preconditions.checkState(windowRects.isPresent());
+
+    Candidates candidatesData = candidates.get();
+    WindowRects rects = windowRects.get();
+
+    canvas.drawRoundRect(
+        new RectF(rects.window), windowRoundRectRadius, windowRoundRectRadius,
+        windowBackgroundPaint);
+
+    if (rects.focus.isPresent()) {
+      canvas.drawRect(rects.focus.get(), focuseBackgroundPaint);
+    }
+
+    // Candidates, descriptions and shortcuts.
+    int focusedIndex = focusedOrTappedCandidateIndexOnPage.or(-1);
+    for (int i = 0; i < candidatesData.getCandidateCount(); ++i) {
+      Candidate candidate = candidatesData.getCandidate(i);
+      int offsetY = getCandidateRowOffsetY(i) + candidateOffsetY;
+      Paint paint = (i == focusedIndex) ? focusedCandidatePaint : candidatePaint;
+      drawTextWithLimit(canvas, candidate.getValue(), paint, 0, offsetY, maxCandidateWidth);
+      if (candidate.getAnnotation().hasDescription()) {
+        drawTextWithAlignAndLimit(
+            canvas, candidate.getAnnotation().getDescription(), descriptionPaint,
+            rects.window.right - windowHorizontalPadding, offsetY,
+            Align.RIGHT, maxDescriptionWidth);
+      }
+      if (candidate.getAnnotation().hasShortcut()) {
+        drawTextWithAlign(
+            canvas, candidate.getAnnotation().getShortcut(), shortcutPaint,
+            shortcutCenterX, offsetY, Align.CENTER);
+      }
+    }
+
+    // Footer. Don't show if suggestion mode.
+    if (rects.pageIndicator.isPresent()) {
+      Rect indicatorRect = rects.pageIndicator.get();
+      drawHorizontalSeparator(
+          canvas, separatorPaint, rects.window.left, rects.window.right, indicatorRect.top);
+      drawPageIndicator(canvas, footerPaint, indicatorRect);
+    }
+
+    // Scroll indicator
+    if (rects.scrollIndicator.isPresent()) {
+      canvas.drawRoundRect(
+          rects.scrollIndicator.get(), scrollIndicatorRadius, scrollIndicatorRadius,
+          scrollIndicatorPaint);
+    }
+  }
+
+  private void drawPageIndicator(Canvas canvas, Paint paint, Rect rect) {
+    drawTextWithAlign(
+        canvas, String.format(FOOTER_TEXT_FORMAT,
+            candidates.get().getFocusedIndex() + 1, totalCandidatesCount),
+        paint, rect.exactCenterX(), rect.exactCenterY() + footerTextCenterToBaseLineOffset,
+        Align.CENTER);
+  }
+
+  private void drawHorizontalSeparator(Canvas canvas, Paint paint, int startX, int endX, int y) {
+    canvas.drawLine(
+        Math.min(startX, endX) + horizontalSeparatorPadding, y,
+        Math.max(startX, endX) - horizontalSeparatorPadding, y, paint);
+  }
+
+  /**
+   * Draws {@code text} into {@code canvas} with the text align and the limitation of text width.
+   * <p>
+   * If measured width of {@code text} is wider than maxWidth, the {@code text} is drawn with
+   * horizontal compression in order to fit {@code maxWidth}.
+   */
+  private void drawTextWithAlignAndLimit(
+      Canvas canvas, String text, Paint paint, float x, float y, Align align, float maxWidth) {
+    float textWidth = paint.measureText(text);
+
+    int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+    Align originalAlign = paint.getTextAlign();
+    try {
+      canvas.translate(x, y);
+      if (textWidth > maxWidth) {
+        // Use Canvas#scale() instead of Paint#setTextScaleX() for accurate scaling.
+        canvas.scale(maxWidth / textWidth, 1.0f);
+      }
+      paint.setTextAlign(align);
+      canvas.drawText(text, 0, 0, paint);
+    } finally {
+      canvas.restoreToCount(saveCount);
+      paint.setTextAlign(originalAlign);
+    }
+  }
+
+  /** See {@link #drawTextWithAlignAndLimit}. */
+  private void drawTextWithAlign(
+      Canvas canvas, String text, Paint paint, float x, float y, Align align) {
+    drawTextWithAlignAndLimit(canvas, text, paint, x, y, align, Float.MAX_VALUE);
+  }
+
+  /** See {@link #drawTextWithAlignAndLimit}. */
+  private void drawTextWithLimit(
+      Canvas canvas, String text, Paint paint, float x, float y, float maxWidth) {
+    drawTextWithAlignAndLimit(canvas, text, paint, x, y, paint.getTextAlign(), maxWidth);
+  }
+
+  private Optional<Integer> getTappingCandidate(MotionEvent event) {
+    if (!windowRects.isPresent()) {
+      return Optional.absent();
+    }
+
+    WindowRects rects = windowRects.get();
+    int x = Math.round(event.getX());
+    int y = Math.round(event.getY());
+
+    if (!rects.window.contains(x, y)) {
+      return Optional.absent();
+    }
+
+    int candidateIndex = y / candidateHeight;
+    if (candidateIndex < candidates.get().getCandidateCount()) {
+      return Optional.of(candidateIndex);
+    } else {
+      return Optional.absent();
+    }
+  }
+
+  private void updateLayout() {
+    if (!candidates.isPresent() || !maxWidth.isPresent()) {
+      windowRects = Optional.absent();
+      return;
+    }
+
+    Candidates candidatesData = candidates.get();
+    int candidateNumberOnPage = candidatesData.getCandidateCount();
+    boolean hasShortcut = candidatesData.getCandidateCount() > 0
+        && !candidatesData.getCandidate(0).getAnnotation().getShortcut().isEmpty();
+    int leftEdgePosition = hasShortcut
+        ? -windowHorizontalPadding - shortcutWidth : -windowHorizontalPadding;
+
+    // Candidates and descriptions
+    maxCandidateWidth = 0;
+    maxDescriptionWidth = 0;
+    for (int i = 0; i < candidateNumberOnPage; ++i) {
+      Candidate candidate = candidatesData.getCandidate(i);
+      maxCandidateWidth = Math.max(
+          maxCandidateWidth, Math.round(candidatePaint.measureText(candidate.getValue())));
+      maxDescriptionWidth = Math.max(
+          maxDescriptionWidth,
+          Math.round(descriptionPaint.measureText(candidate.getAnnotation().getDescription())));
+    }
+    int fixedWidth =
+        -leftEdgePosition + candidateDescriptionMinimumPadding + windowHorizontalPadding;
+    int flexibleWidth = maxCandidateWidth + maxDescriptionWidth;
+    if (fixedWidth + flexibleWidth > maxWidth.get()) {
+      int availableWidth = maxWidth.get() - fixedWidth;
+      float shrinkRate = MozcUtil.clamp((float) availableWidth / flexibleWidth, 0f, 1f);
+      maxDescriptionWidth = Math.round(maxDescriptionWidth * shrinkRate);
+      maxCandidateWidth = availableWidth - maxDescriptionWidth;
+    }
+    int rightEdgePosition = Math.max(
+        Math.min(windowMinimumWidth, maxWidth.get()) + leftEdgePosition,
+        maxCandidateWidth + candidateDescriptionMinimumPadding + maxDescriptionWidth
+            + windowHorizontalPadding);
+
+    // Footer
+    int horizontalSeparatorY = candidateHeight * candidateNumberOnPage;
+    int bottomEdgePosition;
+    Optional<Rect> pageIndicatorRect;
+    if (candidatesData.getCategory() != Category.SUGGESTION) {
+      bottomEdgePosition = horizontalSeparatorY + footerHeight;
+      pageIndicatorRect = Optional.of(
+          new Rect(leftEdgePosition, horizontalSeparatorY, rightEdgePosition, bottomEdgePosition));
+    } else {
+      bottomEdgePosition = horizontalSeparatorY;
+      pageIndicatorRect = Optional.absent();
+    }
+
+    // Focus
+    Optional<Rect> focusRect = Optional.absent();
+    focusedOrTappedCandidateIndexOnPage = getTappedOrFocusedIndexOnPage();
+    if (focusedOrTappedCandidateIndexOnPage.isPresent()) {
+      int offsetY = candidateHeight * focusedOrTappedCandidateIndexOnPage.get();
+      focusRect = Optional.of(new Rect(
+          leftEdgePosition, offsetY, rightEdgePosition, offsetY + candidateHeight));
+    } else {
+      focusRect = Optional.absent();
+    }
+
+    // Scroll indicator
+    Optional<RectF> scrollIndicatorRect;
+    if (totalCandidatesCount > candidatesData.getPageSize()) {
+      int currentPageIndex = getCurrentPageNumber() - 1;
+      float scrollIndicatorHeight =
+          (float) bottomEdgePosition * candidatesData.getPageSize() / totalCandidatesCount;
+      float scrollIndicatorOffset = scrollIndicatorHeight * currentPageIndex;
+      scrollIndicatorRect = Optional.of(new RectF(
+          rightEdgePosition - scrollIndicatorWidth, scrollIndicatorOffset, rightEdgePosition,
+          Math.min(bottomEdgePosition, scrollIndicatorOffset + scrollIndicatorHeight)));
+    } else {
+      scrollIndicatorRect = Optional.absent();
+    }
+
+    // Window
+    Rect windowRect = new Rect(leftEdgePosition, 0, rightEdgePosition, bottomEdgePosition);
+
+    windowRects = Optional.of(
+        new WindowRects(windowRect, focusRect, pageIndicatorRect, scrollIndicatorRect));
+  }
+
+  private Optional<Integer> getTappedOrFocusedIndexOnPage() {
+    if (tappingCandidateIndex.isPresent()) {
+      return tappingCandidateIndex;
+    } else if (candidates.isPresent() && candidates.get().hasFocusedIndex()) {
+      return Optional.of(candidates.get().getFocusedIndex() % candidates.get().getPageSize());
+    }
+    return Optional.absent();
+  }
+
+  private int getCandidateRowOffsetY(int index) {
+    return index * candidateHeight;
+  }
+
+  private int getCurrentPageNumber() {
+    return (int) Math.ceil(
+        (float) (candidates.get().getFocusedIndex() + 1) / candidates.get().getPageSize());
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java
new file mode 100644
index 0000000..70037e5
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java
@@ -0,0 +1,247 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.ScaleAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
+
+/**
+ * Draws mode indicator for floating candidate window.
+ */
+@TargetApi(21)
+public class FloatingModeIndicator {
+
+  /** The message to hide the mode indicator. */
+  @VisibleForTesting static final int HIDE_MODE_INDICATOR = 0;
+
+  private class OutAnimationListener implements AnimationListener {
+    @Override
+    public void onAnimationEnd(Animation animation) {
+      if (!isVisible) {
+        popup.getContentView().setVisibility(View.GONE);
+      }
+    }
+
+    @Override
+    public void onAnimationRepeat(Animation animation) {
+    }
+
+    @Override
+    public void onAnimationStart(Animation animation) {
+    }
+  }
+
+  private class ModeIndicatorMessageCallback implements Handler.Callback {
+    @Override
+    public boolean handleMessage(Message msg) {
+      if (msg.what == HIDE_MODE_INDICATOR) {
+        hide();
+      }
+      return true;
+    }
+  }
+
+  @VisibleForTesting final Handler handler;
+  @VisibleForTesting final PopUpLayouter<MozcImageView> popup;
+  private final View parentView;
+  private final Drawable kanaIndicatorDrawable;
+  private final Drawable abcIndicatorDrawable;
+
+  private final int indicatorSize;
+  private final int verticalMargin;
+  private final Rect drawRect;
+  private final Animation inAnimation;
+  private final Animation outAnimation;
+  private final int displayTime;
+
+  private CursorAnchorInfo cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+  /** True if the mode indicator is shown and is not hiding. */
+  private boolean isVisible = false;
+  private boolean hasComposition = false;
+
+  public FloatingModeIndicator(View parent) {
+    parentView = Preconditions.checkNotNull(parent);
+    handler = new Handler(Looper.getMainLooper(), new ModeIndicatorMessageCallback());
+
+    Context context = parent.getContext();
+    Resources resources = context.getResources();
+    Skin skin = Skin.getFallbackInstance();
+    kanaIndicatorDrawable =
+        skin.getDrawable(resources, R.raw.floating_mode_indicator__kana_normal);
+    abcIndicatorDrawable =
+        skin.getDrawable(resources, R.raw.floating_mode_indicator__alphabet_normal);
+    indicatorSize =
+        resources.getDimensionPixelSize(R.dimen.floating_mode_indicator_size);
+    verticalMargin =
+        resources.getDimensionPixelSize(R.dimen.floating_mode_indicator_vertical_margin);
+    displayTime = resources.getInteger(R.integer.floating_mode_indicator_display_time);
+
+    MozcImageView contentView = new MozcImageView(context);
+    contentView.setVisibility(View.GONE);
+    contentView.setImageDrawable(kanaIndicatorDrawable);
+    popup = new PopUpLayouter<MozcImageView>(parentView, contentView);
+
+    inAnimation =  createInAnimation(resources, indicatorSize / 2f, verticalMargin);
+    outAnimation = createOutAnimation(resources, indicatorSize / 2f, verticalMargin);
+    drawRect = new Rect(0, 0, indicatorSize, indicatorSize);
+  }
+
+  public void setCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+    this.cursorAnchorInfo = Preconditions.checkNotNull(cursorAnchorInfo);
+  }
+
+  private void updateDrawRect() {
+    float[] cursorPosition = new float[] {
+        cursorAnchorInfo.getInsertionMarkerHorizontal(),
+        cursorAnchorInfo.getInsertionMarkerBottom()
+    };
+    cursorAnchorInfo.getMatrix().mapPoints(cursorPosition);
+    int location[] = new int[2];
+    parentView.getLocationOnScreen(location);
+    int left = Math.round(cursorPosition[0] - indicatorSize / 2) - location[0];
+    int top = Math.round(cursorPosition[1] + verticalMargin) - location[1];
+    // TODO(hsumita): Put the indicator over the cursor if there is no enough space below.
+    // Note: We always have enough space below thanks to the narrow frame at this time.
+    drawRect.offsetTo(left, top);
+    popup.setBounds(drawRect);
+  }
+
+  /**
+   * Updates the state of the mode indicator according to the {@code command}.
+   * <p>
+   * This method hides the indicator if there is a composition text.
+   */
+  public void setCommand(Command command) {
+    Preconditions.checkNotNull(command);
+    Input input = command.getInput();
+    if (input.getType() == Input.CommandType.SEND_COMMAND
+        && input.getCommand().getType() == SessionCommand.CommandType.SWITCH_INPUT_MODE) {
+      // Simply ignores SWITCH_INPUT_MODE since the command doesn't have a composition text.
+      return;
+    }
+
+    hasComposition = command.getOutput().getPreedit().getSegmentCount() > 0;
+    if (hasComposition) {
+      hide();
+    }
+  }
+
+  /** Shows the mode indicator according to the current composition mode. */
+  public void setCompositionMode(CompositionMode mode) {
+    Preconditions.checkNotNull(mode);
+    MozcImageView contentView = popup.getContentView();
+    contentView.setImageDrawable(mode == CompositionMode.HIRAGANA
+        ? kanaIndicatorDrawable : abcIndicatorDrawable);
+    if (!hasComposition) {
+      show();
+    }
+  }
+
+  /**
+   * Shows the mode indicator with animation.
+   * <p>
+   * This method issues hide command with delay.
+   */
+  private void show() {
+    resetAnimation();
+    updateDrawRect();
+    if (!isVisible) {
+      isVisible = true;
+      View contentView = popup.getContentView();
+      contentView.setVisibility(View.VISIBLE);
+      contentView.startAnimation(inAnimation);
+    }
+    handler.sendMessageDelayed(handler.obtainMessage(HIDE_MODE_INDICATOR), displayTime);
+  }
+
+  /** Hides the mode indicator with animation. */
+  public void hide() {
+    if (!isVisible) {
+      return;
+    }
+    isVisible = false;
+    resetAnimation();
+    popup.getContentView().startAnimation(outAnimation);
+  }
+
+  private Animation createInAnimation(Resources resources, float pivotX, float pivotY) {
+    AnimationSet animationSet = new AnimationSet(true);
+    animationSet.setDuration(resources.getInteger(R.integer.floating_mode_indicator_in_duration));
+    animationSet.setInterpolator(new DecelerateInterpolator());
+    animationSet.addAnimation(new ScaleAnimation(0f, 1f, 0f, 1f, pivotX, pivotY));
+    animationSet.addAnimation(new AlphaAnimation(0f, 1f));
+    return animationSet;
+  }
+
+  private Animation createOutAnimation(Resources resources, float pivotX, float pivotY) {
+    AnimationSet animationSet = new AnimationSet(true);
+    animationSet.setDuration(resources.getInteger(R.integer.floating_mode_indicator_out_duration));
+    animationSet.setInterpolator(new DecelerateInterpolator());
+    animationSet.setAnimationListener(new OutAnimationListener());
+    animationSet.addAnimation(new ScaleAnimation(1f, 0f, 1f, 0f, pivotX, pivotY));
+    animationSet.addAnimation(new AlphaAnimation(1f, 0f));
+    return animationSet;
+  }
+
+  /** Resets all ongoing and scheduled animations. */
+  private void resetAnimation() {
+    popup.getContentView().clearAnimation();
+    handler.removeMessages(HIDE_MODE_INDICATOR);
+    Preconditions.checkState(!handler.hasMessages(HIDE_MODE_INDICATOR));
+  }
+
+  @VisibleForTesting boolean isVisible() {
+    return isVisible;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java b/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java
new file mode 100644
index 0000000..337892f
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java
@@ -0,0 +1,123 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ToggleButton;
+
+/**
+ * View class for the button to expand/fold conversion candidate view.
+ *
+ */
+public class InputFrameFoldButtonView extends ToggleButton {
+
+  private static final int[] STATE_EMPTY = {};
+  private static final int[] STATE_CHECKED = { android.R.attr.state_checked };
+
+  private Drawable arrowDrawable = DummyDrawable.getInstance();
+  private Drawable backgroundDefaultDrawable = DummyDrawable.getInstance();
+  private Drawable backgroundScrolledDrawable = DummyDrawable.getInstance();
+  private boolean showBackgroundForScrolled = false;
+
+  public InputFrameFoldButtonView(Context context) {
+    super(context);
+  }
+
+  public InputFrameFoldButtonView(Context context, AttributeSet attributeSet) {
+    super(context, attributeSet);
+  }
+
+  public InputFrameFoldButtonView(Context context, AttributeSet attributeSet, int defStyle) {
+    super(context, attributeSet, defStyle);
+  }
+
+  @Override
+  protected void onFinishInflate() {
+    super.onFinishInflate();
+    setBackgroundColor(Color.TRANSPARENT);
+  }
+
+  @Override
+  protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+    super.onSizeChanged(width, height, oldWidth, oldHeight);
+    backgroundDefaultDrawable.setBounds(0, 0, width, height);
+    backgroundScrolledDrawable.setBounds(0, 0, width, height);
+    arrowDrawable.setBounds(0, 0, width, height);
+  }
+
+  @Override
+  protected void drawableStateChanged() {
+    super.drawableStateChanged();
+    arrowDrawable.setState(isChecked() ? STATE_CHECKED : STATE_EMPTY);
+    invalidate();
+  }
+
+  @Override
+  protected void onDraw(Canvas canvas) {
+    Drawable background =
+        showBackgroundForScrolled ? backgroundScrolledDrawable : backgroundDefaultDrawable;
+    background.draw(canvas);
+    arrowDrawable.draw(canvas);
+  }
+
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    Resources resources = getResources();
+    arrowDrawable = skin.getDrawable(resources, R.raw.keyboard__fold__tab)
+        .getConstantState().newDrawable();
+    arrowDrawable.setBounds(0, 0, getWidth(), getHeight());
+    backgroundDefaultDrawable =
+        skin.getDrawable(resources, R.raw.keyboard_fold_tab_background_default)
+            .getConstantState().newDrawable();
+    backgroundDefaultDrawable.setBounds(0, 0, getWidth(), getHeight());
+    backgroundScrolledDrawable =
+        skin.getDrawable(resources, R.raw.keyboard_fold_tab_background_scrolled)
+            .getConstantState().newDrawable();
+    backgroundScrolledDrawable.setBounds(0, 0, getWidth(), getHeight());
+    invalidate();
+  }
+
+  public void showBackgroundForScrolled(boolean showBackgroundForScrolled) {
+    if (this.showBackgroundForScrolled != showBackgroundForScrolled) {
+      this.showBackgroundForScrolled = showBackgroundForScrolled;
+      invalidate();
+    }
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java b/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
index 43f5f46..7e5d385 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
@@ -76,9 +76,6 @@
     /** Invoked when "Launch Preference Activity" item is selected. */
     public void onLaunchPreferenceActivitySelected(Context context);
 
-    /** Invoked when "Voice input" item is selected. */
-    public void onLaunchVoiceInputActivitySelected(Context context);
-
     /** Invoked when "Launch Mushroom" item is selected. */
     public void onShowMushroomSelectionDialogSelected(Context context);
   }
@@ -130,9 +127,6 @@
         case R.string.menu_item_preferences:
           listener.get().onLaunchPreferenceActivitySelected(context);
           break;
-        case R.string.menu_item_voice_input:
-          listener.get().onLaunchVoiceInputActivitySelected(context);
-          break;
         case R.string.menu_item_mushroom:
           listener.get().onShowMushroomSelectionDialogSelected(context);
           break;
@@ -145,8 +139,7 @@
   private final Optional<AlertDialog> dialog;
   private final MenuDialogListenerHandler listenerHandler;
 
-  public MenuDialog(
-      Context context, Optional<MenuDialogListener> listener, boolean isVoiceInputEnabled) {
+  public MenuDialog(Context context, Optional<MenuDialogListener> listener) {
     Preconditions.checkNotNull(context);
     Preconditions.checkNotNull(listener);
 
@@ -154,7 +147,7 @@
     String appName = resources.getString(R.string.app_name);
 
     // R.string.menu_item_* resources needs to be formatted.
-    List<Integer> menuItemIds = getEnabledMenuIds(context, isVoiceInputEnabled);
+    List<Integer> menuItemIds = getEnabledMenuIds(context);
     int menuNum = menuItemIds.size();
     String[] menuTextList = new String[menuNum];
     int[] indexToIdTable = new int[menuNum];
@@ -202,7 +195,7 @@
   }
 
   @VisibleForTesting
-  static List<Integer> getEnabledMenuIds(Context context, boolean isVoiceInputEnabled) {
+  static List<Integer> getEnabledMenuIds(Context context) {
     // "Mushroom" item is enabled only when Mushroom-aware applications are available.
     PackageManager packageManager = Preconditions.checkNotNull(context).getPackageManager();
     boolean isMushroomEnabled = !MushroomUtil.getMushroomApplicationList(packageManager).isEmpty();
@@ -210,9 +203,6 @@
     List<Integer> menuItemIds = Lists.newArrayListWithCapacity(4);
     menuItemIds.add(R.string.menu_item_input_method);
     menuItemIds.add(R.string.menu_item_preferences);
-    if (isVoiceInputEnabled) {
-      menuItemIds.add(R.string.menu_item_voice_input);
-    }
     if (isMushroomEnabled) {
       menuItemIds.add(R.string.menu_item_mushroom);
     }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java b/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java
new file mode 100644
index 0000000..8a6d6d4
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java
@@ -0,0 +1,120 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import com.google.common.base.Preconditions;
+
+import android.graphics.Rect;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.FrameLayout;
+
+/**
+ * A pop-up view layouter.
+ * <p>
+ * This class registers given popup View as a direct child of root View.
+ * This makes the popup be able to appear to anywhere in the screen.
+ * To control the position a Bounds should be specified. It will be converted into a LayoutParams
+ * internally.
+ */
+public class PopUpLayouter<T extends View> {
+
+  private final View parent;
+  private final T contentView;
+
+  private boolean isRegistered = false;
+
+  public PopUpLayouter(View parent, T popUpView) {
+    this.parent = Preconditions.checkNotNull(parent);
+    this.contentView = Preconditions.checkNotNull(popUpView);
+  }
+
+  private void registerToViewHierarchyIfNecessary() {
+    if (isRegistered) {
+      return;
+    }
+
+    View rootView = parent.getRootView();
+    if (rootView != null) {
+      FrameLayout screenContent =
+          FrameLayout.class.cast(rootView.findViewById(android.R.id.content));
+      if (screenContent != null) {
+        screenContent.addView(
+            contentView, new FrameLayout.LayoutParams(0, 0, Gravity.LEFT | Gravity.TOP));
+        isRegistered = true;
+      }
+    }
+  }
+
+  public T getContentView() {
+    return contentView;
+  }
+
+  public void setBounds(Rect rect) {
+    Preconditions.checkNotNull(rect);
+    setBounds(rect.left, rect.top, rect.right, rect.bottom);
+  }
+
+  public void setBounds(int left, int top, int right, int bottom) {
+    registerToViewHierarchyIfNecessary();
+
+    int width = right - left;
+    int height = bottom - top;
+
+    ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
+    if (layoutParams != null) {
+      layoutParams.width = width;
+      layoutParams.height = height;
+      if (MarginLayoutParams.class.isInstance(layoutParams)) {
+        int x = left;
+        int y = top;
+
+        int[] location = new int[2];
+        parent.getLocationInWindow(location);
+        x += location[0];
+        y += location[1];
+
+        MarginLayoutParams marginLayoutParams = MarginLayoutParams.class.cast(layoutParams);
+        // Clip XY.
+        View rootView = View.class.cast(contentView.getParent());
+        if (rootView != null) {
+          x = MozcUtil.clamp(x, 0, rootView.getWidth() - width);
+          y = MozcUtil.clamp(y, 0, rootView.getHeight() - height);
+        }
+
+        marginLayoutParams.setMargins(x, y, 0, 0);
+      }
+      contentView.setLayoutParams(layoutParams);
+    }
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java b/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
index 5aff03c..a5635a3 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
@@ -31,7 +31,7 @@
 
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.view.RectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -51,8 +51,8 @@
 
   private final int scrollBarMinimumHeight = getScrollBarMinimumHeight(getResources());
   private Optional<SnapScroller> snapScroller = Optional.absent();
-  private SkinType skinType = SkinType.BLUE_LIGHTGRAY;
-  @VisibleForTesting Drawable scrollBarDrawable = createScrollBarDrawable(skinType);
+  private Skin skin = Skin.getFallbackInstance();
+  @VisibleForTesting Drawable scrollBarDrawable = createScrollBarDrawable(skin);
 
   public ScrollGuideView(Context context) {
     super(context);
@@ -66,13 +66,12 @@
     super(context, attributeSet, defStyle);
   }
 
-  private static Drawable createScrollBarDrawable(SkinType skinType) {
+  private static Drawable createScrollBarDrawable(Skin skin) {
     // TODO(hidehiko): Probably we should rename the RectKeyDrawable,
     //   because this usage is not the key but actually we can reuse the code as is.
-    Preconditions.checkNotNull(skinType);
     return new RectKeyDrawable(1, 0, 1, 1,
-                               skinType.candidateScrollBarTopColor,
-                               skinType.candidateScrollBarBottomColor,
+                               skin.candidateScrollBarTopColor,
+                               skin.candidateScrollBarBottomColor,
                                0, 0, 0, 0);
   }
 
@@ -82,12 +81,15 @@
   }
 
   /** Sets the skin type, and regenerates an indicator drawable if necessary. */
-  public void setSkinType(SkinType skinType) {
-    if (this.skinType == Preconditions.checkNotNull(skinType)) {
+  @SuppressWarnings("deprecation")
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    if (this.skin.equals(skin)) {
       return;
     }
-    this.skinType = skinType;
-    scrollBarDrawable = createScrollBarDrawable(skinType);
+    this.skin = skin;
+    scrollBarDrawable = createScrollBarDrawable(skin);
+    setBackgroundDrawable(skin.scrollBarBackgroundDrawable.getConstantState().newDrawable());
     invalidate();
   }
 
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java b/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
index da02260..2267595 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
@@ -29,22 +29,16 @@
 
 package org.mozc.android.inputmethod.japanese.ui;
 
-import org.mozc.android.inputmethod.japanese.resources.R;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.view.ViewStub.OnInflateListener;
-import android.view.animation.Animation;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
@@ -64,35 +58,22 @@
   private int inputFrameHeight = 0;
   private Optional<OnClickListener> buttonOnClickListener = Optional.absent();
 
-  private Optional<View> dropshadowShort = Optional.absent();
-  private Optional<View> dropshadowLong = Optional.absent();
-  private int dropShadowShortVisibility = View.GONE;
-  private int dropShadowShortLayoutHeight = 0;
-  private int dropShadowLongLayoutHeight = 0;
+  private int adjustButtonResourceId;
+  private Skin skin = Skin.getFallbackInstance();
 
-  private static void setLayoutHeight(View view, int height) {
-    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
-    layoutParams.height = height;
-    view.setLayoutParams(layoutParams);
+  private Resources resources;
+
+  private void updateAdjustButtonImage() {
+    Preconditions.checkState(adjustButton.isPresent());
+    adjustButton.get().setImageDrawable(skin.getDrawable(resources, adjustButtonResourceId));
   }
 
-  private static Drawable createDropShadowGradientDrawable(
-      int startColor, int endColor, float radius, float centerX, float centerY) {
-    GradientDrawable gradientDrawable =
-        new GradientDrawable(Orientation.TL_BR, new int[]{startColor, endColor});
-    gradientDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);
-    gradientDrawable.setGradientRadius(radius);
-    gradientDrawable.setGradientCenter(centerX, centerY);
-    return gradientDrawable;
-  }
-
-  public void initialize(View view, int stubId, final int dropShadowShortTopId,
-                         final int dropShadowLongTopId, final int adjustButtonId,
-                         final int adjustButtonResouceId, final float dropShadowGradientCenterX,
-                         final int dropshadowShortId,
-                         final int dropshadowLongId) {
+  public void initialize(View view, int stubId, final int adjustButtonId,
+                         int adjustButtonResourceId) {
+    this.resources = Preconditions.checkNotNull(view).getResources();
     ViewStub viewStub = ViewStub.class.cast(view.findViewById(stubId));
     currentView = Optional.<View>of(viewStub);
+    this.adjustButtonResourceId = adjustButtonResourceId;
 
     viewStub.setOnInflateListener(new OnInflateListener() {
 
@@ -103,32 +84,22 @@
 
         currentView = Optional.of(view);
         currentView.get().setVisibility(View.VISIBLE);
-        dropshadowShort = Optional.of(view.findViewById(dropshadowShortId));
-        dropshadowLong = Optional.of(view.findViewById(dropshadowLongId));
         adjustButton = Optional.of(ImageView.class.cast(view.findViewById(adjustButtonId)));
         adjustButton.get().setOnClickListener(buttonOnClickListener.orNull());
-        Resources resources = view.getResources();
-        MozcDrawableFactory drawableFactory = new MozcDrawableFactory(resources);
-        adjustButton.get().setImageDrawable(
-            drawableFactory.getDrawable(adjustButtonResouceId).orNull());
-
-        // Create dropshadow corner drawable.
-        // Because resource xml cannot set gradientRadius in dip style, code it.
-        int startColor = resources.getColor(R.color.dropshadow_start);
-        int endColor = resources.getColor(R.color.dropshadow_end);
-        float radius = resources.getDimensionPixelSize(R.dimen.translucent_border_height);
-        Drawable gradientTop = createDropShadowGradientDrawable(startColor, endColor, radius,
-                                                                dropShadowGradientCenterX, 1.0f);
-        view.findViewById(dropShadowShortTopId).setBackgroundDrawable(gradientTop);
-        view.findViewById(dropShadowLongTopId).setBackgroundDrawable(gradientTop);
-
+        adjustButton.get().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        updateAdjustButtonImage();
         resetAdjustButtonBottomMarginInternal(inputFrameHeight);
-        flipDropShadowVisibilityInternal(dropShadowShortVisibility);
-        setDropShadowHeightInternal(dropShadowShortLayoutHeight, dropShadowLongLayoutHeight);
       }
     });
   }
 
+  public void setSkin(Skin skin) {
+    this.skin = Preconditions.checkNotNull(skin);
+    if (adjustButton.isPresent()) {
+      updateAdjustButtonImage();
+    }
+  }
+
   public void setButtonOnClickListener(OnClickListener onClickListener) {
     buttonOnClickListener = Optional.of(Preconditions.checkNotNull(onClickListener));
   }
@@ -141,7 +112,7 @@
 
   private void resetAdjustButtonBottomMarginInternal(int inputFrameHeight) {
     if (adjustButton.isPresent()) {
-      ImageView imageView = ImageView.class.cast(adjustButton.get());
+      ImageView imageView = adjustButton.get();
       FrameLayout.LayoutParams layoutParams = FrameLayout.LayoutParams.class.cast(
           imageView.getLayoutParams());
       layoutParams.bottomMargin = (inputFrameHeight - layoutParams.height) / 2;
@@ -155,43 +126,4 @@
     }
     this.inputFrameHeight = inputFrameHeight;
   }
-
-  private void flipDropShadowVisibilityInternal(int shortVisibility) {
-    if (dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
-      dropshadowShort.get().setVisibility(shortVisibility);
-      dropshadowLong.get().setVisibility(
-          shortVisibility == View.VISIBLE ? View.INVISIBLE : View.VISIBLE);
-    }
-  }
-
-  public void flipDropShadowVisibility(int shortVisibility) {
-    if (inflated) {
-      flipDropShadowVisibilityInternal(shortVisibility);
-      return;
-    }
-    dropShadowShortVisibility = shortVisibility;
-  }
-
-  private void setDropShadowHeightInternal(int shortHeight, int longHeight) {
-    if (dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
-      setLayoutHeight(dropshadowShort.get(), shortHeight);
-      setLayoutHeight(dropshadowLong.get(), longHeight);
-    }
-  }
-
-  public void setDropShadowHeight(int shortHeight, int longHeight) {
-    if (inflated) {
-      setDropShadowHeightInternal(shortHeight, longHeight);
-      return;
-    }
-    dropShadowShortLayoutHeight = shortHeight;
-    dropShadowLongLayoutHeight = longHeight;
-  }
-
-  public void startDropShadowAnimation(Animation shortAnimation, Animation longAnimation) {
-    if (inflated && dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
-      dropshadowShort.get().startAnimation(Preconditions.checkNotNull(shortAnimation));
-      dropshadowLong.get().startAnimation(Preconditions.checkNotNull(longAnimation));
-    }
-  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java b/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
index 0d7c33e..aab8e22 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
@@ -31,16 +31,14 @@
 
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import org.mozc.android.inputmethod.japanese.util.CandidateDescriptionUtil;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
 import android.graphics.Paint;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.StringTokenizer;
 
 /**
  * Factory to create Span instances based on given CandidateWord instances.
@@ -65,7 +63,7 @@
   }
 
   public void setDescriptionDelimiter(String descriptionDelimiter) {
-    this.descriptionDelimiter = Optional.of(Preconditions.checkNotNull(descriptionDelimiter));
+    this.descriptionDelimiter = Optional.of(descriptionDelimiter);
   }
 
   public Span newInstance(CandidateWord candidateWord) {
@@ -73,8 +71,8 @@
 
     float valueWidth = valuePaint.measureText(candidateWord.getValue());
     String description = candidateWord.getAnnotation().getDescription();
-    List<String> splitDescriptionList = splitDescription(Strings.nullToEmpty(description),
-                                                         descriptionDelimiter);
+    List<String> splitDescriptionList = CandidateDescriptionUtil.extractDescriptions(
+        Strings.nullToEmpty(description), descriptionDelimiter);
     float descriptionWidth = 0;
     for (String line : splitDescriptionList) {
       float width = descriptionPaint.measureText(line);
@@ -85,39 +83,4 @@
     return new Span(Optional.of(candidateWord), valueWidth, descriptionWidth,
                     splitDescriptionList);
   }
-
-  private static List<String> splitDescription(
-      String description, Optional<String> descriptionDelimiter) {
-    if (description.length() == 0) {
-      // No description is available.
-      return Collections.emptyList();
-    }
-
-    if (!descriptionDelimiter.isPresent()) {
-      // If the delimiter is not set, return the description as is.
-      return Collections.singletonList(description);
-    }
-
-    // Split the description by delimiter.
-    StringTokenizer tokenizer = new StringTokenizer(description, descriptionDelimiter.get());
-    List<String> result = new ArrayList<String>();
-    while (tokenizer.hasMoreTokens()) {
-      String token = tokenizer.nextToken();
-      if (isEligibleDescriptionFragment(token)) {
-        result.add(token);
-      }
-    }
-
-    return result;
-  }
-
-  private static boolean isEligibleDescriptionFragment(String descriptionFragment) {
-    // We'd like to always remove "ひらがな"  because the description fragment frequently
-    // and largely increases the width of a candidate span.
-    // Increased width reduces the number of the candidates which are shown in a screen.
-    // This behavior is especially harmful for zero-query suggestion
-    // because zero-query suggestion mainly shows Hiragana candidates.
-    // TODO(matsuzakit): Such filtering/oprimization should be done in the server side.
-    return !"ひらがな".equals(descriptionFragment);
-  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java
deleted file mode 100644
index f889f89..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.userdictionary;
-
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.app.Activity;
-import android.content.res.Configuration;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.DisplayMetrics;
-import android.view.Menu;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.Window;
-
-/**
- * Utility to support Action Bar like UI for all the devices.
- *
- * Android 3.0 (or later) supports a new UI named "Action Bar", and it is recommended to be used.
- * However, Google Japanese Input supports also Android 2.3 or earlier.
- * To provide quite similar user experiences for all the platforms, we implement "mimic" of
- * Action Bar for such earlier devices.
- * On the other hand, on later devices, we use Action Bar itself (supported by Android OS).
- *
- * This class provides utilities to fill the gaps between earlier and later devices.
- *
- */
-class UserDictionaryActionBarHelperFactory {
-
-  /**
-   * Hook-methods of Activity to support ActionBar like UI for earlier devices.
-   */
-  interface ActionBarHelper {
-    void onCreate(Bundle savedInstance);
-    public void onPostCreate(
-        Bundle savedInstance,
-        OnClickListener addEntryClickListener,
-        OnClickListener deleteEntryClickListener,
-        OnClickListener undoClickListener);
-    void onConfigurationChanged(Configuration configuration);
-    void onCreateOptionsMenu(Menu menu);
-  }
-
-  /**
-   * Implementation of ActionBar like ui for earlier devices.
-   */
-  private static class MozcActionBarHelper implements ActionBarHelper {
-    private final Activity activity;
-
-    MozcActionBarHelper(Activity activity) {
-      this.activity = activity;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstance) {
-      // We'll use "custom title" for the ActionBar like UI.
-      activity.getWindow().requestFeature(Window.FEATURE_CUSTOM_TITLE);
-    }
-
-    @Override
-    public void onPostCreate(Bundle savedInstance,
-                             OnClickListener addEntryClickListener,
-                             OnClickListener deleteEntryClickListener,
-                             OnClickListener undoClickListener) {
-      activity.getWindow().setFeatureInt(
-          Window.FEATURE_CUSTOM_TITLE,
-          R.layout.user_dictionary_tool_action_bar_view);
-
-      activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
-          .setOnClickListener(addEntryClickListener);
-      activity.findViewById(R.id.user_dictionary_tool_split_action_bar_add_entry)
-          .setOnClickListener(addEntryClickListener);
-      activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
-          .setOnClickListener(deleteEntryClickListener);
-      activity.findViewById(R.id.user_dictionary_tool_split_action_bar_delete_entry)
-          .setOnClickListener(deleteEntryClickListener);
-
-      // Need to select either icons (on top action bar, or bottom split action bar)
-      // should be shown.
-      updateActionBar();
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration configuration) {
-      updateActionBar();
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu) {
-      // These items should be put on the self implemented action bar.
-      menu.findItem(R.id.user_dictionary_tool_menu_add_entry).setVisible(false);
-      menu.findItem(R.id.user_dictionary_tool_menu_delete_entry).setVisible(false);
-    }
-
-    private void updateActionBar() {
-      DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
-      if (metrics.widthPixels < 480 * metrics.scaledDensity) {
-        // Show split action bar. Instead, hide icons on the main action bar.
-        activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
-            .setVisibility(View.GONE);
-        activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
-            .setVisibility(View.GONE);
-        activity.findViewById(R.id.user_dictionary_tool_split_action_bar)
-            .setVisibility(View.VISIBLE);
-      } else {
-        // Hide split action bar. Instead, show icons on the main action bar.
-        activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
-            .setVisibility(View.VISIBLE);
-        activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
-            .setVisibility(View.VISIBLE);
-        activity.findViewById(R.id.user_dictionary_tool_split_action_bar)
-            .setVisibility(View.GONE);
-      }
-    }
-  }
-
-  /**
-   * Implement to use system Action Bar (which is supported Android 3.0 or later).
-   */
-  private static class SystemActionBarHelper implements ActionBarHelper {
-    private final Activity activity;
-
-    SystemActionBarHelper(Activity activity) {
-      this.activity = activity;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstance) {
-      activity.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
-    }
-
-    @Override
-    public void onPostCreate(Bundle savedInstance,
-                             OnClickListener addEntryClickListener,
-                             OnClickListener deleteEntryClickListener,
-                             OnClickListener undoClickListener) {
-      // Disable self implemented action bars.
-      activity.findViewById(R.id.user_dictionary_tool_split_action_bar).setVisibility(View.GONE);
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration configuration) {
-      // Do nothing.
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu) {
-      // Do nothing.
-    }
-  }
-
-  private UserDictionaryActionBarHelperFactory() {
-  }
-
-  static ActionBarHelper newInstance(Activity activity) {
-    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
-        ? new SystemActionBarHelper(activity)
-        : new MozcActionBarHelper(activity);
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
index 2bfc8b3..618b401 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
@@ -37,7 +37,6 @@
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
-import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryActionBarHelperFactory.ActionBarHelper;
 import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.DictionaryNameDialog;
 import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.DictionaryNameDialogListener;
 import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.WordRegisterDialog;
@@ -49,10 +48,8 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.res.Configuration;
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.SparseBooleanArray;
@@ -77,9 +74,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -158,21 +153,11 @@
   private static final int IMPORT_DICTIONARY_SELECTION_DIALOG_ID = 5;
 
   private UserDictionaryToolModel model;
-  private final ActionBarHelper actionBarHelper =
-      UserDictionaryActionBarHelperFactory.newInstance(this);
   private ToastManager toastManager;
-  private final Set<Dialog> visibleDialogSet = new HashSet<Dialog>();
-  private final OnDismissListener dialogDismissListener = new OnDismissListener() {
-    @Override
-    public void onDismiss(DialogInterface dialog) {
-      visibleDialogSet.remove(dialog);
-    }
-  };
 
   @Override
   protected void onCreate(Bundle savedInstance) {
     super.onCreate(savedInstance);
-    actionBarHelper.onCreate(savedInstance);
     toastManager = new ToastManager(this);
 
     // Initialize model.
@@ -222,31 +207,6 @@
   }
 
   @Override
-  protected void onPostCreate(Bundle savedInstance) {
-    super.onPostCreate(savedInstance);
-    actionBarHelper.onPostCreate(
-        savedInstance,
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            maybeShowAddEntryDialog();
-          }
-        },
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            maybeDeleteEntry();
-          }
-        },
-        new OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            runUndo();
-          }
-        });
-  }
-
-  @Override
   protected void onDestroy() {
     // To release pending resources.
     model.resetImportState();
@@ -263,7 +223,6 @@
     toastManager.maybeShowMessageShortly(model.resumeSession(defaultDictionaryName));
     updateDictionaryNameSpinner();
     updateEntryList();
-    updateDialogWindowSize();
   }
 
   @Override
@@ -375,19 +334,11 @@
     super.onPause();
   }
 
-  @Override
-  public void onConfigurationChanged(Configuration configuration) {
-    super.onConfigurationChanged(configuration);
-    actionBarHelper.onConfigurationChanged(configuration);
-    updateDialogWindowSize();
-  }
-
   // Menu implementation.
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.user_dictionary_tool_menu, menu);
-    actionBarHelper.onCreateOptionsMenu(menu);
     return true;
   }
 
@@ -558,8 +509,7 @@
                 }
                 return status;
               }
-            },
-            dialogDismissListener, toastManager);
+            }, toastManager);
 
       case EDIT_ENTRY_DIALOG_ID:
         return UserDictionaryUtil.createWordRegisterDialog(
@@ -574,8 +524,7 @@
                 }
                 return status;
               }
-            },
-            dialogDismissListener, toastManager);
+            }, toastManager);
 
       case CREATE_DICTIONARY_DIALOG_ID:
         return UserDictionaryUtil.createDictionaryNameDialog(
@@ -591,8 +540,7 @@
                 }
                 return status;
               }
-            },
-            dialogDismissListener, toastManager);
+            }, toastManager);
 
       case RENAME_DICTIONARY_DIALOG_ID:
         return UserDictionaryUtil.createDictionaryNameDialog(
@@ -607,8 +555,7 @@
                 }
                 return status;
               }
-            },
-            dialogDismissListener, toastManager);
+            }, toastManager);
 
       case ZIP_FILE_SELECTION_DIALOG_ID:
         return UserDictionaryUtil.createZipFileSelectionDialog(
@@ -648,8 +595,7 @@
               public void onCancel(DialogInterface dialog) {
                 model.resetImportState();
               }
-            },
-            dialogDismissListener);
+            });
 
       case IMPORT_DICTIONARY_SELECTION_DIALOG_ID:
         return UserDictionaryUtil.createImportDictionarySelectionDialog(
@@ -684,8 +630,7 @@
               public void onCancel(DialogInterface dialog) {
                 model.resetImportState();
               }
-            },
-            dialogDismissListener);
+            });
     }
 
     MozcLog.e("Unknown Dialog ID: " + id);
@@ -696,11 +641,6 @@
   @Override
   protected void onPrepareDialog(int id, Dialog dialog) {
     super.onPrepareDialog(id, dialog);
-
-    // Set dialog window size based on the display size.
-    UserDictionaryUtil.setDialogWindowSize(dialog);
-    visibleDialogSet.add(dialog);
-
     switch (id) {
       case ADD_ENTRY_DIALOG_ID:
         WordRegisterDialog.class.cast(dialog).setEntry(Entry.newBuilder()
@@ -784,12 +724,6 @@
     ArrayAdapter.class.cast(entryList.getAdapter()).notifyDataSetChanged();
   }
 
-  private void updateDialogWindowSize() {
-    for (Dialog dialog : visibleDialogSet) {
-      UserDictionaryUtil.setDialogWindowSize(dialog);
-    }
-  }
-
   private Spinner getDictionaryNameSpinner() {
     return Spinner.class.cast(findViewById(R.id.user_dictionary_tool_dictionary_name_spinner));
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
index 1056c92..422b610 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
@@ -40,24 +40,18 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Message;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.ArrayAdapter;
 import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.ScrollView;
 import android.widget.Spinner;
 import android.widget.TextView;
 
@@ -111,7 +105,6 @@
 
     UserDictionaryBaseDialog(Context context, int titleResourceId, int viewResourceId,
                              UserDictionaryBaseDialogListener listener,
-                             OnDismissListener dismissListener,
                              ToastManager toastManager) {
       super(context);
       this.listener = listener;
@@ -130,28 +123,12 @@
       setButton(DialogInterface.BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
                 DialogInterface.OnClickListener.class.cast(null));
       setCancelable(true);
-      setOnDismissListener(dismissListener);
     }
 
     @Override
     protected void onCreate(Bundle savedInstance) {
       super.onCreate(savedInstance);
 
-      ViewGroup contentGroup = ViewGroup.class.cast(findViewById(android.R.id.content));
-      if (contentGroup != null && contentGroup.getChildCount() > 0) {
-        // Wrap the content view by ScrollView so that we can scroll the dialog window
-        // in order to avoid shrinking the main edit text fields.
-        ScrollView view = ScrollView.class.cast(
-            LayoutInflater.from(getContext()).inflate(
-                R.layout.user_dictionary_tool_empty_scrollview, null));
-        View contentView = contentGroup.getChildAt(0);
-        contentGroup.removeViewAt(0);
-        FrameLayout.class.cast(
-            view.findViewById(R.id.user_dictionary_tool_empty_scroll_view_content))
-            .addView(contentView);
-        contentGroup.addView(view, 0);
-      }
-
       // To override the default behavior that the dialog is dismissed after user's clicking
       // a button regardless of any action inside listener, we set the callback directly
       // to the button and manage dismissing behavior.
@@ -262,7 +239,6 @@
   static class WordRegisterDialog extends UserDictionaryBaseDialog {
     WordRegisterDialog(Context context, int titleResourceId,
                        final WordRegisterDialogListener listener,
-                       OnDismissListener dismissListener,
                        ToastManager toastManager) {
       super(context, titleResourceId, R.layout.user_dictionary_tool_word_register_dialog_view,
             new UserDictionaryBaseDialogListener() {
@@ -273,8 +249,7 @@
                     getText(view, R.id.user_dictionary_tool_word_register_dialog_reading),
                     getPos(view, R.id.user_dictionary_tool_word_register_dialog_pos));
               }
-            },
-            dismissListener, toastManager);
+            }, toastManager);
       // TODO(hidehiko): Attach a callback for un-focused event on "word" EditText.
       //   and invoke reverse conversion (if necessary) to fill reading automatically.
     }
@@ -320,7 +295,6 @@
   static class DictionaryNameDialog extends UserDictionaryBaseDialog {
     DictionaryNameDialog(Context context, int titleResourceId,
                          final DictionaryNameDialogListener listener,
-                         OnDismissListener dismissListener,
                          ToastManager toastManager) {
       super(context, titleResourceId, R.layout.user_dictionary_tool_dictionary_name_dialog_view,
             new UserDictionaryBaseDialogListener() {
@@ -329,8 +303,7 @@
                 return listener.onPositiveButtonClicked(
                     getText(view, R.id.user_dictionary_tool_dictionary_name_dialog_name));
               }
-            },
-            dismissListener, toastManager);
+            }, toastManager);
     }
 
     /**
@@ -345,8 +318,6 @@
     }
   }
 
-  private static final int DIALOG_WIDTH_THRESHOLD = 480;  // in dip.
-
   /** A map from PosType to the string resource id for i18n. */
   private static final Map<PosType, Integer> POS_RESOURCE_MAP;
   static {
@@ -518,9 +489,8 @@
    */
   static WordRegisterDialog createWordRegisterDialog(
       Context context, int titleResourceId, WordRegisterDialogListener listener,
-      OnDismissListener dismissListener, ToastManager toastManager) {
-    return new WordRegisterDialog(
-        context, titleResourceId, listener, dismissListener, toastManager);
+      ToastManager toastManager) {
+    return new WordRegisterDialog(context, titleResourceId, listener, toastManager);
   }
 
   /**
@@ -528,9 +498,8 @@
    */
   static DictionaryNameDialog createDictionaryNameDialog(
       Context context, int titleResourceId, DictionaryNameDialogListener listener,
-      OnDismissListener dismissListener, ToastManager toastManager) {
-    return new DictionaryNameDialog(
-        context, titleResourceId, listener, dismissListener, toastManager);
+      ToastManager toastManager) {
+    return new DictionaryNameDialog(context, titleResourceId, listener, toastManager);
   }
 
   /**
@@ -540,11 +509,10 @@
       Context context, int titleResourceId,
       DialogInterface.OnClickListener positiveButtonListener,
       DialogInterface.OnClickListener negativeButtonListener,
-      DialogInterface.OnCancelListener cancelListener,
-      OnDismissListener dismissListener) {
+      DialogInterface.OnCancelListener cancelListener) {
     return createSimpleSpinnerDialog(
         context, titleResourceId, positiveButtonListener, negativeButtonListener,
-        cancelListener, dismissListener);
+        cancelListener);
   }
 
   /**
@@ -554,30 +522,26 @@
       Context context, int titleResourceId,
       DialogInterface.OnClickListener positiveButtonListener,
       DialogInterface.OnClickListener negativeButtonListener,
-      DialogInterface.OnCancelListener cancelListener,
-      OnDismissListener dismissListener) {
+      DialogInterface.OnCancelListener cancelListener) {
     return createSimpleSpinnerDialog(
-        context, titleResourceId, positiveButtonListener, negativeButtonListener,
-        cancelListener, dismissListener);
+        context, titleResourceId, positiveButtonListener, negativeButtonListener, cancelListener);
   }
 
   private static Dialog createSimpleSpinnerDialog(
       Context context, int titleResourceId,
       DialogInterface.OnClickListener positiveButtonListener,
       DialogInterface.OnClickListener negativeButtonListener,
-      DialogInterface.OnCancelListener cancelListener,
-      OnDismissListener dismissListener) {
+      DialogInterface.OnCancelListener cancelListener) {
     View view = LayoutInflater.from(context).inflate(
         R.layout.user_dictionary_tool_simple_spinner_dialog_view, null);
     AlertDialog dialog = new AlertDialog.Builder(context)
         .setTitle(titleResourceId)
         .setView(view)
-        .setPositiveButton(android.R.string.yes, positiveButtonListener)
+        .setPositiveButton(android.R.string.ok, positiveButtonListener)
         .setNegativeButton(android.R.string.cancel, negativeButtonListener)
         .setOnCancelListener(cancelListener)
         .setCancelable(true)
         .create();
-    dialog.setOnDismissListener(dismissListener);
     return dialog;
   }
 
@@ -589,31 +553,6 @@
   }
 
   /**
-   * The default size of dialog looks not good on some devices, such as tablets.
-   * So, modify the dialog size to make the look better.
-   *
-   * The current strategy is:
-   * - if the display is small, we tries to fill the display width by the dialog.
-   * - otherwise, set w480dip to the window.
-   */
-  static void setDialogWindowSize(Dialog dialog) {
-    DisplayMetrics metrics = dialog.getContext().getResources().getDisplayMetrics();
-    LayoutParams params = dialog.getWindow().getAttributes();
-    float dialogWidthThreshold = DIALOG_WIDTH_THRESHOLD * metrics.scaledDensity;
-    if (metrics.widthPixels > dialogWidthThreshold) {
-      params.width = (int) dialogWidthThreshold;
-    } else {
-      params.width = LayoutParams.MATCH_PARENT;
-    }
-    if (dialog instanceof UserDictionaryBaseDialog) {
-      // If the ScrollView hack is used for the dialog to make it scrollable,
-      // it is necessary to set its height parameter MATCH_PARENT as a part of the hack.
-      params.height = LayoutParams.MATCH_PARENT;
-    }
-    dialog.getWindow().setAttributes(params);
-  }
-
-  /**
    * Returns the {@code String} instance with detecting the Japanese encoding.
    * @throws UnsupportedEncodingException if it fails to detect the encoding.
    */
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java b/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java
new file mode 100644
index 0000000..0f17cca
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java
@@ -0,0 +1,139 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+/**
+ * Utility to handle candidate description.
+ */
+public class CandidateDescriptionUtil {
+
+  private static final Set<String> DESCRIPTION_BLACKLIST_SET;
+  static {
+    String[] blacklist = new String[] {
+        "ひらがな",
+        "数字",
+        "丸数字",
+        "大字",
+        "絵文字",
+        "顔文字",
+        "<機種依存>",
+        "捨て仮名",
+    };
+    DESCRIPTION_BLACKLIST_SET = Collections.unmodifiableSet(
+        new HashSet<String>(Arrays.asList(blacklist)));
+  }
+
+  private static final String[] DESCRIPTION_SUFFIX_BLACKLIST = new String[] {
+    "の旧字体",
+    "の簡易慣用字体",
+    "の印刷標準字体",
+    "の俗字",
+    "の正字",
+    "の本字",
+    "の異体字",
+    "の略字",
+    "の別字",
+  };
+
+  private static final Map<String, String> DESCRIPTION_SHORTEN_MAP;
+  static {
+    Map<String, String> map = new HashMap<String, String>();
+    map.put("小書き文字", "小書き");
+    map.put("ローマ数字(大文字)", "ローマ数字");
+    map.put("ローマ数字(小文字)", "ローマ数字");
+    DESCRIPTION_SHORTEN_MAP = Collections.unmodifiableMap(map);
+  }
+
+  private CandidateDescriptionUtil() {}
+
+  public static List<String> extractDescriptions(
+      String description, Optional<String> descriptionDelimiter) {
+    Preconditions.checkNotNull(description);
+    Preconditions.checkNotNull(descriptionDelimiter);
+
+    if (description.length() == 0) {
+      // No description is available.
+      return Collections.emptyList();
+    }
+
+    if (!descriptionDelimiter.isPresent()) {
+      // If the delimiter is not set, return the description as is.
+      return Collections.singletonList(description);
+    }
+
+    // Split the description by delimiter.
+    StringTokenizer tokenizer = new StringTokenizer(description, descriptionDelimiter.get());
+    List<String> result = new ArrayList<String>();
+    while (tokenizer.hasMoreTokens()) {
+      String token = tokenizer.nextToken();
+      if (isEligibleDescriptionFragment(token)) {
+        result.add(shortenDescriptionFragment(token));
+      }
+    }
+
+    return result;
+  }
+
+  private static boolean isEligibleDescriptionFragment(String descriptionFragment) {
+    // We'd like to always remove some descriptions because the description fragment frequently
+    // and largely increases the width of a candidate span.
+    // Increased width reduces the number of the candidates which are shown in a screen.
+    // TODO(matsuzakit): Such filtering/optimization should be done in the server side.
+    if (DESCRIPTION_BLACKLIST_SET.contains(descriptionFragment)) {
+      return false;
+    }
+    for (String suffix : DESCRIPTION_SUFFIX_BLACKLIST) {
+      if (descriptionFragment.endsWith(suffix)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static String shortenDescriptionFragment(String descriptionFragment) {
+    Preconditions.checkNotNull(descriptionFragment);
+    return Objects.firstNonNull(DESCRIPTION_SHORTEN_MAP.get(descriptionFragment),
+                                descriptionFragment);
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java b/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
index 2e924b2..3080f90 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
@@ -62,8 +62,6 @@
  */
 public class ImeSwitcherFactory {
 
-  static final int SWITCH_NEXT_TARGTET_API_LEVEL = 16;
-
   private static final String GOOGLE_PACKAGE_ID_PREFIX = "com.google.android";
   private static final String VOICE_IME_MODE = "voice";
 
@@ -133,6 +131,13 @@
      * @return true if the switching succeeds
      */
     boolean switchToNextInputMethod(boolean onlyCurrentIme);
+
+    /**
+     * @see InputMethodManager#shouldOfferSwitchingToNextInputMethod(IBinder)
+     *
+     * If not supported the API, returns false.
+     */
+    boolean shouldOfferSwitchingToNextInputMethod();
   }
 
   /**
@@ -222,15 +227,20 @@
     public boolean switchToNextInputMethod(boolean onlyCurrentIme) {
       return false;
     }
+
+    @Override
+    public boolean shouldOfferSwitchingToNextInputMethod() {
+      return false;
+    }
   }
 
   /**
    * A switcher for much later OS where switchToNextInputMethod is available.
    */
-  @TargetApi(SWITCH_NEXT_TARGTET_API_LEVEL)
-  static class NextInputSwitchableImeSwitcher extends SubtypeImeSwitcher {
+  @TargetApi(16)
+  static class ImeSwitcher16 extends SubtypeImeSwitcher {
 
-    public NextInputSwitchableImeSwitcher(InputMethodService inputMethodService) {
+    public ImeSwitcher16(InputMethodService inputMethodService) {
       super(inputMethodService);
     }
 
@@ -241,14 +251,33 @@
     }
   }
 
+  /**
+   * A switcher for much later OS where switchToNextInputMethod is available.
+   */
+  @TargetApi(19)
+  static class ImeSwitcher21 extends ImeSwitcher16 {
+
+    public ImeSwitcher21(InputMethodService inputMethodService) {
+      super(inputMethodService);
+    }
+
+    @Override
+    public boolean shouldOfferSwitchingToNextInputMethod() {
+      return MozcUtil.getInputMethodManager(inputMethodService)
+          .shouldOfferSwitchingToNextInputMethod(getToken());
+    }
+  }
+
   // A constructor of concrete switcher class.
   // Null if reflection fails.
   static final Constructor<? extends ImeSwitcher> switcherConstructor;
 
   static {
     Class<? extends ImeSwitcher> clazz;
-    if (Build.VERSION.SDK_INT >= SWITCH_NEXT_TARGTET_API_LEVEL) {
-      clazz = NextInputSwitchableImeSwitcher.class;
+    if (Build.VERSION.SDK_INT >= 21) {
+      clazz = ImeSwitcher21.class;
+    } else if (Build.VERSION.SDK_INT >= 16) {
+      clazz = ImeSwitcher16.class;
     } else {
       clazz = SubtypeImeSwitcher.class;
     }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java
new file mode 100644
index 0000000..0f77fbb
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java
@@ -0,0 +1,139 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.LauncherActivity;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.preference.PreferenceManager;
+
+/**
+ * Manager of launcher icon's visibility.
+ */
+public class LauncherIconManagerFactory {
+
+  /**
+   * Interface for the manager.
+   */
+  public interface LauncherIconManager {
+    /**
+     * Updates launcher icon's visibility by checking the value in preferences or
+     * by checking whether the app is (updated) system application or not.
+     *
+     * @param context The application's context.
+     */
+    public void updateLauncherIconVisibility(Context context);
+  }
+
+  @VisibleForTesting
+  static class DefaultImplementation implements LauncherIconManager {
+
+    @Override
+    public void updateLauncherIconVisibility(Context context) {
+      Preconditions.checkNotNull(context);
+      SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
+      boolean visible = shouldLauncherIconBeVisible(context, sharedPreferences);
+      updateComponentEnableSetting(context, LauncherActivity.class, visible);
+      sharedPreferences.edit()
+          .putBoolean(PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY, visible)
+          .apply();
+    }
+
+    /**
+     * Enables/disables component.
+     *
+     * @param context The application's context
+     * @param component The component to be enabled/disabled
+     * @param enabled true for enabled, false for disabled
+     */
+    private void updateComponentEnableSetting(
+        Context context, Class<?> component, boolean enabled) {
+      Preconditions.checkNotNull(context);
+      Preconditions.checkNotNull(component);
+      PackageManager packageManager = context.getPackageManager();
+      ComponentName componentName = new ComponentName(context.getApplicationContext(), component);
+      int newState = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                             : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+      if (newState != packageManager.getComponentEnabledSetting(componentName)) {
+        packageManager.setComponentEnabledSetting(
+            componentName, newState, PackageManager.DONT_KILL_APP);
+      }
+    }
+
+    @VisibleForTesting
+    static boolean shouldLauncherIconBeVisible(Context context,
+                                               SharedPreferences sharedPreferences) {
+      // NOTE: Both flags below can be true at the same time.
+      boolean isSystemApplication = MozcUtil.isSystemApplication(context);
+      boolean isUpdatedSystemApplication = MozcUtil.isUpdatedSystemApplication(context);
+      if (sharedPreferences.contains(PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY)) {
+        return sharedPreferences.getBoolean(
+            PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY, true);
+      } else {
+        // If PREF_LAUNCHER_ICON_VISIBILITY_KEY is not set, we don't show launcher icon in
+        // following conditions:
+        if (isSystemApplication && !isUpdatedSystemApplication) {
+          // System app (not updated) doesn't show the icon.
+          return false;
+        }
+        if (isUpdatedSystemApplication
+            && sharedPreferences.contains(
+                PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
+          // Workaround for updated system app from preinstalled 2.16.1955.3.
+          // Preinstalled 2.16.1955.3 doesn't put PREF_LAUNCHER_ICON_VISIBILITY_KEY
+          // unless preference screen is shown so checking PREF_LAUNCHER_ICON_VISIBILITY_KEY
+          // doesn't work for the version. 
+          // However PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE is always written,
+          // use the preference instaed.
+          // If the preference  exists, this means the IME has been launched as a preinstall
+          // app at least once.
+          // Therefore we should take over the visibility (== hide the icon).
+          return false;
+        }
+        return true;
+      }
+    }
+  }
+
+  private static LauncherIconManager defaultInstance = new DefaultImplementation();
+
+  private LauncherIconManagerFactory() {}
+
+  public static LauncherIconManager getDefaultInstance() {
+    return defaultInstance;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java b/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java
new file mode 100644
index 0000000..ebfa8da
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java
@@ -0,0 +1,98 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Utility for XML parser.
+ */
+public class ParserUtil {
+
+  public static void ignoreWhiteSpaceAndComment(XmlPullParser parser)
+      throws XmlPullParserException, IOException {
+    int event = parser.getEventType();
+    while (event == XmlPullParser.IGNORABLE_WHITESPACE || event == XmlPullParser.COMMENT) {
+      event = parser.next();
+    }
+  }
+
+  public static void assertStartDocument(XmlPullParser parser) throws XmlPullParserException {
+    if (parser.getEventType() != XmlPullParser.START_DOCUMENT) {
+      throw new IllegalArgumentException(
+          "The start of document is expected, but actually not: "
+          + parser.getPositionDescription());
+    }
+  }
+
+  public static void assertEndDocument(XmlPullParser parser) throws XmlPullParserException {
+    if (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+      throw new IllegalArgumentException(
+          "The end of document is expected, but actually not: " + parser.getPositionDescription());
+    }
+  }
+
+  public static void assertNotEndDocument(XmlPullParser parser) throws XmlPullParserException {
+    if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
+      throw new IllegalArgumentException(
+          "Unexpected end of document is found: " + parser.getPositionDescription());
+    }
+  }
+
+  public static void assertTagName(XmlPullParser parser, String expectedName) {
+    String actualName = parser.getName();
+    if (!actualName.equals(expectedName)) {
+      throw new IllegalArgumentException(
+          "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: "
+          + parser.getPositionDescription());
+    }
+  }
+
+  public static void assertStartTag(XmlPullParser parser, String expectedName)
+      throws XmlPullParserException {
+    if (parser.getEventType() != XmlPullParser.START_TAG) {
+      throw new IllegalArgumentException(
+          "Start tag <" + expectedName + "> is expected: " + parser.getPositionDescription());
+    }
+    assertTagName(parser, expectedName);
+  }
+
+  public static void assertEndTag(XmlPullParser parser, String expectedName)
+      throws XmlPullParserException {
+    if (parser.getEventType() != XmlPullParser.END_TAG) {
+      throw new IllegalArgumentException(
+          "End tag </" + expectedName + "> is expected: " + parser.getPositionDescription());
+    }
+    assertTagName(parser, expectedName);
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java b/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
index 5e978f3..e679c34 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
@@ -29,10 +29,10 @@
 
 package org.mozc.android.inputmethod.japanese.view;
 
-import org.mozc.android.inputmethod.japanese.MozcLog;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.util.SparseArray;
 
@@ -43,21 +43,21 @@
 public class DrawableCache {
 
   private final SparseArray<Drawable> cacheMap = new SparseArray<Drawable>(128);
-  private final MozcDrawableFactory mozcDrawableFactory;
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+  private Skin skin = Skin.getFallbackInstance();
+  private final Resources resources;
 
-  public DrawableCache(MozcDrawableFactory mozcDrawableFactory) {
-    this.mozcDrawableFactory = Preconditions.checkNotNull(mozcDrawableFactory);
+  public DrawableCache(Resources resources) {
+    this.resources = Preconditions.checkNotNull(resources);
   }
 
-  public void setSkinType(SkinType skinType) {
-    if (this.skinType == Preconditions.checkNotNull(skinType)) {
+  public void setSkin(Skin skin) {
+    Preconditions.checkNotNull(skin);
+    if (this.skin.equals(skin)) {
       return;
     }
 
-    this.skinType = skinType;
+    this.skin = skin;
     cacheMap.clear();
-    mozcDrawableFactory.setSkinType(skinType);
   }
 
   /**
@@ -74,12 +74,8 @@
     Integer key = Integer.valueOf(resourceId);
     Optional<Drawable> drawable = Optional.fromNullable(cacheMap.get(key));
     if (!drawable.isPresent()) {
-      drawable = mozcDrawableFactory.getDrawable(resourceId);
-      if (drawable.isPresent()) {
-        cacheMap.put(key, drawable.get());
-      } else {
-        MozcLog.e("Failed to load: " + resourceId);
-      }
+      drawable = Optional.of(skin.getDrawable(resources, resourceId));
+      cacheMap.put(key, drawable.get());
     }
     return drawable;
   }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java
new file mode 100644
index 0000000..c9ea337
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java
@@ -0,0 +1,82 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.drawable.Drawable;
+
+/**
+ * Singleton dummy drawable which does nothing.
+ * <p>
+ * Typically used when skin is not specified.
+ */
+public class DummyDrawable extends Drawable {
+
+  private static final DummyDrawable theInstance = new DummyDrawable();
+
+  public static DummyDrawable getInstance() {
+    return theInstance;
+  }
+
+  private DummyDrawable() {}
+
+  @Override
+  public void draw(Canvas canvas) {
+  }
+
+  @Override
+  public int getOpacity() {
+    return 0;
+  }
+
+  @Override
+  public void setAlpha(int alpha) {
+  }
+
+  @Override
+  public void setColorFilter(ColorFilter cf) {
+  }
+
+  @Override
+  public ConstantState getConstantState() {
+    return new ConstantState() {
+      @Override
+      public Drawable newDrawable() {
+        return theInstance;
+      }
+
+      @Override
+      public int getChangingConfigurations() {
+        return 0;
+      }
+    };
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java
deleted file mode 100644
index 1930cb1..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import android.graphics.BlurMaskFilter;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.BlurMaskFilter.Blur;
-import android.graphics.Paint.Style;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.Drawable;
-
-/**
- * The light (indicator) mark for ALT key on qwerty layout.
- *
- */
-public class LightIconDrawable extends Drawable {
-  private final float topOffset;
-  private final float rightOffset;
-
-  private final int lightColor;
-  private final int darkColor;
-  private final float radius;
-
-  private float centerX;
-  private float centerY;
-
-  private final Paint basePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint shadePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
-  public LightIconDrawable(float topOffset, float rightOffset,
-                           int lightColor, int darkColor, int shadeColor, float radius) {
-    this.topOffset = topOffset;
-    this.rightOffset = rightOffset;
-    this.lightColor = lightColor;
-    this.darkColor = darkColor;
-    this.radius = radius;
-
-    if (lightColor == darkColor) {
-      basePaint.setColor(lightColor);
-    }
-
-    shadePaint.setStyle(Style.STROKE);
-    shadePaint.setStrokeWidth(1);
-    shadePaint.setMaskFilter(new BlurMaskFilter(2, Blur.INNER));
-    shadePaint.setColor(shadeColor);
-  }
-
-  /* (non-Javadoc)
-   * @see android.graphics.drawable.Drawable#draw(android.graphics.Canvas)
-   */
-  @Override
-  public void draw(Canvas canvas) {
-    canvas.drawCircle(centerX, centerY, radius, basePaint);
-    canvas.drawCircle(centerX, centerY, radius, shadePaint);
-  }
-
-  @Override
-  protected void onBoundsChange(Rect bound) {
-    super.onBoundsChange(bound);
-
-    centerX = bound.right - rightOffset;
-    centerY = bound.top + topOffset;
-
-    if (lightColor != darkColor) {
-      float top = centerY - radius;
-      // Hard coded parameters are based on design mock.
-      basePaint.setShader(new LinearGradient(
-          centerX, top, centerX + 2, top + 8, lightColor, darkColor, TileMode.CLAMP));
-    }
-  }
-
-  @Override
-  public int getOpacity() {
-    return PixelFormat.TRANSLUCENT;
-  }
-
-  @Override
-  public void setAlpha(int alpha) {
-  }
-
-  @Override
-  public void setColorFilter(ColorFilter cf) {
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
index abb0aa3..4a66552 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
@@ -31,14 +31,17 @@
 
 import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.MozcUtil;
+import com.google.common.base.Charsets;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.content.res.AssetManager;
 import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.LinearGradient;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.Paint.Align;
 import android.graphics.Paint.Cap;
 import android.graphics.Paint.Join;
 import android.graphics.Paint.Style;
@@ -48,13 +51,16 @@
 import android.graphics.RectF;
 import android.graphics.Shader;
 import android.graphics.Shader.TileMode;
+import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PictureDrawable;
 import android.graphics.drawable.StateListDrawable;
+import android.os.Build;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Locale;
 
 /**
  * Factory to create Drawables from raw resources which is in mozc original format.
@@ -68,7 +74,16 @@
  * Also, for performance purpose, this class caches the parsed drawable.
  *
  */
-public class MozcDrawableFactory {
+class MozcDrawableFactory {
+
+  private static class MozcStyle {
+    Paint paint = new Paint();
+    int dominantBaseline = COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO;
+  }
+
+  /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+  private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+      ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
 
   private static final int DRAWABLE_PICTURE = 1;
   private static final int DRAWABLE_STATE_LIST = 2;
@@ -83,6 +98,7 @@
   private static final int COMMAND_PICTURE_DRAW_ELLIPSE = 7;
   private static final int COMMAND_PICTURE_DRAW_GROUP_START = 8;
   private static final int COMMAND_PICTURE_DRAW_GROUP_END = 9;
+  private static final int COMMAND_PICTURE_DRAW_TEXT = 10;
 
   private static final int COMMAND_PICTURE_PATH_EOP = 0;
   private static final int COMMAND_PICTURE_PATH_MOVE = 1;
@@ -101,31 +117,42 @@
   private static final int COMMAND_PICTURE_PAINT_STROKE_CAP = 5;
   private static final int COMMAND_PICTURE_PAINT_STROKE_JOIN = 6;
   private static final int COMMAND_PICTURE_PAINT_SHADER = 7;
+  private static final int COMMAND_PICTURE_PAINT_FONT_SIZE = 8;
+  private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR = 9;
+  private static final int COMMAND_PICTURE_PAINT_DOMINANT_BASELINE = 10;
+  private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT = 11;
+
+  private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_START = 0;
+  private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE = 1;
+  private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_END = 2;
+
+  private static final int COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO = 0;
+  @SuppressWarnings("unused")
+  private static final int COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL = 1;
+
+  @SuppressWarnings("unused")
+  private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT_NORMAL = 0;
+  private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT_BOLD = 1;
 
   private static final int COMMAND_PICTURE_SHADER_LINEAR_GRADIENT = 1;
   private static final int COMMAND_PICTURE_SHADER_RADIAL_GRADIENT = 2;
 
   private static final int[] EMPTY_STATE_LIST = {};
 
+  private static final String FONT_PATH = "subset_font.otf";
+
   private final Resources resources;
   private final WeakDrawableCache cacheMap = new WeakDrawableCache();
-  private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+  private final Skin skin;
+  private static volatile Optional<Typeface> typeface = Optional.absent();
 
-  public MozcDrawableFactory(Resources resources) {
+  MozcDrawableFactory(Resources resources, Skin skin) {
     this.resources = Preconditions.checkNotNull(resources);
+    this.skin = Preconditions.checkNotNull(skin);
+    ensureTypeface(resources.getAssets());
   }
 
-  // TODO(hidehiko): Add test to make sure getDrawable returns diffenent instances for
-  // the same resourceId when the current skinType gets different.
-  public void setSkinType(SkinType skinType) {
-    if (this.skinType != Preconditions.checkNotNull(skinType)) {
-      this.skinType = skinType;
-      // Invalidate cache.
-      cacheMap.clear();
-    }
-  }
-
-  public Optional<Drawable> getDrawable(int resourceId) {
+  Optional<Drawable> getDrawable(int resourceId) {
     if (!resources.getResourceTypeName(resourceId).equalsIgnoreCase("raw")) {
       // For non-"raw" resources, just delegate loading to Resources.
       return Optional.fromNullable(resources.getDrawable(resourceId));
@@ -138,7 +165,7 @@
       try {
         boolean success = false;
         try {
-          drawable = createDrawable(new DataInputStream(stream), skinType);
+          drawable = createDrawable(new DataInputStream(stream), skin);
           success = true;
         } finally {
           MozcUtil.close(stream, !success);
@@ -154,17 +181,16 @@
     return drawable;
   }
 
-  private static Optional<Drawable> createDrawable(DataInputStream stream, SkinType skinType)
+  private static Optional<Drawable> createDrawable(DataInputStream stream, Skin skin)
       throws IOException {
     Preconditions.checkNotNull(stream);
-    Preconditions.checkNotNull(skinType);
 
     byte tag = stream.readByte();
     switch (tag) {
       case DRAWABLE_PICTURE:
-        return Optional.<Drawable>of(createPictureDrawable(stream, skinType));
+        return Optional.<Drawable>of(createPictureDrawable(stream, skin));
       case DRAWABLE_STATE_LIST:
-        return Optional.<Drawable>of(createStateListDrawable(stream, skinType));
+        return Optional.<Drawable>of(createStateListDrawable(stream, skin));
       default:
         MozcLog.e("Unknown tag: " + tag);
     }
@@ -174,16 +200,18 @@
   // Note, PictureDrawable may cause runtime slowness.
   // Instead, we can prepare pre-rendered bit-map drawable, by modifying the interface to take
   // the drawable, which should be faster theoretically.
-  private static PictureDrawable createPictureDrawable(DataInputStream stream, SkinType skinType)
+  private static PictureDrawable createPictureDrawable(DataInputStream stream, Skin skin)
       throws IOException {
+    Preconditions.checkNotNull(stream);
+    Preconditions.checkNotNull(skin);
     // The first eight bytes are width and height (four bytes for each).
     int width = stream.readUnsignedShort();
     int height = stream.readUnsignedShort();
 
     Picture picture = new Picture();
     Canvas canvas = picture.beginRecording(width, height);
-    Paint paint = new Paint();
-    resetPaint(paint);
+    MozcStyle style = new MozcStyle();
+    resetStyle(style);
 
     LOOP: while (true) {
       byte command = stream.readByte();
@@ -195,13 +223,13 @@
           Path path = createPath(stream);
           int size = stream.readByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawPath(path, paint);
+            resetStyle(style);
+            canvas.drawPath(path, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawPath(path, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawPath(path, style.paint);
             }
           }
           break;
@@ -218,16 +246,17 @@
 
           int size = stream.readByte();
           if (size == 0) {
-            resetPaint(paint);
+            resetStyle(style);
             for (int i = 0; i < length - 2; i += 2) {
-              canvas.drawLine(points[i], points[i + 1], points[i + 2], points[i + 3], paint);
+              canvas.drawLine(points[i], points[i + 1], points[i + 2], points[i + 3], style.paint);
             }
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
               for (int j = 0; j < length - 2; j += 2) {
-                canvas.drawLine(points[j], points[j + 1], points[j + 2], points[j + 3], paint);
+                canvas.drawLine(points[j], points[j + 1], points[j + 2], points[j + 3],
+                                style.paint);
               }
             }
           }
@@ -254,13 +283,13 @@
 
           int size = stream.readUnsignedByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawPath(path, paint);
+            resetStyle(style);
+            canvas.drawPath(path, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawPath(path, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawPath(path, style.paint);
             }
           }
           break;
@@ -273,13 +302,13 @@
 
           int size = stream.readUnsignedByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawLine(x1, y1, x2, y2, paint);
+            resetStyle(style);
+            canvas.drawLine(x1, y1, x2, y2, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawLine(x1, y1, x2, y2, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawLine(x1, y1, x2, y2, style.paint);
             }
           }
           break;
@@ -292,13 +321,13 @@
 
           int size = stream.readUnsignedByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawRect(x, y, x + w, y + h, paint);
+            resetStyle(style);
+            canvas.drawRect(x, y, x + w, y + h, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawRect(x, y, x + w, y + h, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawRect(x, y, x + w, y + h, style.paint);
             }
           }
           break;
@@ -311,13 +340,13 @@
 
           int size = stream.readUnsignedByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawOval(bound, paint);
+            resetStyle(style);
+            canvas.drawOval(bound, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawOval(bound, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawOval(bound, style.paint);
             }
           }
           break;
@@ -331,13 +360,13 @@
 
           int size = stream.readUnsignedByte();
           if (size == 0) {
-            resetPaint(paint);
-            canvas.drawOval(bound, paint);
+            resetStyle(style);
+            canvas.drawOval(bound, style.paint);
           } else {
             for (int i = 0; i < size; ++i) {
-              resetPaint(paint);
-              parsePaint(stream, skinType, paint);
-              canvas.drawOval(bound, paint);
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              canvas.drawOval(bound, style.paint);
             }
           }
           break;
@@ -361,6 +390,29 @@
         case COMMAND_PICTURE_DRAW_GROUP_END:
           canvas.restore();
           break;
+        case COMMAND_PICTURE_DRAW_TEXT: {
+          float x = readCompressedFloat(stream);
+          float y = readCompressedFloat(stream);
+          short stringSize = stream.readShort();
+          byte[] stringBuffer = new byte[stringSize];
+          stream.read(stringBuffer);
+          String string = new String(stringBuffer, Charsets.UTF_8);
+          int size = stream.readByte();
+          if (size == 0) {
+            resetStyle(style);
+            canvas.drawText(string, x, y, style.paint);
+          } else {
+            for (int i = 0; i < size; ++i) {
+              resetStyle(style);
+              parseStyle(stream, skin, style);
+              float drawY = style.dominantBaseline == COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO
+                  ? y
+                  : y - (style.paint.ascent() + style.paint.descent()) / 2;
+              canvas.drawText(string, x, drawY, style.paint);
+            }
+          }
+          break;
+        }
         default:
           MozcLog.e("unknown command " + command);
       }
@@ -370,20 +422,42 @@
     return new MozcPictureDrawable(picture);
   }
 
-  private static void resetPaint(Paint paint) {
-    paint.reset();
-    paint.setAntiAlias(true);
+  private void ensureTypeface(AssetManager assetManager) {
+    if (!typeface.isPresent()) {
+      synchronized (typeface) {
+        if (!typeface.isPresent()) {
+          try {
+            typeface = Optional.of(Typeface.createFromAsset(assetManager, FONT_PATH));
+          } catch (RuntimeException e) {
+            // Typeface cannot be made. Use default typeface as fallback.
+            MozcLog.e(FONT_PATH + " is not accessible. Use system font.");
+            typeface = Optional.of(Typeface.DEFAULT);
+          }
+        }
+      }
+    }
   }
 
-  private static void parsePaint(DataInputStream stream, SkinType skinType, Paint paint)
+  private static void resetStyle(MozcStyle style) {
+    style.paint.reset();
+    style.paint.setAntiAlias(true);
+    style.paint.setTypeface(typeface.get());
+    if (TEXT_LOCALE.isPresent()) {
+      style.paint.setTextLocale(TEXT_LOCALE.get());
+    }
+    style.dominantBaseline = COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO;
+  }
+
+  private static void parseStyle(DataInputStream stream, Skin skin, MozcStyle style)
       throws IOException {
+    Paint paint = style.paint;
     while (true) {
       int tag = stream.readByte() & 0xFF;
       if (tag >= 128) {
         // This is a bit tricky format, but the highest 1-bit means that the style should be
         // based on skin configuration. Delegate the paint to the skin.
-        skinType.apply(paint, tag & 0x7F);
-        return;
+        skin.apply(paint, tag & 0x7F);
+        continue;
       }
 
       switch (tag) {
@@ -421,6 +495,35 @@
           paint.setShader(createShader(stream).orNull());
           break;
         }
+        case COMMAND_PICTURE_PAINT_FONT_SIZE: {
+          paint.setTextSize(readCompressedFloat(stream));
+          break;
+        }
+        case COMMAND_PICTURE_PAINT_TEXT_ANCHOR: {
+          byte value = stream.readByte();
+          switch (value) {
+            case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_START:
+              paint.setTextAlign(Align.LEFT);
+              break;
+            case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE:
+              paint.setTextAlign(Align.CENTER);
+              break;
+            case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_END:
+              paint.setTextAlign(Align.RIGHT);
+              break;
+            default:
+              MozcLog.e("Unknown text-anchor : " + value, new Exception());
+          }
+          break;
+        }
+        case COMMAND_PICTURE_PAINT_DOMINANT_BASELINE: {
+          style.dominantBaseline = stream.readByte();
+          break;
+        }
+        case COMMAND_PICTURE_PAINT_FONT_WEIGHT: {
+          style.paint.setFakeBoldText(stream.readByte() == COMMAND_PICTURE_PAINT_FONT_WEIGHT_BOLD);
+          break;
+        }
         default:
           MozcLog.e("Unknown paint tag: " + tag, new Exception());
       }
@@ -584,12 +687,12 @@
   }
 
   private static StateListDrawable createStateListDrawable(
-      DataInputStream stream, SkinType skinType) throws IOException {
+      DataInputStream stream, Skin skin) throws IOException {
     int length = stream.readUnsignedByte();
     StateListDrawable result = new StateListDrawable();
     for (int i = 0; i < length; ++i) {
       int[] stateList = createStateList(stream);
-      Optional<Drawable> drawable = createDrawable(stream, skinType);
+      Optional<Drawable> drawable = createDrawable(stream, skin);
       result.addState(stateList, drawable.orNull());
     }
     return result;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java
new file mode 100644
index 0000000..2906280
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java
@@ -0,0 +1,94 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+
+/**
+ * A ImageButton which accepts mozc drawable as src.
+ * <p>
+ * See {@code MozcImageView}.
+ */
+public class MozcImageButton extends ImageButton implements MozcImageCapableView {
+
+  private final MozcImageCapableViewDelegate delegate = new MozcImageCapableViewDelegate(this);
+
+  public MozcImageButton(Context context, AttributeSet attrs, int defStyle) {
+    super(context, attrs, defStyle);
+    Preconditions.checkArgument(
+        MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+    delegate.loadMozcImageSource(attrs);
+  }
+
+  public MozcImageButton(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    Preconditions.checkArgument(
+        MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+    delegate.loadMozcImageSource(attrs);
+  }
+
+  public MozcImageButton(Context context) {
+    super(context);
+  }
+
+  public void setRawId(int rawId) {
+    delegate.setRawId(rawId);
+  }
+
+  public void setSkin(Skin skin) {
+    delegate.setSkin(skin);
+  }
+
+  @Override
+  protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+    super.onSizeChanged(width, height, oldWidth, oldHeight);
+    delegate.updateAdditionalPadding();
+  }
+
+  @Override
+  public void setMaxImageWidth(int maxImageWidth) {
+    delegate.setMaxImageWidth(maxImageWidth);
+  }
+
+  @Override
+  public void setMaxImageHeight(int maxImageHeight) {
+    delegate.setMaxImageHeight(maxImageHeight);
+  }
+
+  @Override
+  public ImageView asImageView() {
+    return this;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java
new file mode 100644
index 0000000..bf84af6
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java
@@ -0,0 +1,174 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * Views which support MozcDrawable should implement this interface
+ * delegate some methods.
+ */
+public interface MozcImageCapableView {
+
+  public void setMaxImageWidth(int maxImageWidth);
+  public void setMaxImageHeight(int maxImageHeight);
+  public ImageView asImageView();
+
+  /**
+   * Delagate object used by the views implementing MozcImageCapableView.
+   */
+  class MozcImageCapableViewDelegate {
+
+    private static final int INVALID_RESOURCE_ID = 0;
+    private static final int UNSPECIFIED_SIZE = -1;
+    private static final String XML_NAMESPACE_ANDROID =
+        "http://schemas.android.com/apk/res/android";
+    private static final String XML_NAMESPACE_MOZC =
+        "http://schemas.android.com/apk/res-auto";
+    private Skin skin = Skin.getFallbackInstance();
+    private int rawId = INVALID_RESOURCE_ID;
+    private int maxImageWidth = UNSPECIFIED_SIZE;
+    private int maxImageHeight = UNSPECIFIED_SIZE;
+    private final MozcImageCapableView baseView;
+
+    MozcImageCapableViewDelegate(MozcImageCapableView baseView) {
+      this.baseView = Preconditions.checkNotNull(baseView);
+      // Disable h/w acceleration to use a PictureDrawable.
+      baseView.asImageView().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+    }
+
+    static boolean assertSrcAttribute(Resources resources, AttributeSet attrs) {
+      int srcId = attrs.getAttributeResourceValue(
+          XML_NAMESPACE_ANDROID, "src", INVALID_RESOURCE_ID);
+      if (srcId == INVALID_RESOURCE_ID) {
+        return true;
+      }
+      return !"raw".equals(resources.getResourceTypeName(srcId));
+    }
+
+    void loadMozcImageSource(AttributeSet attrs) {
+      rawId = attrs.getAttributeResourceValue(
+          XML_NAMESPACE_MOZC, "rawSrc", INVALID_RESOURCE_ID);
+      TypedArray typedArray =
+          baseView.asImageView().getContext().obtainStyledAttributes(attrs,
+                                                                     R.styleable.MozcImageView);
+      try {
+        maxImageWidth =
+            typedArray.getDimensionPixelOffset(R.styleable.MozcImageView_maxImageWidth,
+                                               UNSPECIFIED_SIZE);
+        maxImageHeight =
+            typedArray.getDimensionPixelOffset(R.styleable.MozcImageView_maxImageHeight,
+                                               UNSPECIFIED_SIZE);
+      } finally {
+        typedArray.recycle();
+      }
+    }
+
+    private void updateMozcDrawable() {
+      if (rawId != INVALID_RESOURCE_ID) {
+        ImageView view = baseView.asImageView();
+        view.setImageDrawable(
+            skin.getDrawable(baseView.asImageView().getContext().getResources(), rawId));
+        view.invalidate();
+      }
+    }
+
+    void setRawId(int rawId) {
+      this.rawId = rawId;
+      updateMozcDrawable();
+    }
+
+    @SuppressWarnings("deprecation")
+    void setSkin(Skin skin) {
+      this.skin = Preconditions.checkNotNull(skin);
+      updateMozcDrawable();
+    }
+
+    void updateAdditionalPadding() {
+      updateAdditionalHorizontalPadding();
+      updateAdditionalVerticalPadding();
+    }
+
+    void setMaxImageWidth(int maxImageWidth) {
+      this.maxImageWidth = maxImageWidth;
+      updateAdditionalHorizontalPadding();
+    }
+
+    void setMaxImageHeight(int maxImageHeight) {
+      this.maxImageHeight = maxImageHeight;
+      updateAdditionalVerticalPadding();
+    }
+
+    private void updateAdditionalHorizontalPadding() {
+      ImageView imageView = baseView.asImageView();
+      int paddingLeft = baseView.asImageView().getPaddingLeft();
+      int paddingRight = baseView.asImageView().getPaddingRight();
+      int additionalHorizontalPadding = maxImageWidth < 0 ? 0 : Math.max(
+          0, baseView.asImageView().getWidth() - paddingLeft - paddingRight - maxImageWidth);
+      if (additionalHorizontalPadding == 0) {
+        return;
+      }
+      int additionalLeftPadding = additionalHorizontalPadding / 2;
+      int additionalRightPadding = additionalHorizontalPadding - additionalLeftPadding;
+      baseView.asImageView().setPadding(
+          paddingLeft + additionalLeftPadding,
+          imageView.getPaddingTop(),
+          paddingRight + additionalRightPadding,
+          imageView.getPaddingBottom());
+      imageView.invalidate();
+    }
+
+    private void updateAdditionalVerticalPadding() {
+      ImageView imageView = baseView.asImageView();
+      int paddingTop = imageView.getPaddingTop();
+      int paddingBottom = imageView.getPaddingBottom();
+      int additionalVerticalPadding = maxImageHeight < 0
+          ? 0 : imageView.getHeight() - paddingTop - paddingBottom - maxImageHeight;
+      if (additionalVerticalPadding == 0) {
+        return;
+      }
+      int additionalTopPadding = additionalVerticalPadding / 2;
+      int additionalBottomPadding = additionalVerticalPadding - additionalTopPadding;
+      baseView.asImageView().setPadding(
+          imageView.getPaddingLeft(),
+          paddingTop + additionalTopPadding,
+          imageView.getPaddingRight(),
+          paddingBottom + additionalBottomPadding);
+      imageView.invalidate();
+    }
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java
new file mode 100644
index 0000000..5e08e93
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java
@@ -0,0 +1,104 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+/**
+ * A ImageView which accepts mozc drawable as src.
+ * <p>
+ * In addition to ImageView, following XML attributes are supported:
+ * <ul>
+ * <li>maxImageWidth(dimension): If set, additional padding (left and right) are automatically
+ * set in order to make drawn image thinner than given width.
+ * {@code setPadding} and {@code setPaddingRelative} are disabled
+ *  (UnsupportedOperationException will be thrown}.
+ * <li>maxImageHeight(dimension): Same as maxImageWidth.
+ * </ul>
+ * <p>
+ * This class is not intended to be changed its padding.
+ * There was a warning code for it but on old Android framework setPadding() is always called
+ * so the warning code has been removed.
+ */
+public class MozcImageView extends ImageView implements MozcImageCapableView {
+
+  private final MozcImageCapableViewDelegate delegate = new MozcImageCapableViewDelegate(this);
+
+  public MozcImageView(Context context, AttributeSet attrs, int defStyle) {
+    super(context, attrs, defStyle);
+    Preconditions.checkArgument(
+        MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+    delegate.loadMozcImageSource(attrs);
+  }
+
+  public MozcImageView(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    Preconditions.checkArgument(
+        MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+    delegate.loadMozcImageSource(attrs);
+  }
+
+  public MozcImageView(Context context) {
+    super(context);
+  }
+
+  public void setRawId(int rawId) {
+    delegate.setRawId(rawId);
+  }
+
+  public void setSkin(Skin skin) {
+    delegate.setSkin(skin);
+  }
+
+  @Override
+  protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+    super.onSizeChanged(width, height, oldWidth, oldHeight);
+    delegate.updateAdditionalPadding();
+  }
+
+  @Override
+  public void setMaxImageWidth(int maxImageWidth) {
+    delegate.setMaxImageWidth(maxImageWidth);
+  }
+
+  @Override
+  public void setMaxImageHeight(int maxImageHeight) {
+    delegate.setMaxImageHeight(maxImageHeight);
+  }
+
+  @Override
+  public ImageView asImageView() {
+    return this;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
index f756296..fc53a43 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
@@ -34,6 +34,7 @@
 import android.graphics.Canvas;
 import android.graphics.Picture;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PictureDrawable;
 
 /**
@@ -48,6 +49,9 @@
 
   @Override
   public void draw(Canvas canvas) {
+    Preconditions.checkArgument(!canvas.isHardwareAccelerated(),
+        "MozcPictureDrawable doesn't accept h/w accelerated canvas, "
+        + "which doesn't support drawPicture().");
     Picture picture = getPicture();
     if (picture == null) {
       return;
@@ -65,4 +69,19 @@
       canvas.restoreToCount(saveCount);
     }
   }
+
+  @Override
+  public ConstantState getConstantState() {
+    return new ConstantState() {
+      @Override
+      public int getChangingConfigurations() {
+        return 0;
+      }
+
+      @Override
+      public Drawable newDrawable() {
+        return new MozcPictureDrawable(getPicture());
+      }
+    };
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java
deleted file mode 100644
index c2cccd2..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import com.google.common.base.Optional;
-
-import android.graphics.BlurMaskFilter;
-import android.graphics.BlurMaskFilter.Blur;
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.Rect;
-import android.graphics.Shader;
-import android.graphics.Shader.TileMode;
-
-/**
- * Drawable to render a popup window with a frame.
- *
- */
-public class PopUpFrameWindowDrawable extends BaseBackgroundDrawable {
-
-  private final int frameWidth;
-
-  private final int topColor;
-  private final int bottomColor;
-  private final int borderColor;
-  private final int innerPaneColor;
-  private final float shadowSize;
-
-  private final Rect outerFrameRect = new Rect();
-  private final Rect innerFrameRect = new Rect();
-  private final Paint paint = new Paint();
-  private final BlurMaskFilter blurMaskFilter;
-  private Optional<Shader> shader = Optional.absent();
-
-  public PopUpFrameWindowDrawable(
-      int leftPadding, int topPadding, int rightPadding, int bottomPadding,
-      int frameWidth, float shadowSize,
-      int topColor, int bottomColor, int borderColor, int innerPaneColor) {
-    super(leftPadding, topPadding, rightPadding, bottomPadding);
-
-    this.frameWidth = frameWidth;
-    this.topColor = topColor;
-    this.bottomColor = bottomColor;
-    this.borderColor = borderColor;
-    this.innerPaneColor = innerPaneColor;
-    this.shadowSize = shadowSize;
-    this.blurMaskFilter = new BlurMaskFilter(shadowSize, Blur.INNER);
-  }
-
-  @Override
-  public void draw(Canvas canvas) {
-    if (isCanvasRectEmpty()) {
-      return;
-    }
-
-    Paint paint = this.paint;
-
-    // First of all, render the shadow.
-    paint.reset();
-    paint.setAntiAlias(true);
-    paint.setColor(0x80000000);
-    paint.setShadowLayer(shadowSize * 0.6f, shadowSize, shadowSize, 0xFF404040);
-    canvas.drawRect(outerFrameRect, paint);
-
-    // Draw the main part of the frame.
-    if (shader.isPresent()) {
-      paint.reset();
-      paint.setAntiAlias(true);
-      paint.setShader(shader.get());
-      canvas.drawRect(outerFrameRect, paint);
-    }
-
-    // Draw the inner pane.
-    paint.reset();
-    paint.setAntiAlias(true);
-    paint.setColor(0xFF000000);
-    canvas.drawRect(innerFrameRect, paint);
-
-    paint.setColor(innerPaneColor);
-    paint.setMaskFilter(blurMaskFilter);
-    canvas.drawRect(innerFrameRect, paint);
-
-    // Draw the border.
-    paint.reset();
-    paint.setAntiAlias(true);
-    paint.setColor(borderColor);
-    paint.setStyle(Style.STROKE);
-
-    canvas.drawRect(outerFrameRect, paint);
-    canvas.drawRect(innerFrameRect, paint);
-  }
-
-  @Override
-  protected void onBoundsChange(Rect bounds) {
-    super.onBoundsChange(bounds);
-
-    Rect canvasRect = getCanvasRect();
-
-    outerFrameRect.set(canvasRect);
-    innerFrameRect.set(
-        canvasRect.left + frameWidth, canvasRect.top + frameWidth,
-        canvasRect.right - frameWidth, canvasRect.bottom - frameWidth);
-    shader = Optional.<Shader>of(new LinearGradient(
-        0, canvasRect.top, 0, canvasRect.bottom, topColor, bottomColor, TileMode.CLAMP));
-  }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java
new file mode 100644
index 0000000..66012f0
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java
@@ -0,0 +1,57 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import android.graphics.Rect;
+
+/** The space key implementation for qwerty keyboards. */
+public class QwertySpaceKeyDrawable extends RoundRectKeyDrawable {
+  private static final int UNLIMITED_HEIGHT = 0;
+  private final int height;
+
+  public QwertySpaceKeyDrawable(
+      int height, int leftPadding, int topPadding, int rightPadding, int bottomPadding,
+      int roundSize, int topColor, int bottomColor, int highlightColor, int shadowColor) {
+    super(leftPadding, topPadding, rightPadding, bottomPadding,
+          roundSize, topColor, bottomColor, highlightColor, shadowColor);
+    this.height = height;
+  }
+
+  @Override
+  protected void onBoundsChange(Rect bounds) {
+    if (height != UNLIMITED_HEIGHT && bounds.height() > height) {
+      int topPadding = (bounds.height() - height) / 2;
+      int bottomPadding = (bounds.height() - height) - topPadding;
+      bounds = new Rect(bounds.left, bounds.top + topPadding,
+                        bounds.right, bounds.bottom - bottomPadding);
+    }
+    super.onBoundsChange(bounds);
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
index 49fe76c..81c4cab 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
@@ -34,6 +34,7 @@
 import android.graphics.BlurMaskFilter;
 import android.graphics.BlurMaskFilter.Blur;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.LinearGradient;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
@@ -55,7 +56,7 @@
   private final int bottomColor;
 
   private final Paint basePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint shadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+  private final Optional<Paint> shadowPaint;
   private final Optional<Paint> highlightPaint;
 
   private final RectF baseBound = new RectF();
@@ -69,10 +70,15 @@
     this.topColor = topColor;
     this.bottomColor = bottomColor;
 
-    shadowPaint.setColor(shadowColor);
-    shadowPaint.setStyle(Style.FILL);
-    shadowPaint.setMaskFilter(new BlurMaskFilter(BLUR_SIZE, Blur.NORMAL));
-    if ((highlightColor & 0xFF000000) != 0) {
+    if (Color.alpha(shadowColor) != 0) {
+      shadowPaint = Optional.of(new Paint(Paint.ANTI_ALIAS_FLAG));
+      shadowPaint.get().setColor(shadowColor);
+      shadowPaint.get().setStyle(Style.FILL);
+      shadowPaint.get().setMaskFilter(new BlurMaskFilter(BLUR_SIZE, Blur.NORMAL));
+    } else {
+      shadowPaint = Optional.absent();
+    }
+    if (Color.alpha(highlightColor) != 0) {
       highlightPaint = Optional.of(new Paint(Paint.ANTI_ALIAS_FLAG));
       highlightPaint.get().setColor(highlightColor);
     } else {
@@ -87,7 +93,9 @@
     }
 
     // Each qwerty key looks round corner'ed rectangle.
-    canvas.drawRoundRect(shadowBound, roundSize, roundSize, shadowPaint);
+    if (shadowPaint.isPresent()) {
+      canvas.drawRoundRect(shadowBound, roundSize, roundSize, shadowPaint.get());
+    }
     canvas.drawRoundRect(baseBound, roundSize, roundSize, basePaint);
 
     // Draw 1-px height highlight at the top of key if necessary.
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java b/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java
new file mode 100644
index 0000000..1e8fc74
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java
@@ -0,0 +1,336 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.drawable.Drawable;
+
+
+/**
+ * Skin data.
+ */
+public class Skin {
+
+  private static final Skin FALLBACK_INSTANCE = new Skin();
+
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_MAIN = 0;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE = 1;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE_LIGHT = 2;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_BOUND = 5;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION = 6;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE = 7;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION = 8;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 9;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_ENTER = 10;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_ENTER_CIRCLE = 11;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 12;
+  @VisibleForTesting static final int STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 13;
+  @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR = 14;
+  @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 15;
+  @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE = 16;
+  @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MINOR = 17;
+  @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 18;
+  @VisibleForTesting
+  static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT = 19;
+  @VisibleForTesting
+  static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED = 20;
+
+  public int keyboardSeparatorColor;
+  public int twelvekeysLayoutReleasedKeyTopColor;
+  public int twelvekeysLayoutReleasedKeyBottomColor;
+  public int twelvekeysLayoutReleasedKeyHighlightColor;
+  public int twelvekeysLayoutReleasedKeyLightShadeColor;
+  public int twelvekeysLayoutReleasedKeyDarkShadeColor;
+  public int twelvekeysLayoutReleasedKeyShadowColor;
+
+  public int twelvekeysLayoutPressedKeyTopColor;
+  public int twelvekeysLayoutPressedKeyBottomColor;
+  public int twelvekeysLayoutPressedKeyHighlightColor;
+  public int twelvekeysLayoutPressedKeyLightShadeColor;
+  public int twelvekeysLayoutPressedKeyDarkShadeColor;
+  public int twelvekeysLayoutPressedKeyShadowColor;
+
+  public int twelvekeysLayoutReleasedFunctionKeyTopColor;
+  public int twelvekeysLayoutReleasedFunctionKeyBottomColor;
+  public int twelvekeysLayoutReleasedFunctionKeyHighlightColor;
+  public int twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
+  public int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
+  public int twelvekeysLayoutReleasedFunctionKeyShadowColor;
+
+  public int twelvekeysLayoutPressedFunctionKeyTopColor;
+  public int twelvekeysLayoutPressedFunctionKeyBottomColor;
+  public int twelvekeysLayoutPressedFunctionKeyHighlightColor;
+  public int twelvekeysLayoutPressedFunctionKeyLightShadeColor;
+  public int twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
+  public int twelvekeysLayoutPressedFunctionKeyShadowColor;
+
+  public int qwertyLayoutReleasedKeyTopColor;
+  public int qwertyLayoutReleasedKeyBottomColor;
+  public int qwertyLayoutReleasedKeyHighlightColor;
+  public int qwertyLayoutReleasedKeyShadowColor;
+
+  public int qwertyLayoutPressedKeyTopColor;
+  public int qwertyLayoutPressedKeyBottomColor;
+  public int qwertyLayoutPressedKeyHighlightColor;
+  public int qwertyLayoutPressedKeyShadowColor;
+
+  public int qwertyLayoutReleasedFunctionKeyTopColor;
+  public int qwertyLayoutReleasedFunctionKeyBottomColor;
+  public int qwertyLayoutReleasedFunctionKeyHighlightColor;
+  public int qwertyLayoutReleasedFunctionKeyShadowColor;
+
+  public int qwertyLayoutPressedFunctionKeyTopColor;
+  public int qwertyLayoutPressedFunctionKeyBottomColor;
+  public int qwertyLayoutPressedFunctionKeyHighlightColor;
+  public int qwertyLayoutPressedFunctionKeyShadowColor;
+
+  public int qwertyLayoutReleasedSpaceKeyTopColor;
+  public int qwertyLayoutReleasedSpaceKeyBottomColor;
+  public int qwertyLayoutReleasedSpaceKeyHighlightColor;
+  public int qwertyLayoutReleasedSpaceKeyShadowColor;
+
+  public int qwertyLayoutPressedSpaceKeyTopColor;
+  public int qwertyLayoutPressedSpaceKeyBottomColor;
+  public int qwertyLayoutPressedSpaceKeyHighlightColor;
+  public int qwertyLayoutPressedSpaceKeyShadowColor;
+
+  public int flickBaseColor;
+  public int flickShadeColor;
+
+  public int popupFrameWindowTopColor;
+  public int popupFrameWindowBottomColor;
+  public int popupFrameWindowShadowColor;
+
+  public int candidateScrollBarTopColor;
+  public int candidateScrollBarBottomColor;
+  public int candidateBackgroundTopColor;
+  public int candidateBackgroundBottomColor;
+  public int candidateBackgroundSeparatorColor;
+  public int candidateBackgroundHighlightColor;
+  public int candidateBackgroundBorderColor;
+  public int candidateBackgroundFocusedTopColor;
+  public int candidateBackgroundFocusedBottomColor;
+  public int candidateBackgroundFocusedShadowColor;
+
+  public int symbolReleasedFunctionKeyTopColor;
+  public int symbolReleasedFunctionKeyBottomColor;
+  public int symbolReleasedFunctionKeyHighlightColor;
+  public int symbolReleasedFunctionKeyShadowColor;
+
+  public int symbolPressedFunctionKeyTopColor;
+  public int symbolPressedFunctionKeyBottomColor;
+  public int symbolPressedFunctionKeyHighlightColor;
+  public int symbolPressedFunctionKeyShadowColor;
+
+  public int symbolScrollBarTopColor;
+  public int symbolScrollBarBottomColor;
+
+  public int symbolMinorCategoryTabSelectedColor;
+  public int symbolMinorCategoryTabPressedColor;
+
+  public int symbolCandidateBackgroundTopColor;
+  public int symbolCandidateBackgroundBottomColor;
+  public int symbolCandidateBackgroundHighlightColor;
+  public int symbolCandidateBackgroundBorderColor;
+  public int symbolCandidateBackgroundSeparatorColor;
+  public int symbolMinorCategoryVerticalSeparatorColor;
+  public int symbolSeparatorColor;
+
+  public int threeDotsColor;
+
+  public int keyIconMainColor;
+  public int keyIconGuideColor;
+  public int keyIconGuideLightColor;
+  public int keyIconMainHighlightColor;
+  public int keyIconGuideHighlightColor;
+  public int keyIconBoundColor;
+  public int keyIconTwelvekeysFunctionColor;
+  public int keyIconTwelvekeysGlobeColor;
+  public int keyIconQwertyFunctionColor;
+  public int keyIconFunctionDarkColor;
+  public int keyIconEnterColor;
+  public int keyIconEnterCircleColor;
+  public int keyIconQwertyShiftOnArrowColor;
+  public int keyPopupHighlightColor;
+  public int symbolMajorColor;
+  public int symbolMajorSelectedColor;
+  public int symbolMinorColor;
+  public int symbolMinorSelectedColor;
+  public int symbolMajorButtonTopColor;
+  public int symbolMajorButtonBottomColor;
+  public int symbolMajorButtonPressedTopColor;
+  public int symbolMajorButtonPressedBottomColor;
+  public int symbolMajorButtonSelectedTopColor;
+  public int symbolMajorButtonSelectedBottomColor;
+  public int symbolMajorButtonShadowColor;
+  public int keyboardFoldingButtonBackgroundDefaultColor;
+  public int keyboardFoldingButtonBackgroundScrolledColor;
+  public int candidateValueTextColor = Color.BLACK;
+  public int candidateValueFocusedTextColor = Color.BLACK;
+  public int candidateDescriptionTextColor = Color.GRAY;
+  public int buttonFrameButtonPressedColor;
+
+  public float twelvekeysLeftOffsetDimension;
+  public float twelvekeysRightOffsetDimension;
+  public float twelvekeysTopOffsetDimension;
+  public float twelvekeysBottomOffsetDimension;
+  public float qwertyLeftOffsetDimension;
+  public float qwertyRightOffsetDimension;
+  public float qwertyTopOffsetDimension;
+  public float qwertyBottomOffsetDimension;
+  public float qwertyRoundRadiusDimension;
+  public float qwertySpaceKeyHeightDimension;
+  public float qwertySpaceKeyHorizontalOffsetDimension;
+  public float qwertySpaceKeyRoundRadiusDimension;
+  public float symbolMajorButtonRoundDimension;
+  public float symbolMajorButtonPaddingDimension;
+  public float symbolMinorIndicatorHeightDimension;
+
+  public Drawable buttonFrameBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable narrowFrameBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable keyboardFrameSeparatorBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable symbolSeparatorAboveMajorCategoryBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable windowBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable conversionCandidateViewBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable symbolCandidateViewBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable symbolMajorCategoryBackgroundDrawable = DummyDrawable.getInstance();
+  public Drawable scrollBarBackgroundDrawable = DummyDrawable.getInstance();
+
+  private Optional<MozcDrawableFactory> drawableFactory = Optional.absent();
+
+  public static Skin getFallbackInstance() {
+    return FALLBACK_INSTANCE;
+  }
+
+  public void apply(Paint paint, int category) {
+    Preconditions.checkNotNull(paint);
+
+    // At the moment, caller has responsibility to reset paint.
+    // TODO(matsuzakit): move all style based logic from MozcDrawableFactory to here.
+    paint.setStyle(Style.FILL);
+    switch (category) {
+      case STYLE_CATEGORY_KEYICON_MAIN:
+        paint.setColor(keyIconMainColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_GUIDE:
+        paint.setColor(keyIconGuideColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
+        paint.setColor(keyIconGuideLightColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
+        paint.setColor(keyIconMainHighlightColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
+        paint.setColor(keyIconGuideHighlightColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_BOUND:
+        paint.setColor(keyIconBoundColor);
+        paint.setStyle(Style.STROKE);
+        break;
+      case STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION:
+        paint.setColor(keyIconTwelvekeysFunctionColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE:
+        paint.setColor(keyIconTwelvekeysGlobeColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION:
+        paint.setColor(keyIconQwertyFunctionColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
+        paint.setColor(keyIconFunctionDarkColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_ENTER:
+        paint.setColor(keyIconEnterColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_ENTER_CIRCLE:
+        paint.setColor(keyIconEnterCircleColor);
+        break;
+      case STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
+        paint.setColor(keyIconQwertyShiftOnArrowColor);
+        break;
+      case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
+        paint.setColor(keyPopupHighlightColor);
+        break;
+      case STYLE_CATEGORY_SYMBOL_MAJOR:
+        paint.setColor(symbolMajorColor);
+        break;
+      case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
+        paint.setColor(symbolMajorSelectedColor);
+        break;
+      case STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE:
+        paint.setStyle(Style.STROKE);
+        paint.setColor(symbolMajorColor);
+        paint.setStrokeWidth(0.75f);
+        paint.setStrokeMiter(10);
+        break;
+      case STYLE_CATEGORY_SYMBOL_MINOR:
+        paint.setColor(symbolMinorColor);
+        break;
+      case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
+        paint.setColor(symbolMinorSelectedColor);
+        break;
+      case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT:
+        paint.setColor(keyboardFoldingButtonBackgroundDefaultColor);
+        break;
+      case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED:
+        paint.setColor(keyboardFoldingButtonBackgroundScrolledColor);
+        break;
+      default:
+        throw new IllegalStateException("Unknown category: " + category);
+    }
+  }
+
+  public Drawable getDrawable(Resources resources, int resourceId) {
+    Preconditions.checkNotNull(resources);
+    return getDrawableFactory(resources).getDrawable(resourceId).or(DummyDrawable.getInstance());
+  }
+
+  private MozcDrawableFactory getDrawableFactory(Resources resources) {
+    if (!drawableFactory.isPresent()) {
+      drawableFactory = Optional.of(new MozcDrawableFactory(resources, this));
+    }
+    return drawableFactory.get();
+  }
+
+  @VisibleForTesting
+  void resetDrawableFactory() {
+    drawableFactory = Optional.absent();
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java b/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java
new file mode 100644
index 0000000..4758e4d
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java
@@ -0,0 +1,229 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.ParserUtil;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Parses .xml file for skin and generates {@code Skin} instance.
+ */
+public class SkinParser {
+
+  static class SkinParserException extends Exception {
+
+    public SkinParserException(XmlPullParser parser, Throwable throwable) {
+      super(composeMessage(parser, throwable.getLocalizedMessage()), throwable);
+    }
+
+    public SkinParserException(XmlPullParser parser, String detailMessage) {
+      super(composeMessage(parser, detailMessage));
+    }
+
+    private static String composeMessage(XmlPullParser parser, String message) {
+      return new StringBuffer(parser.getPositionDescription())
+          .append(':').append(message).toString();
+    }
+  }
+
+  private final XmlResourceParser parser;
+  private final Resources resources;
+
+  private static final int[] COLOR_ATTRIBUTES = {
+    android.R.attr.name,
+    android.R.attr.color,
+  };
+  static {
+    Arrays.sort(COLOR_ATTRIBUTES);
+  }
+  private static final int COLOR_KEY_NAME_INDEX =
+      Arrays.binarySearch(COLOR_ATTRIBUTES, android.R.attr.name);
+  private static final int COLOR_KEY_COLOR_INDEX =
+      Arrays.binarySearch(COLOR_ATTRIBUTES, android.R.attr.color);
+
+  private static final int[] DRAWABLE_ATTRIBUTES = {
+    android.R.attr.name,
+  };
+  private static final int DRAWABLE_KEY_NAME_INDEX =
+      Arrays.binarySearch(DRAWABLE_ATTRIBUTES, android.R.attr.name);
+
+  private static final int[] DIMENSION_ATTRIBUTES = {
+    android.R.attr.name,
+    R.attr.dimension,
+  };
+  static {
+    Arrays.sort(DIMENSION_ATTRIBUTES);
+  }
+  private static final int DIMENSION_KEY_NAME_INDEX =
+      Arrays.binarySearch(DIMENSION_ATTRIBUTES, android.R.attr.name);
+  private static final int DIMENSION_KEY_DIMENSION_INDEX =
+      Arrays.binarySearch(DIMENSION_ATTRIBUTES, R.attr.dimension);
+
+  public SkinParser(Resources resources, XmlResourceParser parser) {
+    this.resources = Preconditions.checkNotNull(resources);
+    this.parser = Preconditions.checkNotNull(parser);
+  }
+
+  private static final Map<String, Field> fieldMap;
+  static {
+    Map<String, Field> tempMap = Maps.newHashMapWithExpectedSize(Skin.class.getFields().length);
+    for (Field field : Skin.class.getFields()) {
+      tempMap.put(field.getName(), field);
+    }
+    fieldMap = Collections.unmodifiableMap(tempMap);
+  }
+
+  public Skin parseSkin() throws SkinParserException {
+    XmlResourceParser parser = this.parser;
+    Skin skin = new Skin();
+    AttributeSet attributeSet = Xml.asAttributeSet(parser);
+
+    try {
+      // Initial two events should be START_DOCUMENT and then START_TAG.
+      parser.next();
+      ParserUtil.assertStartDocument(parser);
+      parser.nextTag();
+      if (!"Skin".equals(parser.getName())) {
+        throw new SkinParserException(parser,
+            "<Skin> element is expected but met <" + parser.getName() + ">");
+      }
+
+      while (parser.nextTag() == XmlResourceParser.START_TAG) {
+        String tagName = parser.getName();
+        if ("Color".equals(tagName)) {
+          TypedArray attributes = resources.obtainAttributes(parser, COLOR_ATTRIBUTES);
+          try {
+            String name = attributes.getString(COLOR_KEY_NAME_INDEX);
+            if (name == null) {
+              throw new SkinParserException(parser,
+                                            "<Color> element's \"name\" attribute is mandatory.");
+            }
+            int color = attributes.getColor(COLOR_KEY_COLOR_INDEX, 0);
+            Field field = fieldMap.get(name);
+            if (field == null) {
+              throw new SkinParserException(parser, name + " is undefined field.");
+            }
+            field.setInt(skin, color);
+            if (parser.nextTag() != XmlResourceParser.END_TAG) {
+              throw new SkinParserException(parser, "</Color> is expected but not found.");
+            }
+          } finally {
+            attributes.recycle();
+          }
+          continue;
+        }
+        if ("Drawable".equals(tagName)) {
+          TypedArray attributes = resources.obtainAttributes(parser, DRAWABLE_ATTRIBUTES);
+          try {
+            String name = attributes.getString(DRAWABLE_KEY_NAME_INDEX);
+            if (name == null) {
+              throw new SkinParserException(parser,
+                  "<Drawable> element's \"name\" attribute is mandatory.");
+            }
+            // Go forward to inner drawable tag.
+            if (parser.nextTag() != XmlResourceParser.START_TAG) {
+              throw new SkinParserException(parser, "Start tag for drawable is expected.");
+            }
+            Drawable drawable = Drawable.createFromXmlInner(resources, parser, attributeSet);
+            if (drawable == null) {
+              throw new SkinParserException(parser, "Invalid drawable.");
+            }
+            if (parser.nextTag() != XmlResourceParser.END_TAG) {
+              throw new SkinParserException(parser, "End tag for drawable is expected.");
+            }
+            Field field = fieldMap.get(name);
+            if (field == null) {
+              throw new SkinParserException(parser, name + " is undefined field.");
+            }
+            field.set(skin, drawable);
+            if (parser.nextTag() != XmlResourceParser.END_TAG) {  // Skip end tag.
+              throw new SkinParserException(parser, "</Drawable> is expected but not found.");
+            }
+          } finally {
+            attributes.recycle();
+          }
+          continue;
+        }
+        if ("Dimension".equals(tagName)) {
+          TypedArray attributes = resources.obtainAttributes(parser, DIMENSION_ATTRIBUTES);
+          try {
+            String name = attributes.getString(DIMENSION_KEY_NAME_INDEX);
+            if (name == null) {
+              throw new SkinParserException(parser,
+                  "<Dimension> element's \"name\" attribute is mandatory.");
+            }
+            float dimension = attributes.getDimension(DIMENSION_KEY_DIMENSION_INDEX, 0);
+            Field field = fieldMap.get(name);
+            if (field == null) {
+              throw new SkinParserException(parser, name + " is undefined field.");
+            }
+            field.setFloat(skin, dimension);
+            if (parser.nextTag() != XmlResourceParser.END_TAG) {
+              throw new SkinParserException(parser, "</Dimension> is expected but not found.");
+            }
+          } finally {
+            attributes.recycle();
+          }
+          continue;
+        }
+        throw new SkinParserException(parser, "Unexpected <" + tagName + "> is found.");
+      }
+      parser.next();
+      ParserUtil.assertEndDocument(parser);
+    } catch (IllegalAccessException e) {
+      throw new SkinParserException(parser, e);
+    } catch (IllegalArgumentException e) {
+      throw new SkinParserException(parser, e);
+    } catch (XmlPullParserException e) {
+      throw new SkinParserException(parser, e);
+    } catch (IOException e) {
+      throw new SkinParserException(parser, e);
+    }
+    return skin;
+  }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java b/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
index 8919ea2..8f27307 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
@@ -29,765 +29,48 @@
 
 package org.mozc.android.inputmethod.japanese.view;
 
+import org.mozc.android.inputmethod.japanese.MozcLog;
 import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.SkinParser.SkinParserException;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
+import android.content.res.Resources;
 
 /**
  * Type of skins.
  */
 public enum SkinType {
-  ORANGE_LIGHTGRAY(
-      // 12keys layout regular released key config.
-      0xFFF5F5F5, 0xFFD2D2D2, 0xFFFAFAFA, 0xFFAFAFAF, 0xFF909090, 0xFF1E1E1E,
 
-      // 12keys layout regular pressed key config.
-      0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
-      // 12keys layout function released key config.
-      0xFF858087, 0xFF67645F, 0xFF898588, 0xFF5C5759, 0xFF555555, 0xFF1E1E1E,
-
-      // 12keys layout regular pressed key config.
-      0xFFBFBFBD, 0xFFF7F5EC, 0, 0, 0, 0,
-
-      // Qwerty layout regular released key config.
-      0xFFF5F5F5, 0xFFD2D2D2, 0, 0xFF1E1E1E,
-
-      // Qwerty layout regular pressed key config.
-      0xFFCCCCCC, 0xFF797979, 0, 0xFF1E1E1E,
-
-      // Qwerty layout function released key config.
-      0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
-      // Qwerty layout function pressed key config.
-      0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
-      // Flick color config.
-      // According to the original design mock, the base color is orange for now.
-      // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
-      0xFFFF9A28, 0xFFC0741e,
-
-      // Qwerty light on/off sign config.
-      0xFFFFCC00, 0xFFFF9900, 0xFFFF9966, 0xFF333333, 0xFF333333, 0xFF000000,
-
-      // Qwerty round coner radius.
-      3.5f,
-
-      // Framed popup window config.
-      0xFFFFB53A, 0xFFFF7A25, 0xFF793D00, 0xFFFFFFFF, 0,
-
-      // Candidate scroll indicator config.
-      0xFFFFE39D, 0xFFFFCC33,
-
-      // Candidate background config.
-      0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
-      // Candidate focused background config.
-      0xFFFFC142, 0xFFFFe096, 0x40000000,
-
-      // Symbol function released key config.
-      0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
-      // Symbol function pressed key config.
-      0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
-      // Symbol scroll indicator config.
-      0xFFFFCC00, 0xFFFF9C00,
-
-      // Symbol minor category tab config.
-      0xFFFF9200, 0x80FF9200,
-
-      // Symbol candidate background config.
-      0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
-      // Three dots
-      0xFFDDDDDD,
-
-      // Window background resource.
-      R.drawable.window__background) {
-    @Override
-    public void apply(Paint paint, int category) {
-      Preconditions.checkNotNull(paint);
-
-      // At the moment, caller has responsibility to reset paint.
-      // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
-      switch (category) {
-        case STYLE_CATEGORY_KEYICON_MAIN:
-        case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF272727);
-          break;
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          paint.setShadowLayer(0.5f, 0.f, -1.f, 0xFF404040);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE:
-        case STYLE_CATEGORY_SYMBOL_MAJOR:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF333333);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF999999);
-          break;
-        case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
-        case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
-        case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
-        case STYLE_CATEGORY_SYMBOL_MINOR:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          break;
-        case STYLE_CATEGORY_KEYICON_BOUND:
-          paint.setStyle(Style.STROKE);
-          paint.setColor(0xFFCCCCCC);
-          break;
-        case STYLE_CATEGORY_KEYICON_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFDDDDDD);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFB005);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFC1F300);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFF7982d);
-          break;
-        case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFF9a28);
-          break;
-        case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0x8C676767);
-          break;
-        default:
-          throw new IllegalStateException("Unknown category: " + category);
-      }
-    }
-  },
-
-  BLUE_LIGHTGRAY(
-      // 12keys layout regular released key config.
-      0xFFF5F5F5, 0xFFD2D2D2, 0xFFFAFAFA, 0xFFAFAFAF, 0xFF909090, 0xFF1E1E1E,
-
-      // 12keys layout regular pressed key config.
-      0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
-      // 12keys layout function released key config.
-      0xFF858087, 0xFF67645F, 0xFF898588, 0xFF5C5759, 0xFF555555, 0xFF1E1E1E,
-
-      // 12keys layout regular pressed key config.
-      0xFFBFBFBD, 0xFFF7F5EC, 0, 0, 0, 0,
-
-      // Qwerty layout regular released key config.
-      0xFFF5F5F5, 0xFFD2D2D2, 0, 0xFF1E1E1E,
-
-      // Qwerty layout regular pressed key config.
-      0xFFCCCCCC, 0xFF797979, 0, 0xFF1E1E1E,
-
-      // Qwerty layout function released key config.
-      0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
-      // Qwerty layout function pressed key config.
-      0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
-      // Flick color config.
-      // According to the original design mock, the base color is orange for now.
-      // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
-      0xFF55C6EE, 0xFF3F94B2,
-
-      // Qwerty light on/off sign config.
-      0xFF73DAF7, 0xFF3393E5, 0xFF53B6EE, 0xFF333333, 0xFF333333, 0xFF000000,
-
-      // Qwerty round coner radius.
-      3.5f,
-
-      // Framed popup window config.
-      0xFFFBFBFB, 0xFFEAEAEA, 0, 0, 0xFF1E1E1E,
-
-      // Candidate scroll indicator config.
-      0xFF73DAF7, 0xFF3393E5,
-
-      // Candidate background config.
-      0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
-      // Candidate focused background config.
-      0xFFA5DDF6, 0xFFC1E9F5, 0x40000000,
-
-      // Symbol function released key config.
-      0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
-      // Symbol function pressed key config.
-      0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
-      // Symbol scroll indicator config.
-      0xFF73DAF7, 0xFF53B6EE,
-
-      // Symbol minor category tab config.
-      0xFF33B5E5, 0x8033B5E5,
-
-      // Symbol candidate background config.
-      0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
-      // Three dots
-      0xFFDDDDDD,
-
-      // Window background resource.
-      R.drawable.window__background) {
-    @Override
-    public void apply(Paint paint, int category) {
-      Preconditions.checkNotNull(paint);
-
-      // At the moment, caller has responsibility to reset paint.
-      // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
-      switch (category) {
-        case STYLE_CATEGORY_KEYICON_MAIN:
-        case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF272727);
-          break;
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          paint.setShadowLayer(0.5f, 0.f, -1.f, 0xFF404040);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE:
-        case STYLE_CATEGORY_SYMBOL_MAJOR:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF333333);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF999999);
-          break;
-        case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
-        case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
-        case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
-        case STYLE_CATEGORY_SYMBOL_MINOR:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          break;
-        case STYLE_CATEGORY_KEYICON_BOUND:
-          paint.setStyle(Style.STROKE);
-          paint.setColor(0xFFCCCCCC);
-          break;
-        case STYLE_CATEGORY_KEYICON_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFDDDDDD);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF55C6EE);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFC1F300);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF57B8E5);
-          break;
-        case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF63CFFF);
-          break;
-        case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0x8C676767);
-          break;
-        default:
-          throw new IllegalStateException("Unknown category: " + category);
-      }
-    }
-  },
-
-  BLUE_DARKGRAY(
-      // 12keys layout regular released key config.
-      0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF535353, 0xFF535353, 0xFF1E1E1E,
-
-      // 12keys layout regular pressed key config.
-      0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
-      // 12keys layout function released key config.
-      0xFF222222, 0xFF222222, 0xFF535353, 0xFF000000, 0xFF000000, 0xFF1E1E1E,
-
-      // 12keys layout function pressed key config.
-      0xFF066696, 0xDD066696, 0, 0, 0, 0,
-
-      // Qwerty layout regular released key config.
-      0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF1E1E1E,
-
-      // Qwerty layout regular pressed key config.
-      0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
-      // Qwerty layout function released key config.
-      0xFF222222, 0xFF222222, 0xFF535353, 0xFF1E1E1E,
-
-      // Qwerty layout function pressed key config.
-      0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
-      // Flick color config.
-      // According to the original design mock, the base color is orange for now.
-      // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
-      0xFF1B78A3, 0xFF145A7A,
-
-      // Qwerty light on/off sign config.
-      0xFF73DAF7, 0xFF3393E5, 0xFF53B6EE, 0xFF333333, 0xFF333333, 0xFF000000,
-
-      // Qwerty round corner radius.
-      2.0f,
-
-      // Framed popup window config.
-      0xFF066696, 0xDD066696, 0, 0, 0xFF1E1E1E,
-
-      // Candidate scroll indicator config.
-      0xFF73DAF7, 0xFF3393E5,
-
-      // Candidate background config.
-      0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
-      // Candidate focused background config.
-      0xFFA5DDF6, 0xFFC1E9F5, 0x40000000,
-
-      // Symbol function released key config.
-      0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF1E1E1E,
-
-      // Symbol function pressed key config.
-      0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
-      // Symbol scroll indicator config.
-      0xFF73DAF7, 0xFF53B6EE,
-
-      // Symbol minor category tab config.
-      0xFF33B5E5, 0x8033B5E5,
-
-      // Symbol candidate background config.
-      0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
-      // Three dots
-      0xFFF7F7F7,
-
-      // Window background resource.
-      R.drawable.window_background_black) {
-    @Override
-    public void apply(Paint paint, int category) {
-      Preconditions.checkNotNull(paint);
-
-      // At the moment, caller has responsibility to reset paint.
-      // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
-      switch (category) {
-        case STYLE_CATEGORY_KEYICON_MAIN:
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          break;
-        case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF868686);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFBEBEBE);
-          break;
-        case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF999999);
-          break;
-        case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
-        case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
-        case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
-        case STYLE_CATEGORY_SYMBOL_MINOR:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFFFFFFF);
-          break;
-        case STYLE_CATEGORY_KEYICON_BOUND:
-          paint.setStyle(Style.STROKE);
-          paint.setColor(0xFFCCCCCC);
-          break;
-        case STYLE_CATEGORY_KEYICON_FUNCTION:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFF7F7F7);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF55C6EE);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFFC1F300);
-          paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
-          break;
-        case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF4DA7CF);
-          break;
-        case STYLE_CATEGORY_SYMBOL_MAJOR:
-        case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF333333);
-          break;
-        case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0xFF63CFFF);
-          break;
-        case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
-          paint.setStyle(Style.FILL);
-          paint.setColor(0x8C676767);
-          break;
-        default:
-          throw new IllegalStateException("Unknown category: " + category);
-      }
-    }
-  },
-
+  ORANGE_LIGHTGRAY(R.xml.skin_orange_lightgray),
+  BLUE_LIGHTGRAY(R.xml.skin_blue_lightgray),
+  BLUE_DARKGRAY(R.xml.skin_blue_darkgray),
+  MATERIAL_DESIGN_LIGHT(R.xml.skin_material_design_light),
+  MATERIAL_DESIGN_DARK(R.xml.skin_material_design_dark),
   // This is an instance for testing of skin support in some classes.
-  // TODO(hidehiko): remove this value when other skin types (described in above TODO)
-  // are supported.
-  TEST(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) {
-    @Override
-    public void apply(Paint paint, int category) {
-      // Do nothing.
-    }
-  }
+  // TODO(matsuzakit): No more required. Remove.
+  TEST(R.xml.skin_orange_lightgray)
   ;
 
-  public static final int STYLE_CATEGORY_KEYICON_MAIN = 0;
-  public static final int STYLE_CATEGORY_KEYICON_GUIDE = 1;
-  public static final int STYLE_CATEGORY_KEYICON_GUIDE_LIGHT = 2;
-  public static final int STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3;
-  public static final int STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4;
-  public static final int STYLE_CATEGORY_KEYICON_BOUND = 5;
-  public static final int STYLE_CATEGORY_KEYICON_FUNCTION = 6;
-  public static final int STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 7;
-  public static final int STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 8;
-  public static final int STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW = 9;
-  public static final int STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 10;
-  public static final int STYLE_CATEGORY_KEYICON_POPUP_FUNCTION = 11;
-  public static final int STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK = 12;
-  public static final int STYLE_CATEGORY_SYMBOL_MAJOR = 13;
-  public static final int STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 14;
-  public static final int STYLE_CATEGORY_SYMBOL_MINOR = 15;
-  public static final int STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 16;
-  public static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND = 17;
+  private Optional<Skin> skin = Optional.absent();
+  private final int resourceId;
 
-  public final int twelvekeysLayoutReleasedKeyTopColor;
-  public final int twelvekeysLayoutReleasedKeyBottomColor;
-  public final int twelvekeysLayoutReleasedKeyHighlightColor;
-  public final int twelvekeysLayoutReleasedKeyLightShadeColor;
-  public final int twelvekeysLayoutReleasedKeyDarkShadeColor;
-  public final int twelvekeysLayoutReleasedKeyShadowColor;
+  private SkinType(int resourceId) {
+    this.resourceId = resourceId;
+  }
 
-  public final int twelvekeysLayoutPressedKeyTopColor;
-  public final int twelvekeysLayoutPressedKeyBottomColor;
-  public final int twelvekeysLayoutPressedKeyHighlightColor;
-  public final int twelvekeysLayoutPressedKeyLightShadeColor;
-  public final int twelvekeysLayoutPressedKeyDarkShadeColor;
-  public final int twelvekeysLayoutPressedKeyShadowColor;
-
-  public final int twelvekeysLayoutReleasedFunctionKeyTopColor;
-  public final int twelvekeysLayoutReleasedFunctionKeyBottomColor;
-  public final int twelvekeysLayoutReleasedFunctionKeyHighlightColor;
-  public final int twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
-  public final int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
-  public final int twelvekeysLayoutReleasedFunctionKeyShadowColor;
-
-  public final int twelvekeysLayoutPressedFunctionKeyTopColor;
-  public final int twelvekeysLayoutPressedFunctionKeyBottomColor;
-  public final int twelvekeysLayoutPressedFunctionKeyHighlightColor;
-  public final int twelvekeysLayoutPressedFunctionKeyLightShadeColor;
-  public final int twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
-  public final int twelvekeysLayoutPressedFunctionKeyShadowColor;
-
-  public final int qwertyLayoutReleasedKeyTopColor;
-  public final int qwertyLayoutReleasedKeyBottomColor;
-  public final int qwertyLayoutReleasedKeyHighlightColor;
-  public final int qwertyLayoutReleasedKeyShadowColor;
-
-  public final int qwertyLayoutPressedKeyTopColor;
-  public final int qwertyLayoutPressedKeyBottomColor;
-  public final int qwertyLayoutPressedKeyHighlightColor;
-  public final int qwertyLayoutPressedKeyShadowColor;
-
-  public final int qwertyLayoutReleasedFunctionKeyTopColor;
-  public final int qwertyLayoutReleasedFunctionKeyBottomColor;
-  public final int qwertyLayoutReleasedFunctionKeyHighlightColor;
-  public final int qwertyLayoutReleasedFunctionKeyShadowColor;
-
-  public final int qwertyLayoutPressedFunctionKeyTopColor;
-  public final int qwertyLayoutPressedFunctionKeyBottomColor;
-  public final int qwertyLayoutPressedFunctionKeyHighlightColor;
-  public final int qwertyLayoutPressedFunctionKeyShadowColor;
-
-  public final int flickBaseColor;
-  public final int flickShadeColor;
-
-  public final int qwertyLightOnSignLightColor;
-  public final int qwertyLightOnSignDarkColor;
-  public final int qwertyLightOnSignShadeColor;
-
-  public final int qwertyLightOffSignLightColor;
-  public final int qwertyLightOffSignDarkColor;
-  public final int qwertyLightOffSignShadeColor;
-
-  public final float qwertyKeyRoundRadius;
-
-  public final int popupFrameWindowTopColor;
-  public final int popupFrameWindowBottomColor;
-  public final int popupFrameWindowBorderColor;
-  public final int popupFrameWindowInnerPaneColor;
-  public final int popupFrameWindowShadowColor;
-
-  public final int candidateScrollBarTopColor;
-  public final int candidateScrollBarBottomColor;
-  public final int candidateBackgroundTopColor;
-  public final int candidateBackgroundBottomColor;
-  public final int candidateBackgroundHighlightColor;
-  public final int candidateBackgroundBorderColor;
-  public final int candidateBackgroundFocusedTopColor;
-  public final int candidateBackgroundFocusedBottomColor;
-  public final int candidateBackgroundFocusedShadowColor;
-
-  public final int symbolReleasedFunctionKeyTopColor;
-  public final int symbolReleasedFunctionKeyBottomColor;
-  public final int symbolReleasedFunctionKeyHighlightColor;
-  public final int symbolReleasedFunctionKeyShadowColor;
-
-  public final int symbolPressedFunctionKeyTopColor;
-  public final int symbolPressedFunctionKeyBottomColor;
-  public final int symbolPressedFunctionKeyHighlightColor;
-  public final int symbolPressedFunctionKeyShadowColor;
-
-  public final int symbolScrollBarTopColor;
-  public final int symbolScrollBarBottomColor;
-
-  public final int symbolMinorCategoryTabSelectedColor;
-  public final int symbolMinorCategoryTabPressedColor;
-
-  public final int symbolCandidateBackgroundTopColor;
-  public final int symbolCandidateBackgroundBottomColor;
-  public final int symbolCandidateBackgroundHighlightColor;
-  public final int symbolCandidateBackgroundBorderColor;
-
-  public final int threeDotsColor;
-
-  public final int windowBackgroundResourceId;
-
-  public abstract void apply(Paint paint, int category);
-
-  private SkinType(
-      int twelvekeysLayoutReleasedKeyTopColor,
-      int twelvekeysLayoutReleasedKeyBottomColor,
-      int twelvekeysLayoutReleasedKeyHighlightColor,
-      int twelvekeysLayoutReleasedKeyLightShadeColor,
-      int twelvekeysLayoutReleasedKeyDarkShadeColor,
-      int twelvekeysLayoutReleasedKeyShadowColor,
-      int twelvekeysLayoutPressedKeyTopColor,
-      int twelvekeysLayoutPressedKeyBottomColor,
-      int twelvekeysLayoutPressedKeyHighlightColor,
-      int twelvekeysLayoutPressedKeyLightShadeColor,
-      int twelvekeysLayoutPressedKeyDarkShadeColor,
-      int twelvekeysLayoutPressedKeyShadowColor,
-      int twelvekeysLayoutReleasedFunctionKeyTopColor,
-      int twelvekeysLayoutReleasedFunctionKeyBottomColor,
-      int twelvekeysLayoutReleasedFunctionKeyHighlightColor,
-      int twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
-      int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
-      int twelvekeysLayoutReleasedFunctionKeyShadowColor,
-      int twelvekeysLayoutPressedFunctionKeyTopColor,
-      int twelvekeysLayoutPressedFunctionKeyBottomColor,
-      int twelvekeysLayoutPressedFunctionKeyHighlightColor,
-      int twelvekeysLayoutPressedFunctionKeyLightShadeColor,
-      int twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
-      int twelvekeysLayoutPressedFunctionKeyShadowColor,
-      int qwertyLayoutReleasedKeyTopColor,
-      int qwertyLayoutReleasedKeyBottomColor,
-      int qwertyLayoutReleasedKeyHighlightColor,
-      int qwertyLayoutReleasedKeyShadowColor,
-      int qwertyLayoutPressedKeyTopColor,
-      int qwertyLayoutPressedKeyBottomColor,
-      int qwertyLayoutPressedKeyHighlightColor,
-      int qwertyLayoutPressedKeyShadowColor,
-      int qwertyLayoutReleasedFunctionKeyTopColor,
-      int qwertyLayoutReleasedFunctionKeyBottomColor,
-      int qwertyLayoutReleasedFunctionKeyHighlightColor,
-      int qwertyLayoutReleasedFunctionKeyShadowColor,
-      int qwertyLayoutPressedFunctionKeyTopColor,
-      int qwertyLayoutPressedFunctionKeyBottomColor,
-      int qwertyLayoutPressedFunctionKeyHighlightColor,
-      int qwertyLayoutPressedFunctionKeyShadowColor,
-      int flickBaseColor,
-      int flickShadeColor,
-      int qwertyLightOnSignLightColor,
-      int qwertyLightOnSignDarkColor,
-      int qwertyLightOnSignShadeColor,
-      int qwertyLightOffSignLightColor,
-      int qwertyLightOffSignDarkColor,
-      int qwertyLightOffSignShadeColor,
-      float qwertyKeyRoundRadius,
-      int popupFrameWindowTopColor,
-      int popupFrameWindowBottomColor,
-      int popupFrameWindowBorderColor,
-      int popupFrameWindowInnerPaneColor,
-      int popupFrameWindowShadowColor,
-      int candidateScrollBarTopColor,
-      int candidateScrollBarBottomColor,
-      int candidateBackgroundTopColor,
-      int candidateBackgroundBottomColor,
-      int candidateBackgroundHighlightColor,
-      int candidateBackgroundBorderColor,
-      int candidateBackgroundFocusedTopColor,
-      int candidateBackgroundFocusedBottomColor,
-      int candidateBackgroundFocusedShadowColor,
-      int symbolReleasedFunctionKeyTopColor,
-      int symbolReleasedFunctionKeyBottomColor,
-      int symbolReleasedFunctionKeyHighlightColor,
-      int symbolReleasedFunctionKeyShadowColor,
-      int symbolPressedFunctionKeyTopColor,
-      int symbolPressedFunctionKeyBottomColor,
-      int symbolPressedFunctionKeyHighlightColor,
-      int symbolPressedFunctionKeyShadowColor,
-      int symbolScrollBarTopColor,
-      int symbolScrollBarBottomColor,
-      int symbolMinorCategoryTabSelectedColor,
-      int symbolMinorCategoryTabPressedColor,
-      int symbolCandidateBackgroundTopColor,
-      int symbolCandidateBackgroundBottomColor,
-      int symbolCandidateBackgroundHighlightColor,
-      int symbolCandidateBackgroundBorderColor,
-      int threeDotsColor,
-      int windowBackgroundResourceId) {
-    this.twelvekeysLayoutReleasedKeyTopColor = twelvekeysLayoutReleasedKeyTopColor;
-    this.twelvekeysLayoutReleasedKeyBottomColor = twelvekeysLayoutReleasedKeyBottomColor;
-    this.twelvekeysLayoutReleasedKeyHighlightColor = twelvekeysLayoutReleasedKeyHighlightColor;
-    this.twelvekeysLayoutReleasedKeyLightShadeColor = twelvekeysLayoutReleasedKeyLightShadeColor;
-    this.twelvekeysLayoutReleasedKeyDarkShadeColor = twelvekeysLayoutReleasedKeyDarkShadeColor;
-    this.twelvekeysLayoutReleasedKeyShadowColor = twelvekeysLayoutReleasedKeyShadowColor;
-
-    this.twelvekeysLayoutPressedKeyTopColor = twelvekeysLayoutPressedKeyTopColor;
-    this.twelvekeysLayoutPressedKeyBottomColor = twelvekeysLayoutPressedKeyBottomColor;
-    this.twelvekeysLayoutPressedKeyHighlightColor = twelvekeysLayoutPressedKeyHighlightColor;
-    this.twelvekeysLayoutPressedKeyLightShadeColor = twelvekeysLayoutPressedKeyLightShadeColor;
-    this.twelvekeysLayoutPressedKeyDarkShadeColor = twelvekeysLayoutPressedKeyDarkShadeColor;
-    this.twelvekeysLayoutPressedKeyShadowColor = twelvekeysLayoutPressedKeyShadowColor;
-
-    this.twelvekeysLayoutReleasedFunctionKeyTopColor = twelvekeysLayoutReleasedFunctionKeyTopColor;
-    this.twelvekeysLayoutReleasedFunctionKeyBottomColor =
-        twelvekeysLayoutReleasedFunctionKeyBottomColor;
-    this.twelvekeysLayoutReleasedFunctionKeyHighlightColor =
-        twelvekeysLayoutReleasedFunctionKeyHighlightColor;
-    this.twelvekeysLayoutReleasedFunctionKeyLightShadeColor =
-        twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
-    this.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor =
-        twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
-    this.twelvekeysLayoutReleasedFunctionKeyShadowColor =
-        twelvekeysLayoutReleasedFunctionKeyShadowColor;
-
-    this.twelvekeysLayoutPressedFunctionKeyTopColor = twelvekeysLayoutPressedFunctionKeyTopColor;
-    this.twelvekeysLayoutPressedFunctionKeyBottomColor =
-        twelvekeysLayoutPressedFunctionKeyBottomColor;
-    this.twelvekeysLayoutPressedFunctionKeyHighlightColor =
-        twelvekeysLayoutPressedFunctionKeyHighlightColor;
-    this.twelvekeysLayoutPressedFunctionKeyLightShadeColor =
-        twelvekeysLayoutPressedFunctionKeyLightShadeColor;
-    this.twelvekeysLayoutPressedFunctionKeyDarkShadeColor =
-        twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
-    this.twelvekeysLayoutPressedFunctionKeyShadowColor =
-        twelvekeysLayoutPressedFunctionKeyShadowColor;
-
-    this.qwertyLayoutReleasedKeyTopColor = qwertyLayoutReleasedKeyTopColor;
-    this.qwertyLayoutReleasedKeyBottomColor = qwertyLayoutReleasedKeyBottomColor;
-    this.qwertyLayoutReleasedKeyHighlightColor = qwertyLayoutReleasedKeyHighlightColor;
-    this.qwertyLayoutReleasedKeyShadowColor = qwertyLayoutReleasedKeyShadowColor;
-
-    this.qwertyLayoutPressedKeyTopColor = qwertyLayoutPressedKeyTopColor;
-    this.qwertyLayoutPressedKeyBottomColor = qwertyLayoutPressedKeyBottomColor;
-    this.qwertyLayoutPressedKeyHighlightColor = qwertyLayoutPressedKeyHighlightColor;
-    this.qwertyLayoutPressedKeyShadowColor = qwertyLayoutPressedKeyShadowColor;
-
-    this.qwertyLayoutReleasedFunctionKeyTopColor = qwertyLayoutReleasedFunctionKeyTopColor;
-    this.qwertyLayoutReleasedFunctionKeyBottomColor = qwertyLayoutReleasedFunctionKeyBottomColor;
-    this.qwertyLayoutReleasedFunctionKeyHighlightColor =
-        qwertyLayoutReleasedFunctionKeyHighlightColor;
-    this.qwertyLayoutReleasedFunctionKeyShadowColor = qwertyLayoutReleasedFunctionKeyShadowColor;
-
-    this.qwertyLayoutPressedFunctionKeyTopColor = qwertyLayoutPressedFunctionKeyTopColor;
-    this.qwertyLayoutPressedFunctionKeyBottomColor = qwertyLayoutPressedFunctionKeyBottomColor;
-    this.qwertyLayoutPressedFunctionKeyHighlightColor =
-        qwertyLayoutPressedFunctionKeyHighlightColor;
-    this.qwertyLayoutPressedFunctionKeyShadowColor = qwertyLayoutPressedFunctionKeyShadowColor;
-
-    this.flickBaseColor = flickBaseColor;
-    this.flickShadeColor = flickShadeColor;
-
-    this.qwertyLightOnSignLightColor = qwertyLightOnSignLightColor;
-    this.qwertyLightOnSignDarkColor = qwertyLightOnSignDarkColor;
-    this.qwertyLightOnSignShadeColor = qwertyLightOnSignShadeColor;
-
-    this.qwertyLightOffSignLightColor = qwertyLightOffSignLightColor;
-    this.qwertyLightOffSignDarkColor = qwertyLightOffSignDarkColor;
-    this.qwertyLightOffSignShadeColor = qwertyLightOffSignShadeColor;
-
-    this.qwertyKeyRoundRadius = qwertyKeyRoundRadius;
-
-    this.popupFrameWindowTopColor = popupFrameWindowTopColor;
-    this.popupFrameWindowBottomColor = popupFrameWindowBottomColor;
-    this.popupFrameWindowBorderColor = popupFrameWindowBorderColor;
-    this.popupFrameWindowInnerPaneColor = popupFrameWindowInnerPaneColor;
-    this.popupFrameWindowShadowColor = popupFrameWindowShadowColor;
-
-    this.candidateScrollBarTopColor = candidateScrollBarTopColor;
-    this.candidateScrollBarBottomColor = candidateScrollBarBottomColor;
-    this.candidateBackgroundTopColor = candidateBackgroundTopColor;
-    this.candidateBackgroundBottomColor = candidateBackgroundBottomColor;
-    this.candidateBackgroundHighlightColor = candidateBackgroundHighlightColor;
-    this.candidateBackgroundBorderColor = candidateBackgroundBorderColor;
-    this.candidateBackgroundFocusedTopColor = candidateBackgroundFocusedTopColor;
-    this.candidateBackgroundFocusedBottomColor = candidateBackgroundFocusedBottomColor;
-    this.candidateBackgroundFocusedShadowColor = candidateBackgroundFocusedShadowColor;
-
-    this.symbolReleasedFunctionKeyTopColor = symbolReleasedFunctionKeyTopColor;
-    this.symbolReleasedFunctionKeyBottomColor = symbolReleasedFunctionKeyBottomColor;
-    this.symbolReleasedFunctionKeyHighlightColor = symbolReleasedFunctionKeyHighlightColor;
-    this.symbolReleasedFunctionKeyShadowColor = symbolReleasedFunctionKeyShadowColor;
-    this.symbolPressedFunctionKeyTopColor = symbolPressedFunctionKeyTopColor;
-    this.symbolPressedFunctionKeyBottomColor = symbolPressedFunctionKeyBottomColor;
-    this.symbolPressedFunctionKeyHighlightColor = symbolPressedFunctionKeyHighlightColor;
-    this.symbolPressedFunctionKeyShadowColor = symbolPressedFunctionKeyShadowColor;
-
-    this.symbolScrollBarTopColor = symbolScrollBarTopColor;
-    this.symbolScrollBarBottomColor = symbolScrollBarBottomColor;
-
-    this.symbolMinorCategoryTabSelectedColor = symbolMinorCategoryTabSelectedColor;
-    this.symbolMinorCategoryTabPressedColor = symbolMinorCategoryTabPressedColor;
-
-    this.symbolCandidateBackgroundTopColor = symbolCandidateBackgroundTopColor;
-    this.symbolCandidateBackgroundBottomColor = symbolCandidateBackgroundBottomColor;
-    this.symbolCandidateBackgroundHighlightColor = symbolCandidateBackgroundHighlightColor;
-    this.symbolCandidateBackgroundBorderColor = symbolCandidateBackgroundBorderColor;
-
-    this.threeDotsColor = threeDotsColor;
-
-    this.windowBackgroundResourceId = windowBackgroundResourceId;
+  public Skin getSkin(Resources resources) {
+    Preconditions.checkNotNull(resources);
+    if (skin.isPresent()) {
+      return skin.get();
+    }
+    SkinParser parser = new SkinParser(resources, resources.getXml(resourceId));
+    try {
+      skin = Optional.of(parser.parseSkin());
+    } catch (SkinParserException e) {
+      MozcLog.e(e.getLocalizedMessage());
+      skin = Optional.of(new Skin());  // Fall-back skin.
+    }
+    return skin.get();
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
index 2ed0987..133c648 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
@@ -34,6 +34,7 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
+import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.LinearGradient;
 import android.graphics.Paint;
@@ -57,20 +58,23 @@
   }
 
   private static class LeftButtonPathFactory implements PathFactory {
-
+    private final float padding;
     private final float round;
 
-    LeftButtonPathFactory(float round) {
+    // Padding is applied to left, top and bottom.
+    // Right doesn't have padding in order to center left/right buttons.
+    LeftButtonPathFactory(float padding, float round) {
+      this.padding = padding;
       this.round = round;
     }
 
     @Override
     public Path newInstance(Rect bounds) {
       Preconditions.checkNotNull(bounds);
-      float left = bounds.left;
-      float top = bounds.top;
+      float left = bounds.left + padding;
+      float top = bounds.top + padding;
       float right = bounds.right - 2;
-      float bottom = bounds.bottom - 1;
+      float bottom = bounds.bottom - 1 - padding;
 
       Path path = new Path();
       path.moveTo(right, bottom);
@@ -84,14 +88,20 @@
   }
 
   private static class CenterButtonPathFactory implements PathFactory {
+    private final float padding;
+
+    // Padding is applied only to top and bottom.
+    CenterButtonPathFactory(float padding) {
+      this.padding = padding;
+    }
 
     @Override
     public Path newInstance(Rect bounds) {
       Preconditions.checkNotNull(bounds);
       float left = bounds.left;
-      float top = bounds.top;
+      float top = bounds.top + padding;
       float right = bounds.right - 2;
-      float bottom = bounds.bottom - 1;
+      float bottom = bounds.bottom - 1 - padding;
 
       Path path = new Path();
       path.addRect(left, top, right, bottom, Direction.CW);
@@ -100,9 +110,13 @@
   }
 
   private static class RightButtonPathFactory implements PathFactory {
+    private final float padding;
     private final float round;
 
-    RightButtonPathFactory(float round) {
+    // Padding is applied to right, top and bottom.
+    // Left doesn't have padding in order to center left/right buttons.
+    RightButtonPathFactory(float padding, float round) {
+      this.padding = padding;
       this.round = round;
     }
 
@@ -110,9 +124,9 @@
     public Path newInstance(Rect bounds) {
       Preconditions.checkNotNull(bounds);
       float left = bounds.left;
-      float top = bounds.top;
-      float right = bounds.right - 1;
-      float bottom = bounds.bottom - 1;
+      float top = bounds.top + padding;
+      float right = bounds.right - 1 - padding;
+      float bottom = bounds.bottom - 1 - padding;
 
       Path path = new Path();
       path.moveTo(left, top);
@@ -190,10 +204,14 @@
 
   private static class EmojiDisableIconDrawable extends BaseBackgroundDrawable {
 
+    private final int size;
     private final Drawable sourceDrawable;
 
-    EmojiDisableIconDrawable(Drawable sourceDrawable) {
+    EmojiDisableIconDrawable(Resources resources, Drawable sourceDrawable) {
       super(0, 0, 0, 0);
+      size = Preconditions.checkNotNull(resources).getDimensionPixelSize(
+          R.dimen.symbol_major_emoji_disable_icon_height);
+      sourceDrawable.setBounds(0, 0, size, size);
       this.sourceDrawable = Preconditions.checkNotNull(sourceDrawable);
     }
 
@@ -201,9 +219,6 @@
     public void draw(Canvas canvas) {
       Rect bounds = getBounds();
 
-      // Heuristically, the size is 1/3 of the height.
-      int size = bounds.height() / 3;
-      sourceDrawable.setBounds(0, 0, size, size);
 
       int saveCount = canvas.save();
       try {
@@ -216,56 +231,55 @@
     }
   }
 
-  private final MozcDrawableFactory factory;
+  private Skin skin = Skin.getFallbackInstance();
 
-  private final int topColor;
-  private final int bottomColor;
-  private final int pressedTopColor;
-  private final int pressedBottomColor;
-  private final int shadowColor;
+  private final Resources resources;
 
-  private final PathFactory leftButtonPathFactory;
-  private final PathFactory centerButtonPathFactory;
-  private final PathFactory rightButtonPathFactory;
-
-  public SymbolMajorCategoryButtonDrawableFactory(
-      MozcDrawableFactory factory, int topColor, int bottomColor,
-      int pressedTopColor, int pressedBottomColor, int shadowColor,
-      float round) {
-    this.factory = Preconditions.checkNotNull(factory);
-    this.topColor = topColor;
-    this.bottomColor = bottomColor;
-    this.pressedTopColor = pressedTopColor;
-    this.pressedBottomColor = pressedBottomColor;
-    this.shadowColor = shadowColor;
-
-    this.leftButtonPathFactory = new LeftButtonPathFactory(round);
-    this.centerButtonPathFactory = new CenterButtonPathFactory();
-    this.rightButtonPathFactory = new RightButtonPathFactory(round);
+  public SymbolMajorCategoryButtonDrawableFactory(Resources resources) {
+    this.resources = Preconditions.checkNotNull(resources);
   }
 
   public Drawable createLeftButtonDrawable() {
-    return BackgroundDrawableFactory.createSelectableDrawable(
-        new ButtonDrawable(leftButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
-        new ButtonDrawable(leftButtonPathFactory, topColor, bottomColor, shadowColor));
+    return createSelectableDrawableWithPathFactory(
+        new LeftButtonPathFactory(skin.symbolMajorButtonPaddingDimension,
+                                  skin.symbolMajorButtonRoundDimension));
   }
 
   public Drawable createCenterButtonDrawable() {
-    return BackgroundDrawableFactory.createSelectableDrawable(
-        new ButtonDrawable(centerButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
-        new ButtonDrawable(centerButtonPathFactory, topColor, bottomColor, shadowColor));
+    return createSelectableDrawableWithPathFactory(
+        new CenterButtonPathFactory(skin.symbolMajorButtonPaddingDimension));
   }
 
   public Drawable createRightButtonDrawable(boolean emojiEnabled) {
-    Drawable drawable = BackgroundDrawableFactory.createSelectableDrawable(
-        new ButtonDrawable(rightButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
-        new ButtonDrawable(rightButtonPathFactory, topColor, bottomColor, shadowColor));
+    Drawable drawable = createSelectableDrawableWithPathFactory(
+        new RightButtonPathFactory(skin.symbolMajorButtonPaddingDimension,
+                                   skin.symbolMajorButtonRoundDimension));
     if (emojiEnabled) {
       return drawable;
     }
     return new LayerDrawable(new Drawable[] {
         drawable,
-        new EmojiDisableIconDrawable(factory.getDrawable(R.raw.emoji_disable_icon).orNull()),
+        new EmojiDisableIconDrawable(
+            resources, skin.getDrawable(resources, R.raw.emoji_disable_icon)),
     });
   }
+
+  private Drawable createSelectableDrawableWithPathFactory(PathFactory pathFactory) {
+    return BackgroundDrawableFactory.createSelectableDrawable(
+        new ButtonDrawable(pathFactory,
+                           skin.symbolMajorButtonSelectedTopColor,
+                           skin.symbolMajorButtonSelectedBottomColor, 0),
+        Optional.<Drawable>of(BackgroundDrawableFactory.createPressableDrawable(
+            new ButtonDrawable(pathFactory,
+                               skin.symbolMajorButtonPressedTopColor,
+                               skin.symbolMajorButtonPressedBottomColor, 0),
+            Optional.<Drawable>of(new ButtonDrawable(pathFactory,
+                                                     skin.symbolMajorButtonTopColor,
+                                                     skin.symbolMajorButtonBottomColor,
+                                                     skin.symbolMajorButtonShadowColor)))));
+  }
+
+  public void setSkin(Skin skin) {
+    this.skin = Preconditions.checkNotNull(skin);
+  }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
index c202471..23bd470 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
@@ -31,6 +31,7 @@
 
 import android.graphics.Canvas;
 import android.graphics.Paint;
+import android.graphics.Rect;
 
 /**
  * Selected tab highlight implementation.
@@ -54,6 +55,7 @@
     }
 
     // Paint the rectangle.
-    canvas.drawRect(0, 0, getBounds().right, highlightHeight, paint);
+    Rect bounds = getBounds();
+    canvas.drawRect(0, bounds.bottom - highlightHeight, bounds.right, bounds.bottom, paint);
   }
 }
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java
deleted file mode 100644
index ac626c7..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import com.google.common.base.Optional;
-
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Shader.TileMode;
-
-/**
- * Drawable for drop shadow on top and bottom of the boundary.
- */
-public class VerticalInnerDropShadowDrawable extends BaseBackgroundDrawable {
-
-  private final int shadowSize;
-  private Optional<LinearGradient> topShadow = Optional.absent();
-  private Optional<LinearGradient> bottomShadow = Optional.absent();
-  private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
-  public VerticalInnerDropShadowDrawable(
-      int leftPadding, int topPadding, int rightPadding, int bottomPadding,
-      int shadowSize) {
-    super(leftPadding, topPadding, rightPadding, bottomPadding);
-    this.shadowSize = shadowSize;
-  }
-
-  @Override
-  public void draw(Canvas canvas) {
-    if (isCanvasRectEmpty()) {
-      return;
-    }
-
-    Rect rect = getCanvasRect();
-    if (topShadow.isPresent()) {
-      paint.setShader(topShadow.get());
-      canvas.drawRect(rect, paint);
-    }
-
-    if (bottomShadow.isPresent()) {
-      paint.setShader(bottomShadow.get());
-      canvas.drawRect(rect, paint);
-    }
-  }
-
-  @Override
-  protected void onBoundsChange(Rect bounds) {
-    super.onBoundsChange(bounds);
-    if (isCanvasRectEmpty()) {
-      topShadow = Optional.absent();
-      bottomShadow = Optional.absent();
-      return;
-    }
-
-    Rect canvasRect = getCanvasRect();
-    topShadow = Optional.of(new LinearGradient(
-        0, canvasRect.top, 0, Math.min(canvasRect.bottom, canvasRect.top + shadowSize),
-        0xA6000000, 0x00000000, TileMode.CLAMP));
-    bottomShadow = Optional.of(new LinearGradient(
-        0, Math.max(canvasRect.top, canvasRect.bottom - shadowSize), 0, canvasRect.bottom,
-        0x00000000, 0xA6000000, TileMode.CLAMP));
-  }
-}
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-hdpi/application_icon.png
similarity index 100%
rename from src/android/static_resources/resources_oss/res/drawable-hdpi/application_icon.png
rename to src/android/static_resources/application_icon/oss_icon/drawable-hdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png
new file mode 100644
index 0000000..47689b6
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xhdpi/application_icon.png
similarity index 100%
rename from src/android/static_resources/resources_oss/res/drawable-xhdpi/application_icon.png
rename to src/android/static_resources/application_icon/oss_icon/drawable-xhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png
new file mode 100644
index 0000000..f3f3055
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png
new file mode 100644
index 0000000..2b6f59c
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml b/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml
new file mode 100644
index 0000000..0cf1ea8
--- /dev/null
+++ b/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <bool name="show_launcher_icon">false</bool>
+
+</resources>
diff --git a/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml b/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml
new file mode 100644
index 0000000..0675dd7
--- /dev/null
+++ b/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <bool name="show_launcher_icon">true</bool>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/AndroidManifest.xml b/src/android/static_resources/resources_oss/AndroidManifest.xml
deleted file mode 100644
index e391761..0000000
--- a/src/android/static_resources/resources_oss/AndroidManifest.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<manifest
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.mozc.android.inputmethod.japanese.resources">
-  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
-</manifest>
diff --git a/src/android/static_resources/resources_oss/project.properties b/src/android/static_resources/resources_oss/project.properties
deleted file mode 100644
index bc02349..0000000
--- a/src/android/static_resources/resources_oss/project.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2010-2014, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-19
-android.library=true
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
index 727894f..da1b4f1 100644
--- a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
index 990fc93..672aa8e 100644
--- a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png
new file mode 100644
index 0000000..1601d35
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
index 63f9978..3bedc40 100644
--- a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
+++ b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
index 484d244..fbfe3fc 100644
--- a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
+++ b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml
deleted file mode 100644
index 39f01ee..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-  <gradient android:startColor="@color/dropshadow_start"
-            android:endColor="@color/dropshadow_end"
-            android:angle="180" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml
deleted file mode 100644
index 97527b3..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-  <gradient android:startColor="@color/dropshadow_start"
-            android:endColor="@color/dropshadow_end"
-            android:angle="0" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml
deleted file mode 100644
index 4a4cc80..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-  <gradient android:startColor="@color/dropshadow_start"
-            android:endColor="@color/dropshadow_end"
-            android:angle="90" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/layout/button_frame.xml b/src/android/static_resources/resources_oss/res/layout/button_frame.xml
new file mode 100644
index 0000000..c72c400
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/layout/button_frame.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="end"
+    android:orientation="horizontal" >
+
+    <org.mozc.android.inputmethod.japanese.view.MozcImageView
+        android:id="@+id/microphone_button"
+        android:layout_width="@dimen/button_frame_button_width"
+        android:layout_height="@dimen/button_frame_button_height"
+        android:layout_marginEnd="2dip"
+        android:layout_gravity="center_vertical"
+        android:contentDescription="@string/cd_voice_input"
+        android:paddingEnd="5dip"
+        android:paddingStart="5dip"
+        android:soundEffectsEnabled="false"
+        mozc:rawSrc="@raw/microphone"
+        mozc:maxImageHeight="@dimen/button_frame_microphone_height"
+        android:visibility="gone" />
+
+</LinearLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/candidate_view.xml b/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
index 51080af..35b7dd6 100644
--- a/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
@@ -30,8 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- This file is a part of CandidateView so please maintain in parallel. -->
-<org.mozc.android.inputmethod.japanese.CandidateView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:background="@color/candidate_background" >
+<org.mozc.android.inputmethod.japanese.CandidateView xmlns:android="http://schemas.android.com/apk/res/android" >
 
     <LinearLayout
         android:id="@+id/candidate_word_frame"
@@ -63,7 +62,7 @@
                 android:layout_height="0dip"
                 class="org.mozc.android.inputmethod.japanese.CandidateView$ConversionCandidateWordView" />
 
-            <ToggleButton
+            <org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView
                 android:id="@+id/input_frame_fold_button"
                 android:layout_width="0dip"
                 android:layout_height="0dip"
@@ -72,6 +71,7 @@
                 android:minWidth="0dip"
                 android:textOff=""
                 android:textOn=""
+                android:soundEffectsEnabled="false"
                 android:contentDescription="@string/cd_keyboard_fold_button" />
         </view>
 
@@ -79,8 +79,7 @@
             android:id="@+id/candidate_scroll_guide_view"
             android:layout_width="@dimen/candidate_scrollbar_width"
             android:layout_height="fill_parent"
-            android:layout_weight="0"
-            android:background="@drawable/candidate__slidebar_background" />
+            android:layout_weight="0" />
     </LinearLayout>
 
 </org.mozc.android.inputmethod.japanese.CandidateView>
diff --git a/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml b/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
index ee64b84..9cff310 100644
--- a/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
+++ b/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
@@ -31,8 +31,7 @@
 -->
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/black" >
+    android:layout_height="wrap_content" >
 
     <LinearLayout
         android:layout_width="fill_parent"
diff --git a/src/android/static_resources/resources_oss/res/layout/left_frame.xml b/src/android/static_resources/resources_oss/res/layout/left_frame.xml
index eb569b1..e7afed0 100644
--- a/src/android/static_resources/resources_oss/res/layout/left_frame.xml
+++ b/src/android/static_resources/resources_oss/res/layout/left_frame.xml
@@ -36,59 +36,10 @@
     android:layout_gravity="right"
     android:visibility="gone" >
 
-    <FrameLayout
-        android:id="@+id/left_dropshadow"
-        android:layout_width="@dimen/translucent_border_height"
-        android:layout_height="fill_parent"
-        android:layout_gravity="bottom|right"
-        android:orientation="vertical" >
-
-        <LinearLayout
-            android:id="@+id/left_dropshadow_short"
-            android:layout_width="fill_parent"
-            android:layout_height="@dimen/input_frame_height_with_shadow"
-            android:layout_gravity="bottom"
-            android:orientation="vertical" >
-
-            <ImageView
-                android:id="@+id/dropshadow_left_short_top"
-                android:layout_width="fill_parent"
-                android:layout_height="@dimen/translucent_border_height" />
-
-            <ImageView
-                android:id="@+id/dropshadow_left_short_bottom"
-                android:layout_width="fill_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:background="@drawable/dropshadow_left" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/left_dropshadow_long"
-            android:layout_width="fill_parent"
-            android:layout_height="@dimen/ime_window_height"
-            android:layout_gravity="bottom"
-            android:orientation="vertical"
-            android:visibility="gone" >
-
-            <ImageView
-                android:id="@+id/dropshadow_left_long_top"
-                android:layout_width="fill_parent"
-                android:layout_height="@dimen/translucent_border_height" />
-
-            <ImageView
-                android:id="@+id/dropshadow_left_long_bottom"
-                android:layout_width="fill_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:background="@drawable/dropshadow_left" />
-        </LinearLayout>
-    </FrameLayout>
-
     <ImageView
         android:id="@+id/left_adjust_button"
         android:layout_width="@dimen/side_adjust_button_width"
         android:layout_height="@dimen/side_adjust_button_height"
         android:layout_gravity="bottom|right"
         android:layout_marginBottom="100dip" />
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/mozc_view.xml b/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
index 2d780b5..2825438 100644
--- a/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
@@ -30,7 +30,8 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- This file is a part of ViewManager so please maintain in parallel. -->
-<!-- MozcView hierarchy
+<!--
+MozcView hierarchy
 
 Syntax:
 "Type parent-id
@@ -44,213 +45,232 @@
   Linear-H: LinearLayout orientation=horizontal
   Image: ImageView
 
-MozcView(Linear-V)
-    View overlay_view
+MozcView(Frame)
+    Linear-V
+        View overlay_view
 
-    Frame bottom_frame
-        View bottom_background
+        Frame bottom_frame
+            View bottom_background
 
-        Linear-H foreground_frame
-            Frame left_frame
-                Frame left_dropshadow
-                    Linear left_dropshadow_short
-                        Image dropshadow_left_short_top
-                        Image dropshadow_left_short_bottom
-                    Linear left_dropshadow_long
-                        Image dropshadow_left_long_top
-                        Image dropshadow_left_long_bottom
-                Image left_adjust_botton
+            Linear-H foreground_frame
+                Frame left_frame
+                    Image left_adjust_botton
 
-            Linear-V center_frame
-                Image dropshadow_top
-                Frame input_frame
-                    Linear-V textinput_frame
-                        Frame
-                            CandidateView candidate_view
-                            Image dropshadow
+                Linear-V center_frame
+                    Frame input_frame
+                        Linear-V textinput_frame
+                            Frame
+                                Linear-H button_frame
+                                CandidateView candidate_view
 
-                        Frame narrow_frame
-                            Image hardware_composition_button
-                            Image widen_button
+                            NarrowFrameView narrow_frame
+                                View narrow_frame_separator
+                                Frame
+                                    Image hardware_composition_button
+                                    Image widen_button
 
-                        Frame keyboard_frame
-                            JapaneseKeyboardView keyboard_view
+                            Frame keyboard_frame
+                                JapaneseKeyboardView keyboard_view
 
-                    SymbolInputView symbol_input_view
+                        SymbolInputView symbol_input_view
 
-            Frame right_frame
-                Linear right_dropshadow
-                    Linear right_dropshadow_short
-                        Image dropshadow_right_short_top
-                        Image dropshadow_right_short_bottom
-                    Linear right_dropshadow_long
-                        Image dropshadow_right_long_top
-                        Image dropshadow_right_long_bottom
-                Image right_adjust_botton
-    -->
-<org.mozc.android.inputmethod.japanese.MozcView xmlns:android="http://schemas.android.com/apk/res/android"
+                Frame right_frame
+                    Image right_adjust_botton
+
+    FloatingCandidateView floating_candidate_view
+-->
+<org.mozc.android.inputmethod.japanese.MozcView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
-    android:layout_gravity="bottom"
-    android:gravity="bottom"
-    android:orientation="vertical"
     android:visibility="gone" >
-<!--
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom"
+        android:gravity="bottom"
+        android:orientation="vertical" >
+
+        <!--
          This invisible view overlays on target activity
          and makes a touchable region during candidate dragging.
-    -->
-
-    <View
-        android:id="@+id/overlay_view"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:visibility="invisible" />
-
-    <FrameLayout
-        android:id="@+id/bottom_frame"
-        android:layout_width="fill_parent"
-        android:layout_height="@dimen/ime_window_height"
-        android:gravity="bottom" >
-
+         TODO(hsumita): Remove overlay view if it is no longer necessary.
+        -->
         <View
-            android:id="@+id/bottom_background"
+            android:id="@+id/overlay_view"
             android:layout_width="fill_parent"
-            android:layout_height="@dimen/input_frame_height"
-            android:layout_gravity="bottom" />
+            android:layout_height="0dip"
+            android:layout_weight="1" />
 
-        <LinearLayout
-            android:id="@+id/foreground_frame"
+        <FrameLayout
+            android:id="@+id/bottom_frame"
             android:layout_width="fill_parent"
-            android:layout_height="fill_parent"
-            android:layout_gravity="bottom"
+            android:layout_height="@dimen/ime_window_height"
             android:gravity="bottom"
-            android:orientation="horizontal" >
+            android:layout_weight="0" >
 
-            <ViewStub
-                android:id="@+id/stub_left_frame"
-                android:inflatedId="@+id/left_frame"
-                android:layout="@layout/left_frame"
-                android:layout_width="@dimen/side_frame_width"
-                android:layout_height="fill_parent"
-                android:layout_gravity="right"
-                android:visibility="gone" />
+            <View
+                android:id="@+id/bottom_background"
+                android:layout_width="fill_parent"
+                android:layout_height="@dimen/input_frame_height"
+                android:layout_gravity="bottom" />
 
             <LinearLayout
-                android:id="@+id/center_frame"
-                android:layout_width="0dip"
-                android:layout_weight="1"
+                android:id="@+id/foreground_frame"
+                android:layout_width="fill_parent"
                 android:layout_height="fill_parent"
+                android:layout_gravity="bottom"
                 android:gravity="bottom"
-                android:orientation="vertical" >
+                android:orientation="horizontal" >
 
-                <ImageView
-                    android:id="@+id/dropshadow_top"
-                    android:layout_width="fill_parent"
-                    android:layout_height="@dimen/translucent_border_height"
-                    android:background="@drawable/dropshadow_top"
-                    android:visibility="invisible" />
-
-                <FrameLayout
-                    android:id="@+id/input_frame"
-                    android:layout_width="fill_parent"
+                <ViewStub
+                    android:id="@+id/stub_left_frame"
+                    android:layout_width="@dimen/side_frame_width"
                     android:layout_height="fill_parent"
-                    android:gravity="bottom" >
+                    android:layout_gravity="right"
+                    android:inflatedId="@+id/left_frame"
+                    android:layout="@layout/left_frame"
+                    android:visibility="gone" />
 
-                    <LinearLayout
-                        android:id="@+id/textinput_frame"
+                <LinearLayout
+                    android:id="@+id/center_frame"
+                    android:layout_width="0dip"
+                    android:layout_height="fill_parent"
+                    android:layout_weight="1"
+                    android:gravity="bottom"
+                    android:orientation="vertical" >
+
+                    <FrameLayout
+                        android:id="@+id/input_frame"
                         android:layout_width="fill_parent"
                         android:layout_height="fill_parent"
-                        android:layout_gravity="bottom"
-                        android:baselineAligned="false"
-                        android:gravity="bottom"
-                        android:orientation="vertical" >
+                        android:gravity="bottom" >
+
+                        <LinearLayout
+                            android:id="@+id/textinput_frame"
+                            android:layout_width="fill_parent"
+                            android:layout_height="fill_parent"
+                            android:layout_gravity="bottom"
+                            android:baselineAligned="false"
+                            android:gravity="bottom"
+                            android:orientation="vertical" >
+
+                            <!--
+                             An include tag must have the attributes which the included tag has,
+                             otherwise LayoutInflator.inflate causes memory leak.
+                            -->
+
+                            <FrameLayout
+                                android:layout_width="fill_parent"
+                                android:layout_height="0dip"
+                                android:layout_weight="1" >
+
+                                <include
+                                    android:id="@+id/button_frame"
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="@dimen/button_frame_height"
+                                    android:layout_gravity="fill_horizontal|bottom"
+                                    layout="@layout/button_frame" />
+
+                                <include
+                                    android:id="@+id/candidate_view"
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="fill_parent"
+                                    layout="@layout/candidate_view" />
+                            </FrameLayout>
+
+                            <org.mozc.android.inputmethod.japanese.NarrowFrameView
+                                android:id="@+id/narrow_frame"
+                                android:layout_width="fill_parent"
+                                android:layout_height="@dimen/narrow_frame_height"
+                                android:layout_gravity="bottom"
+                                android:orientation="vertical"
+                                android:visibility="gone" >
+
+                                <View
+                                    android:id="@+id/narrow_frame_separator"
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="1dip"
+                                    android:layout_gravity="top" />
+
+                                <FrameLayout
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="fill_parent"
+                                    android:layout_gravity="bottom" >
+
+                                    <org.mozc.android.inputmethod.japanese.view.MozcImageView
+                                        android:id="@+id/hardware_composition_button"
+                                        android:layout_width="64dip"
+                                        android:layout_height="fill_parent"
+                                        android:layout_gravity="left|bottom"
+                                        android:soundEffectsEnabled="false"
+                                        mozc:maxImageHeight="@dimen/default_function_icon_height" />
+
+                                    <org.mozc.android.inputmethod.japanese.view.MozcImageView
+                                        android:id="@+id/widen_button"
+                                        android:layout_width="64dip"
+                                        android:layout_height="fill_parent"
+                                        android:layout_gravity="right|bottom"
+                                        android:soundEffectsEnabled="false"
+                                        android:contentDescription="@string/cd_narrow_frame_widen_button"
+                                        mozc:maxImageHeight="@dimen/default_function_icon_height" />
+                                </FrameLayout>
+                            </org.mozc.android.inputmethod.japanese.NarrowFrameView>
+
+                            <FrameLayout
+                                android:id="@+id/keyboard_frame"
+                                android:layout_width="fill_parent"
+                                android:layout_height="@dimen/input_frame_height" >
+
+                                <org.mozc.android.inputmethod.japanese.keyboard.KeyboardView
+                                    android:id="@+id/keyboard_view"
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="fill_parent" />
+
+                                <View
+                                    android:id="@+id/keyboard_frame_separator"
+                                    android:layout_width="fill_parent"
+                                    android:layout_height="1dip"
+                                    android:layout_gravity="top" />
+                            </FrameLayout>
+                        </LinearLayout>
 
                         <!--
-                         An include tag must have the attributes which the
-                         included tag has, otherwise LayoutInflator.inflate
-                         causes memory leak.
-                        -->
+                             In order not to send tapping events of "unclickable region" on
+                             SymbolInputView to behind views (usually keyboard view), we set
+                             "clickable=true" to this view, so that this view consumes click
+                             events. -->
 
-                        <FrameLayout
+                        <org.mozc.android.inputmethod.japanese.SymbolInputView
+                            android:id="@+id/symbol_input_view"
                             android:layout_width="fill_parent"
-                            android:layout_height="0dip"
-                            android:layout_weight="1" >
-
-                            <include
-                                android:id="@+id/candidate_view"
-                                android:layout_width="fill_parent"
-                                android:layout_height="fill_parent"
-                                layout="@layout/candidate_view" />
-
-                            <ImageView
-                                android:layout_width="fill_parent"
-                                android:layout_height="@dimen/translucent_border_height"
-                                android:layout_gravity="fill_horizontal|bottom"
-                                android:background="@drawable/dropshadow_top" />
-                        </FrameLayout>
-
-                        <FrameLayout
-                            android:id="@+id/narrow_frame"
-                            android:layout_width="fill_parent"
-                            android:layout_height="@dimen/narrow_frame_height"
+                            android:layout_height="@dimen/symbol_view_height"
                             android:layout_gravity="bottom"
-                            android:background="@color/keyboard_background"
-                            android:visibility="gone" >
+                            android:clickable="true"
+                            android:visibility="gone"
+                            android:soundEffectsEnabled="false" />
+                    </FrameLayout>
+                </LinearLayout>
 
-                            <ImageView
-                                android:id="@+id/hardware_composition_button"
-                                android:layout_width="64dip"
-                                android:layout_height="fill_parent"
-                                android:layout_gravity="left|bottom" />
-
-                            <ImageView
-                                android:id="@+id/widen_button"
-                                android:layout_width="64dip"
-                                android:layout_height="fill_parent"
-                                android:layout_gravity="right|bottom" />
-                        </FrameLayout>
-
-                        <FrameLayout
-                            android:id="@+id/keyboard_frame"
-                            android:layout_width="fill_parent"
-                            android:layout_height="@dimen/input_frame_height" >
-
-                            <org.mozc.android.inputmethod.japanese.JapaneseKeyboardView
-                                android:id="@+id/keyboard_view"
-                                android:layout_width="fill_parent"
-                                android:layout_height="fill_parent" />
-                        </FrameLayout>
-                    </LinearLayout>
-
-                    <!--
-                         In order not to send tapping events of "unclickable region" on
-                         SymbolInputView to behind views (usually keyboard view), we set
-                         "clickable=true" to this view, so that this view consumes click
-                         events. Otherwise, for example, assuming a user uses
-                         qwerty-layout and opens symbol input view connecting to a text
-                         field which doesn't support emoji, user can open CursorView
-                         by tapping (a part of) emoji-major-category-button (because
-                         the cursor view open button is very "close" to the major category
-                         button, regardless of the keyboard view's visibility).
-                    -->
-
-                    <org.mozc.android.inputmethod.japanese.SymbolInputView
-                        android:id="@+id/symbol_input_view"
-                        android:layout_width="fill_parent"
-                        android:layout_height="fill_parent"
-                        android:clickable="true"
-                        android:visibility="gone" />
-                </FrameLayout>
+                <ViewStub
+                    android:id="@+id/stub_right_frame"
+                    android:layout_width="@dimen/side_frame_width"
+                    android:layout_height="fill_parent"
+                    android:layout_gravity="right"
+                    android:inflatedId="@+id/right_frame"
+                    android:layout="@layout/right_frame"
+                    android:visibility="gone" />
             </LinearLayout>
+        </FrameLayout>
+    </LinearLayout>
 
-            <ViewStub
-                android:id="@+id/stub_right_frame"
-                android:inflatedId="@+id/right_frame"
-                android:layout="@layout/right_frame"
-                android:layout_width="@dimen/side_frame_width"
-                android:layout_height="fill_parent"
-                android:layout_gravity="right"
-                android:visibility="gone" />
-        </LinearLayout>
-    </FrameLayout>
+    <!-- TODO(hsumita): Replace this view by ViewStub for performance. -->
+    <org.mozc.android.inputmethod.japanese.FloatingCandidateView
+        android:id="@+id/floating_candidate_view"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:visibility="gone" />
+
 </org.mozc.android.inputmethod.japanese.MozcView>
diff --git a/src/android/static_resources/resources_oss/res/layout/right_frame.xml b/src/android/static_resources/resources_oss/res/layout/right_frame.xml
index 2ba07eb..55931ac 100644
--- a/src/android/static_resources/resources_oss/res/layout/right_frame.xml
+++ b/src/android/static_resources/resources_oss/res/layout/right_frame.xml
@@ -31,66 +31,15 @@
 -->
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/right_frame"
     android:layout_width="@dimen/side_frame_width"
     android:layout_height="fill_parent"
     android:layout_gravity="left"
     android:visibility="gone" >
 
-    <FrameLayout
-        android:id="@+id/right_dropshadow"
-        android:layout_width="@dimen/translucent_border_height"
-        android:layout_height="fill_parent"
-        android:layout_gravity="bottom|left"
-        android:orientation="vertical" >
-
-        <LinearLayout
-            android:id="@+id/right_dropshadow_short"
-            android:layout_width="fill_parent"
-            android:layout_height="@dimen/input_frame_height_with_shadow"
-            android:layout_gravity="bottom"
-            android:orientation="vertical" >
-
-            <ImageView
-                android:id="@+id/dropshadow_right_short_top"
-                android:layout_width="fill_parent"
-                android:layout_height="@dimen/translucent_border_height" />
-
-            <ImageView
-                android:id="@+id/dropshadow_right_short_bottom"
-                android:layout_width="fill_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:background="@drawable/dropshadow_right" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/right_dropshadow_long"
-            android:layout_width="fill_parent"
-            android:layout_height="@dimen/ime_window_height"
-            android:layout_gravity="bottom"
-            android:orientation="vertical"
-            android:visibility="gone" >
-
-            <ImageView
-                android:id="@+id/dropshadow_right_long_top"
-                android:layout_width="fill_parent"
-                android:layout_height="@dimen/translucent_border_height" />
-
-            <ImageView
-                android:id="@+id/dropshadow_right_long_bottom"
-                android:layout_width="fill_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:background="@drawable/dropshadow_right" />
-        </LinearLayout>
-    </FrameLayout>
-
     <ImageView
         android:id="@+id/right_adjust_button"
         android:layout_width="@dimen/side_adjust_button_width"
         android:layout_height="@dimen/side_adjust_button_height"
         android:layout_gravity="bottom|left"
         android:layout_marginBottom="100dip" />
-
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml b/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
index a45a8fe..9f7718e 100644
--- a/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
@@ -40,7 +40,6 @@
       android:orientation="horizontal" >
     <view
         android:id="@+id/symbol_input_candidate_view"
-        android:background="@color/input_frame_background"
         android:layout_width="0dip"
         android:layout_height="fill_parent"
         android:layout_weight="1"
@@ -50,8 +49,7 @@
         android:id="@+id/symbol_input_scroll_guide_view"
         android:layout_width="@dimen/candidate_scrollbar_width"
         android:layout_height="fill_parent"
-        android:layout_weight="0"
-        android:background="@drawable/candidate__slidebar_background" />
+        android:layout_weight="0" />
   </LinearLayout>
 
   <!-- Following LinearLayout is shown only when there is no candidate. -->
@@ -69,7 +67,6 @@
         android:layout_height="fill_parent"
         android:gravity="center"
         android:text="@string/symbol_input_no_history"
-        android:textColor="@android:color/black"
         android:textSize="@dimen/symbol_view_no_history_text_size" />
 
     <ImageView
@@ -79,10 +76,4 @@
         android:background="@drawable/symbol__category_indicator_right" />
   </FrameLayout>
 
-  <!-- Drop shadow between candidates and minor category tabs. -->
-  <View
-      android:layout_width="fill_parent"
-      android:layout_height="@dimen/translucent_border_height"
-      android:background="@drawable/dropshadow_top"
-      android:layout_gravity="bottom" />
 </FrameLayout>
\ No newline at end of file
diff --git a/src/android/static_resources/resources_oss/res/layout/symbol_view.xml b/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
index 5b5c728..9e26336 100644
--- a/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
@@ -30,7 +30,9 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:clickable="true" >
@@ -54,18 +56,60 @@
             <TabHost
                 android:id="@android:id/tabhost"
                 android:layout_width="fill_parent"
-                android:layout_height="fill_parent"
-                android:background="@android:color/white" >
+                android:layout_height="fill_parent" >
 
-                <RelativeLayout
+                <LinearLayout
                     android:layout_width="fill_parent"
-                    android:layout_height="fill_parent" >
+                    android:layout_height="fill_parent"
+                    android:orientation="vertical" >
+
+                    <FrameLayout
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content" >
+
+                        <LinearLayout
+                            android:id="@+id/symbol_minor_category"
+                            android:layout_width="fill_parent"
+                            android:layout_height="wrap_content"
+                            android:orientation="horizontal" >
+
+                            <TabWidget
+                                android:id="@android:id/tabs"
+                                android:layout_width="0dip"
+                                android:layout_height="@dimen/button_frame_height"
+                                android:layout_weight="6"
+                                android:showDividers="none" />
+
+                            <View
+                                android:id="@+id/symbol_view_backspace_separator"
+                                android:layout_width="1dip"
+                                android:layout_height="fill_parent"
+                                android:layout_weight="0" />
+
+                            <org.mozc.android.inputmethod.japanese.view.MozcImageView
+                                android:id="@+id/symbol_view_delete_button"
+                                android:layout_width="0dip"
+                                android:layout_height="fill_parent"
+                                android:layout_gravity="center"
+                                android:layout_weight="1"
+                                android:contentDescription="@string/cd_symbol_window_backspace"
+                                android:focusable="true"
+                                android:scaleType="fitCenter"
+                                mozc:rawSrc="@raw/twelvekeys__function__delete__icon"
+                                mozc:maxImageHeight="@dimen/default_function_icon_height" />
+                        </LinearLayout>
+                    </FrameLayout>
+
+                    <View
+                        android:id="@+id/symbol_separator_1"
+                        android:layout_width="fill_parent"
+                        android:layout_height="1dip" />
 
                     <android.support.v4.view.ViewPager
                         android:id="@+id/symbol_input_candidate_view_pager"
                         android:layout_width="fill_parent"
                         android:layout_height="fill_parent"
-                        android:layout_above="@android:id/tabs" >
+                        android:soundEffectsEnabled="false" >
 
                         <FrameLayout
                             android:id="@android:id/tabcontent"
@@ -73,31 +117,70 @@
                             android:layout_height="fill_parent"
                             android:visibility="gone" >
 
-                            <View
-                                android:id="@+id/symbol_input_dummy"
-                                android:layout_width="0dip"
-                                android:layout_height="0dip"
-                                android:minHeight="0dip"
-                                android:minWidth="0dip" />
+                          <View
+                              android:id="@+id/symbol_input_dummy"
+                              android:layout_width="0dip"
+                              android:layout_height="0dip"
+                              android:minHeight="0dip"
+                              android:minWidth="0dip" />
                         </FrameLayout>
                     </android.support.v4.view.ViewPager>
-
-                    <TabWidget
-                        android:id="@android:id/tabs"
-                        android:layout_width="fill_parent"
-                        android:layout_height="@dimen/symbol_view_minor_category_tab_widget_height"
-                        android:layout_alignParentBottom="true"
-                        android:background="@color/symbol_view_tab_background" />
-                </RelativeLayout>
+                </LinearLayout>
             </TabHost>
 
-            <!-- Drop shadow between minor category tabs and major category buttons. -->
-
-            <View
+            <FrameLayout
+                android:id="@+id/number_frame"
                 android:layout_width="fill_parent"
-                android:layout_height="@dimen/translucent_border_height"
-                android:layout_gravity="bottom"
-                android:background="@drawable/dropshadow_top" />
+                android:layout_height="fill_parent">
+
+                <LinearLayout
+                    android:layout_width="fill_parent"
+                    android:layout_height="fill_parent"
+                    android:layout_gravity="bottom"
+                    android:orientation="vertical" >
+
+                    <FrameLayout
+                        android:layout_width="fill_parent"
+                        android:layout_height="0dip"
+                        android:layout_weight="1" >
+
+                        <!--
+                            An include tag must have the attributes which the included tag has,
+                            otherwise LayoutInflator.inflate causes memory leak.
+                        -->
+
+                        <include
+                            android:id="@+id/button_frame_in_symbol_view"
+                            android:layout_width="fill_parent"
+                            android:layout_height="@dimen/button_frame_height"
+                            layout="@layout/button_frame" />
+
+                        <include
+                            android:id="@+id/candidate_view_in_symbol_view"
+                            android:layout_width="fill_parent"
+                            android:layout_height="fill_parent"
+                            layout="@layout/candidate_view" />
+                    </FrameLayout>
+
+                    <FrameLayout
+                        android:id="@+id/number_keyboard_frame"
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content" >
+
+                        <org.mozc.android.inputmethod.japanese.keyboard.KeyboardView
+                            android:id="@+id/number_keyboard"
+                            android:layout_width="fill_parent"
+                            android:layout_height="@dimen/symbol_view_number_keyboard_height" />
+
+                        <View
+                            android:id="@+id/symbol_separator_3"
+                            android:layout_width="fill_parent"
+                            android:layout_height="1dip"
+                            android:layout_gravity="top" />
+                    </FrameLayout>
+
+                </LinearLayout>
+            </FrameLayout>
 
             <!-- Displayed when emoji major category is selected on the non-emoji-allowed text view. -->
 
@@ -114,6 +197,12 @@
                 android:textColor="@android:color/white"
                 android:textSize="20dip"
                 android:visibility="gone" />
+
+            <View
+                android:id="@+id/symbol_separator_2"
+                android:layout_width="fill_parent"
+                android:layout_height="1dip"
+                android:layout_gravity="bottom" />
         </FrameLayout>
 
         <LinearLayout
@@ -124,70 +213,89 @@
             android:paddingBottom="2dip"
             android:paddingLeft="1dip"
             android:paddingRight="1dip"
-            android:paddingTop="2dip" >
+            android:paddingTop="2dip"
+            android:soundEffectsEnabled="false" >
 
-            <ImageButton
+            <org.mozc.android.inputmethod.japanese.view.MozcImageView
                 android:id="@+id/symbol_view_close_button"
                 android:layout_width="0dip"
                 android:layout_height="fill_parent"
                 android:layout_gravity="center"
-                android:layout_weight="1"
+                android:layout_weight="17.3"
                 android:contentDescription="@string/cd_close_symbol_window"
-                android:scaleType="fitCenter" />
+                android:scaleType="fitCenter"
+                android:soundEffectsEnabled="false"
+                mozc:rawSrc="@raw/symbol__function__close"
+                mozc:maxImageWidth="@dimen/symbol_close_button_width" />
 
-            <!--
-          TODO(matsuzakit): padding{Bottom,Top} is just a work around.
-          Fixing the images themselves might be preferable.
-            -->
+            <View
+                android:id="@+id/symbol_view_close_button_separator"
+                android:layout_width="1dip"
+                android:layout_height="fill_parent"
+                android:layout_weight="0" />
 
-            <LinearLayout
-                android:id="@+id/category_selector_major"
+            <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+                android:id="@+id/category_selector_major_number"
                 android:layout_width="0dip"
                 android:layout_height="fill_parent"
-                android:layout_marginLeft="3dip"
-                android:layout_marginRight="3dip"
-                android:layout_weight="5"
-                android:gravity="center"
-                android:paddingBottom="1dip"
-                android:paddingTop="2dip" >
+                android:layout_weight="16.55"
+                android:contentDescription="@string/cd_symbol_window_number"
+                android:padding="0dip"
+                android:scaleType="fitCenter"
+                android:soundEffectsEnabled="false"
+                mozc:maxImageHeight="@dimen/symbol_major_number_height" />
 
-                <ImageButton
-                    android:id="@+id/category_selector_major_symbol"
-                    android:layout_width="0dip"
-                    android:layout_height="fill_parent"
-                    android:layout_weight="1"
-                    android:contentDescription="@string/cd_symbol_window_symbol"
-                    android:padding="0dip"
-                    android:scaleType="fitCenter" />
+            <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+                android:id="@+id/category_selector_major_symbol"
+                android:layout_width="0dip"
+                android:layout_height="fill_parent"
+                android:layout_weight="16.55"
+                android:contentDescription="@string/cd_symbol_window_symbol"
+                android:padding="0dip"
+                android:scaleType="fitCenter"
+                android:soundEffectsEnabled="false"
+                mozc:maxImageHeight="@dimen/symbol_major_symbol_height" />
 
-                <ImageButton
-                    android:id="@+id/category_selector_major_emoticon"
-                    android:layout_width="0dip"
-                    android:layout_height="fill_parent"
-                    android:layout_weight="1"
-                    android:contentDescription="@string/cd_symbol_window_emoticon"
-                    android:padding="0dip"
-                    android:scaleType="fitCenter" />
+            <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+                android:id="@+id/category_selector_major_emoticon"
+                android:layout_width="0dip"
+                android:layout_height="fill_parent"
+                android:layout_weight="16.55"
+                android:contentDescription="@string/cd_symbol_window_emoticon"
+                android:padding="0dip"
+                android:scaleType="fitCenter"
+                android:soundEffectsEnabled="false"
+                mozc:maxImageHeight="@dimen/symbol_major_emoticon_height" />
 
-                <ImageButton
-                    android:id="@+id/category_selector_major_emoji"
-                    android:layout_width="0dip"
-                    android:layout_height="fill_parent"
-                    android:layout_weight="1"
-                    android:contentDescription="@string/cd_symbol_window_emoji"
-                    android:padding="0dip"
-                    android:scaleType="fitCenter" />
-            </LinearLayout>
+            <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+                android:id="@+id/category_selector_major_emoji"
+                android:layout_width="0dip"
+                android:layout_height="fill_parent"
+                android:layout_weight="16.55"
+                android:contentDescription="@string/cd_symbol_window_emoji"
+                android:padding="0dip"
+                android:scaleType="fitCenter"
+                android:soundEffectsEnabled="false"
+                mozc:maxImageHeight="@dimen/symbol_major_emoji_height" />
 
-            <ImageButton
-                android:id="@+id/symbol_view_delete_button"
+            <View
+                android:id="@+id/symbol_view_enter_button_separator"
+                android:layout_width="1dip"
+                android:layout_height="fill_parent"
+                android:layout_weight="0" />
+
+            <org.mozc.android.inputmethod.japanese.view.MozcImageView
+                android:id="@+id/symbol_view_enter_button"
                 android:layout_width="0dip"
                 android:layout_height="fill_parent"
                 android:layout_gravity="center"
-                android:layout_weight="1"
-                android:contentDescription="@string/cd_symbol_window_backspace"
-                android:scaleType="fitCenter" />
+                android:layout_weight="17.3"
+                android:contentDescription="@string/cd_symbol_window_enter"
+                android:focusable="true"
+                android:scaleType="fitCenter"
+                mozc:rawSrc="@raw/function__enter__icon"
+                mozc:maxImageWidth="@dimen/keyboard_enter_width" />
         </LinearLayout>
     </LinearLayout>
 
-</merge>
\ No newline at end of file
+</merge>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml
deleted file mode 100644
index 47db29a..0000000
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/actionbar_compatibility"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:background="@color/action_bar_background"
-    android:orientation="horizontal">
-  <!-- Application icon and title. -->
-  <ImageView
-      android:src="@drawable/application_icon"
-      android:scaleType="center"
-      android:layout_width="56dp"
-      android:layout_height="fill_parent" />
-
-  <TextView
-      android:text="@string/user_dictionary_tool_app_name"
-      android:layout_width="0dip"
-      android:layout_height="fill_parent"
-      android:layout_weight="1"
-      android:gravity="center_vertical"
-      android:textSize="18sp"
-      android:paddingLeft="6dp"
-      android:paddingRight="6dp"
-      android:singleLine="true"
-      android:ellipsize="marquee"
-      android:textColor="@android:color/black" />
-
-  <!-- Menu icons. -->
-  <ImageView
-      android:id="@+id/user_dictionary_tool_action_bar_add_entry"
-      android:src="@android:drawable/ic_menu_add"
-      android:clickable="true"
-      android:layout_width="48dp"
-      android:layout_height="fill_parent"
-      android:gravity="center_vertical"
-      android:background="@drawable/action_bar_item_background" />
-
-  <ImageView
-      android:id="@+id/user_dictionary_tool_action_bar_delete_entry"
-      android:src="@android:drawable/ic_menu_delete"
-      android:clickable="true"
-      android:layout_width="48dp"
-      android:layout_height="fill_parent"
-      android:gravity="center_vertical"
-      android:background="@drawable/action_bar_item_background" />
-</LinearLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
index 6a77280..d73ae87 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
@@ -35,7 +35,6 @@
     android:orientation="vertical" >
 
     <TextView
-        style="@style/MozcDialogTextView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:paddingLeft="8dip"
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml
deleted file mode 100644
index c638060..0000000
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- An empty ScrollView to wrap content view of dialogs.
-     It is necessary to set scrollbars="none" in order to make scroll bar
-     invisible. -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:fillViewport="true"
-    android:scrollbars="none">
-  <!-- Note: there is a bug on ScrollView to put the content in the center of the pane.
-       What we want to do here is:
-       - Show the content with "wrap_content" size at the (vertically) center of ScrollView
-         if it's large enough.
-       - Otherwise, show the simple ScrollView as usual.
-       This is the work around of the bug.
-  -->
-  <LinearLayout
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content"
-      android:orientation="vertical">
-    <View
-        android:layout_width="fill_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-    <FrameLayout
-        android:id="@+id/user_dictionary_tool_empty_scroll_view_content"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center" />
-    <View
-        android:layout_width="fill_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-  </LinearLayout>
-</ScrollView>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
index 9d4367f..709cc0e 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
@@ -45,43 +45,4 @@
       android:layout_height="fill_parent"
       android:layout_below="@+id/user_dictionary_tool_dictionary_name_spinner"
       android:layout_above="@+id/user_dictionary_tool_split_action_bar" />
-
-  <!-- Self implementation of SplitActionBar for older devices, such as Android 2.3 or earlier. -->
-  <LinearLayout
-      android:id="@+id/user_dictionary_tool_split_action_bar"
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content"
-      android:layout_alignParentBottom="true"
-      android:background="@color/action_bar_background"
-      android:orientation="vertical"
-      android:visibility="gone">
-    <!-- Thin shade of Split action bar. -->
-    <View
-        android:layout_width="fill_parent"
-        android:layout_height="1dip"
-        android:background="@color/action_bar_background_shade" />
-
-    <RelativeLayout
-        android:layout_width="fill_parent"
-        android:layout_height="48dip"
-        android:orientation="horizontal">
-      <ImageView
-          android:id="@+id/user_dictionary_tool_split_action_bar_add_entry"
-          android:src="@android:drawable/ic_menu_add"
-          android:clickable="true"
-          android:layout_alignParentLeft="true"
-          android:layout_width="48dip"
-          android:layout_height="fill_parent"
-          android:background="@drawable/action_bar_item_background" />
-
-      <ImageView
-          android:id="@+id/user_dictionary_tool_split_action_bar_delete_entry"
-          android:src="@android:drawable/ic_menu_delete"
-          android:clickable="true"
-          android:layout_alignParentRight="true"
-          android:layout_width="48dip"
-          android:layout_height="fill_parent"
-          android:background="@drawable/action_bar_item_background"/>
-    </RelativeLayout>
-  </LinearLayout>
 </RelativeLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
index a0c77b5..30f51ee 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
@@ -39,7 +39,6 @@
     android:paddingTop="9dip" >
 
     <TextView
-        style="@style/MozcDialogTextView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:paddingLeft="8dip"
@@ -57,7 +56,6 @@
     </EditText>
 
     <TextView
-        style="@style/MozcDialogTextView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:paddingLeft="8dip"
@@ -72,7 +70,6 @@
         android:selectAllOnFocus="true" />
 
     <TextView
-        style="@style/MozcDialogTextView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:paddingLeft="8dip"
diff --git a/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml b/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
index 861ec54..3ee86c5 100644
--- a/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
+++ b/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
@@ -51,7 +51,9 @@
           android:showAsAction="never" />
     <item android:id="@+id/user_dictionary_tool_menu_export_dictionary"
           android:title="@string/user_dictionary_tool_menu_export_dictionary_title"
-          android:showAsAction="never" />
+          android:showAsAction="never"
+          android:enabled="@bool/enable_user_dictionary_export"
+          android:visible="@bool/enable_user_dictionary_export" />
 
     <item android:id="@+id/user_dictionary_tool_menu_undo"
           android:icon="@android:drawable/ic_menu_revert"
diff --git a/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml
new file mode 100644
index 0000000..e31f03c
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Shamu (728.57 x 411.43 dp, screenHeightDp: 380+? dp)
+     NOTE: This size is recgnized as a kind of phones.
+           Don't apply table setting.
+-->
+<resources>
+
+    <dimen name="input_frame_height">186.3dip</dimen>
+    <dimen name="ime_window_height">226.3dip</dimen>
+
+    <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+    <dimen name="symbol_view_height">226.3dip</dimen>
+    <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+    <dimen name="symbol_view_major_category_height">46.575dip</dimen>
+    <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+    <dimen name="symbol_view_number_keyboard_height">139.725dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml b/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml
new file mode 100644
index 0000000..d791beb
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+  <!-- Candidate window scroll animation : Velocity decay rate in ppm -->
+  <integer name="candidate_scroller_velocity_decay_rate">696845</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml
new file mode 100644
index 0000000..e8bac4e
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Nexus7 (2012) (961 x 600 dp, screenHeightDp: 528 dp)
+     - Nexus7 (2013) (960 x 600 dp, screenHeightDp: 528 dp)
+     And larger ones than above.
+-->
+<resources>
+
+  <dimen name="pref_inputstyle_description_width">150dip</dimen>
+
+  <dimen name="key_preview_height">75dip</dimen>
+  <dimen name="key_preview_icon_height">75dip</dimen>
+  <dimen name="popup_width_limitation">75dip</dimen>
+  <dimen name="candidate_text_size">26dip</dimen>
+  <dimen name="candidate_horizontal_padding_size">14dip</dimen>
+  <dimen name="candidate_vertical_padding_size">12dip</dimen>
+  <dimen name="candidate_description_text_size">12dip</dimen>
+  <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+  <dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
+  <dimen name="candidate_fold_icon_width">29dip</dimen>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">63.75dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">305dip</dimen>
+  <dimen name="input_frame_height">255dip</dimen>
+  <!-- partial_width >= 7 * (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="ime_window_partial_width">350dip</dimen>
+
+  <dimen name="firsttime_app_name_text_size">32dip</dimen>
+  <dimen name="firsttime_description_text_size">25dip</dimen>
+  <dimen name="firsttime_padding_height">28dip</dimen>
+  <dimen name="firsttime_padding_width">40dip</dimen>
+
+  <!-- 3.5 Rows of candidates -->
+  <!-- (candidate_text_size + candidate_vertical_padding_size * 2) * 3.5
+       + narrow_frame_height -->
+  <dimen name="narrow_ime_window_height">221dip</dimen>
+  <dimen name="narrow_frame_height">46dip</dimen>
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">305dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">191.25dip</dimen>
+  <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+  <dimen name="button_frame_height">50dip</dimen>
+
+  <!-- Character size of keyboard, depending on the screen size. -->
+  <dimen name="keyboard_godan_default_height">47dip</dimen>
+  <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+  <dimen name="keyboard_qwerty_default_height">43dip</dimen>
+
+  <!-- 15% bigger than default. -->
+  <dimen name="symbol_close_button_width">39dip</dimen>
+  <dimen name="symbol_major_emoji_disable_icon_height">18dip</dimen>
+  <dimen name="symbol_major_emoji_height">23dip</dimen>
+  <dimen name="symbol_major_emoticon_height">20dip</dimen>
+  <dimen name="symbol_major_number_height">16dip</dimen>
+  <dimen name="symbol_major_symbol_height">20dip</dimen>
+  <dimen name="symbol_minor_default_height">23dip</dimen>
+  <dimen name="symbol_minor_emoticon_height">18dip</dimen>
+
+  <dimen name="symbol_view_symbol_min_column_width">100dip</dimen>
+  <dimen name="symbol_view_emoticon_min_column_width">145dip</dimen>
+  <dimen name="symbol_view_emoji_min_column_width">100dip</dimen>
+  <dimen name="symbol_candidate_horizontal_padding_size">18dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml
new file mode 100644
index 0000000..97186d8
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+  <integer name="floating_candidate_candidate_num">9</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml
new file mode 100644
index 0000000..75a14e7
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Volantis (1024 x 768 dp, screenHeightDp: 695 dp)
+     And larger ones than above.
+-->
+<resources>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">68.25dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">323dip</dimen>
+  <dimen name="input_frame_height">273dip</dimen>
+
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">323dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">204.75dip</dimen>
+  <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+  <dimen name="button_frame_height">50dip</dimen>
+
+  <!-- Character size of keyboard, depending on the screen size. -->
+  <dimen name="keyboard_qwerty_default_height">47dip</dimen>
+  <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+  <dimen name="keyboard_godan_default_height">51dip</dimen>
+
+  <!-- 20% bigger than default. -->
+  <dimen name="symbol_close_button_width">41dip</dimen>
+  <dimen name="symbol_major_emoji_disable_icon_height">19dip</dimen>
+  <dimen name="symbol_major_emoji_height">24dip</dimen>
+  <dimen name="symbol_major_emoticon_height">20dip</dimen>
+  <dimen name="symbol_major_number_height">17dip</dimen>
+  <dimen name="symbol_major_symbol_height">20dip</dimen>
+  <dimen name="symbol_minor_default_height">24dip</dimen>
+  <dimen name="symbol_minor_emoticon_height">19dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml
new file mode 100644
index 0000000..a22c5fa
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@null</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml
new file mode 100644
index 0000000..0e0f3df
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Shamu (728.57 x 411.43 dp, screenHeightDp: 650+? dp)
+     NOTE: This size is recgnized as a kind of phones.
+           Don't apply table setting.
+-->
+<resources>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">63.775dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">335.1dip</dimen>
+  <dimen name="input_frame_height">255.1dip</dimen>
+
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">295.1dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">191.325dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml
new file mode 100644
index 0000000..cf5ae4b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Nexus10 (1280 x 800 dp, screenHeightDp: 727 dp)
+     And larger ones than above.
+-->
+<resources>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">86.25dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">396.5dip</dimen>
+  <dimen name="input_frame_height">346.5dip</dimen>
+
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">396.5dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">259.875dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml
new file mode 100644
index 0000000..20bb02b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+  <!-- Candidate window scroll animation : Velocity decay rate in ppm -->
+  <integer name="candidate_scroller_velocity_decay_rate">696845</integer>
+
+  <integer name="floating_candidate_candidate_num">9</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml
new file mode 100644
index 0000000..82a9b57
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Nexus7 (2012) (961 x 600 dp, screenHeightDp: 880 dp)
+     - Nexus7 (2013) (960 x 600 dp, screenHeightDp: ? dp)
+     From this size the devices are recognized as a kind of tables.
+-->
+<resources>
+
+  <dimen name="pref_inputstyle_description_width">150dip</dimen>
+
+  <dimen name="key_preview_height">75dip</dimen>
+  <dimen name="key_preview_icon_height">75dip</dimen>
+  <dimen name="popup_width_limitation">75dip</dimen>
+  <dimen name="candidate_text_size">26dip</dimen>
+  <dimen name="candidate_horizontal_padding_size">14dip</dimen>
+  <dimen name="candidate_vertical_padding_size">12dip</dimen>
+  <dimen name="candidate_description_text_size">12dip</dimen>
+  <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+  <dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
+  <dimen name="candidate_fold_icon_width">29dip</dimen>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">75.6dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">402.4dip</dimen>
+  <dimen name="input_frame_height">302.4dip</dimen>
+  <!-- partial_width >= 7 * (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="ime_window_partial_width">350dip</dimen>
+
+  <dimen name="firsttime_app_name_text_size">32dip</dimen>
+  <dimen name="firsttime_description_text_size">25dip</dimen>
+  <dimen name="firsttime_padding_height">28dip</dimen>
+  <dimen name="firsttime_padding_width">40dip</dimen>
+
+  <!-- 3.5 Rows of candidates -->
+  <!-- (candidate_text_size + candidate_vertical_padding_size * 2) * 3.5
+       + narrow_frame_height -->
+  <dimen name="narrow_ime_window_height">221dip</dimen>
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">352.4dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">226.8dip</dimen>
+  <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+  <dimen name="button_frame_height">50dip</dimen>
+
+  <!-- Character size of keyboard, depending on the screen size. -->
+  <dimen name="keyboard_godan_default_height">47dip</dimen>
+  <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+  <dimen name="keyboard_qwerty_default_height">43dip</dimen>
+
+  <!-- 15% bigger than default. -->
+  <dimen name="symbol_close_button_width">39dip</dimen>
+  <dimen name="symbol_major_emoji_disable_icon_height">18dip</dimen>
+  <dimen name="symbol_major_emoji_height">23dip</dimen>
+  <dimen name="symbol_major_emoticon_height">20dip</dimen>
+  <dimen name="symbol_major_number_height">16dip</dimen>
+  <dimen name="symbol_major_symbol_height">20dip</dimen>
+  <dimen name="symbol_minor_default_height">23dip</dimen>
+  <dimen name="symbol_minor_emoticon_height">18dip</dimen>
+
+  <dimen name="symbol_view_symbol_min_column_width">80dip</dimen>
+  <dimen name="symbol_view_emoticon_min_column_width">120dip</dimen>
+  <dimen name="symbol_view_emoji_min_column_width">80dip</dimen>
+  <dimen name="symbol_candidate_horizontal_padding_size">15dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml
new file mode 100644
index 0000000..a22c5fa
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@null</item>
+    <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@null</item>
+    <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@null</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml
new file mode 100644
index 0000000..d9eb9b6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+     - Volantis (1024 x 768 dp, screenHeightDp: 951 dp)
+     - Nexus10 (1280 x 800 dp, screenHeightDp: 1207 dp)
+     And larger ones than above.
+-->
+<resources>
+
+  <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+  <dimen name="symbol_view_major_category_height">75.75dip</dimen>
+
+  <!--
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
+    -->
+  <dimen name="ime_window_height">403dip</dimen>
+  <dimen name="input_frame_height">303dip</dimen>
+
+  <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+  <dimen name="symbol_view_height">353dip</dimen>
+  <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+  <dimen name="symbol_view_number_keyboard_height">227.25dip</dimen>
+
+  <!-- Character size of keyboard, depending on the screen size. -->
+  <dimen name="keyboard_qwerty_default_height">47dip</dimen>
+  <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+  <dimen name="keyboard_godan_default_height">51dip</dimen>
+
+  <!-- 20% bigger than default. -->
+  <dimen name="symbol_close_button_width">41dip</dimen>
+  <dimen name="symbol_major_emoji_disable_icon_height">19dip</dimen>
+  <dimen name="symbol_major_emoji_height">24dip</dimen>
+  <dimen name="symbol_major_emoticon_height">20dip</dimen>
+  <dimen name="symbol_major_number_height">17dip</dimen>
+  <dimen name="symbol_major_symbol_height">20dip</dimen>
+  <dimen name="symbol_minor_default_height">24dip</dimen>
+  <dimen name="symbol_minor_emoticon_height">19dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml b/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
index eacf9cd..5a442a5 100644
--- a/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
+++ b/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
@@ -50,9 +50,7 @@
     <string name="cd_key_right">右</string>
     <string name="cd_key_down">下</string>
     <string name="cd_key_chartype_to_kana">かなへ切り替え</string>
-    <string name="cd_key_chartype_to_123">数字に切り替え</string>
     <string name="cd_key_chartype_to_abc">アルファベットに切り替え</string>
-    <string name="cd_key_chartype_to_kana_123">記号に切り替え</string>
     <string name="cd_key_chartype_to_abc_123">記号に切り替え</string>
     <string name="cd_key_undo">アンドゥ</string>
     <string name="cd_key_symbol">記号入力画面</string>
@@ -61,7 +59,7 @@
     <string name="cd_key_capslock">キャプスロック</string>
     <string name="cd_key_capsunlock">シフトを解除</string>
     <string name="cd_key_menu_dialog">メニューを開く</string>
-    <string name="cd_key_ime_picker_dialog">入力方法切り替え</string>
+    <string name="cd_key_globe">入力方法の切り替え</string>
     <string name="cd_key_uchar_backspace">バックスペース</string>
     <string name="cd_key_uchar_linefeed">改行</string>
     <string name="cd_key_uchar_space">スペース</string>
@@ -163,6 +161,13 @@
     <string name="cd_key_uchar_vertical_line">縦線</string>
     <string name="cd_key_uchar_right_curly_bracket">終わり波括弧</string>
     <string name="cd_key_uchar_tilde">チルダ</string>
+    <string name="cd_key_action_done">完了</string>
+    <string name="cd_key_action_go">移動</string>
+    <string name="cd_key_action_next">次へ</string>
+    <string name="cd_key_action_previous">前へ</string>
+    <string name="cd_key_action_search">検索</string>
+    <string name="cd_key_action_send">送信</string>
+    <string name="cd_key_composing_done">確定</string>
 
     <!-- Keys in Kana keyboard -->
     <string name="cd_key_kana_line_a">ア行</string>
@@ -177,37 +182,11 @@
     <string name="cd_key_kana_modifier">濁点</string>
     <string name="cd_key_kana_line_wa">ワ行</string>
     <string name="cd_key_kana_punctuation">句読点</string>
-
-    <!-- Keys in Qwerty-Kana keyboard -->
-    <string name="cd_key_uchar_black_star">星</string>
-    <string name="cd_key_uchar_black_heart_suit">ハート</string>
-    <string name="cd_key_uchar_eighth_note">音符</string>
-    <string name="cd_key_uchar_reference_mark">米じるし</string>
-    <string name="cd_key_uchar_postal_mark">郵便記号</string>
-    <string name="cd_key_uchar_multiplication_sign">掛け算</string>
-    <string name="cd_key_uchar_division_sign">割り算</string>
-    <string name="cd_key_uchar_left_corner_bracket">始めかぎ括弧</string>
-    <string name="cd_key_uchar_right_corner_bracket">終わりかぎ括弧</string>
     <string name="cd_key_uchar_katakana_middle_dot">中黒</string>
-    <string name="cd_key_uchar_two_dot_leader">二点リーダー</string>
-    <string name="cd_key_uchar_three_dot_leader">三点リーダー</string>
-    <string name="cd_key_uchar_left_black_lenticular_bracket">始めすみ付き括弧</string>
-    <string name="cd_key_uchar_right_black_lenticular_bracket">終わりすみ付き括弧</string>
-    <string name="cd_key_uchar_u6642">時</string>
-    <string name="cd_key_uchar_u5206">分</string>
-    <string name="cd_key_uchar_u6708">月</string>
-    <string name="cd_key_uchar_u65e5">日</string>
-    <string name="cd_key_uchar_wave_dash">波線</string>
-    <string name="cd_key_compound_monday">(月)</string>
-    <string name="cd_key_compound_tuesday">(火)</string>
-    <string name="cd_key_compound_wednesday">(水)</string>
-    <string name="cd_key_compound_thursday">(木)</string>
-    <string name="cd_key_compound_friday">(金)</string>
-    <string name="cd_key_compound_saturday">(土)</string>
-    <string name="cd_key_compound_sunday">(日)</string>
     <string name="cd_key_uchar_ideographic_comma">読点</string>
     <string name="cd_key_uchar_ideographic_full_stop">句点</string>
     <string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark">長音</string>
+
     <!-- Keys in Alphabet keyboard -->
     <string name="cd_key_alphabet_abc">ABC</string>
     <string name="cd_key_alphabet_def">DEF</string>
@@ -223,11 +202,31 @@
 
     <!-- Views -->
     <string name="cd_close_symbol_window">キーボードに戻る</string>
+    <string name="cd_symbol_window_number">数字</string>
     <string name="cd_symbol_window_symbol">記号</string>
     <string name="cd_symbol_window_emoticon">顔文字</string>
     <string name="cd_symbol_window_emoji">絵文字</string>
+    <string name="cd_symbol_window_enter">改行</string>
     <string name="cd_symbol_window_backspace">バックスペース</string>
+    <string name="cd_symbol_window_minor_history">履歴</string>
+    <string name="cd_symbol_window_minor_symbol_general">一般記号</string>
+    <string name="cd_symbol_window_minor_symbol_half">全角半角記号</string>
+    <string name="cd_symbol_window_minor_symbol_parenthesis">括弧</string>
+    <string name="cd_symbol_window_minor_symbol_arrow">矢印記号</string>
+    <string name="cd_symbol_window_minor_symbol_math">数学記号</string>
+    <string name="cd_symbol_window_minor_emoticon_smile">笑っている顔文字</string>
+    <string name="cd_symbol_window_minor_emoticon_sweat">汗をかいている顔文字</string>
+    <string name="cd_symbol_window_minor_emoticon_surprise">驚いている顔文字</string>
+    <string name="cd_symbol_window_minor_emoticon_sadness">悲しんでいる顔文字</string>
+    <string name="cd_symbol_window_minor_emoticon_displeasure">怒っている顔文字</string>
+    <string name="cd_symbol_window_minor_emoji_face">顔の絵文字</string>
+    <string name="cd_symbol_window_minor_emoji_food">食べ物の絵文字</string>
+    <string name="cd_symbol_window_minor_emoji_activity">活動の絵文字</string>
+    <string name="cd_symbol_window_minor_emoji_city">街の絵文字</string>
+    <string name="cd_symbol_window_minor_emoji_nature">自然の絵文字</string>
     <string name="help_userdictionary_dictionary_name">辞書の名前を入力してください</string>
     <string name="help_userdictionary_edit_word_value">単語を入力してください</string>
     <string name="help_userdictionary_edit_word_key">よみを入力してください</string>
-</resources>
\ No newline at end of file
+    <string name="cd_voice_input">音声入力</string>
+    <string name="cd_narrow_frame_widen_button">キーボードを表示</string>
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-ja/strings.xml b/src/android/static_resources/resources_oss/res/values-ja/strings.xml
index f40592e..5f74409 100644
--- a/src/android/static_resources/resources_oss/res/values-ja/strings.xml
+++ b/src/android/static_resources/resources_oss/res/values-ja/strings.xml
@@ -36,6 +36,15 @@
     <string name="pref_software_keyboard_category_title">ソフトウェアキーボードの設定</string>
         <string name="pref_software_keyboard_advanced_settings_title">ソフトウェアキーボードの詳細設定</string>
 
+    <!-- Fragment preference titles -->
+    <string name="pref_fragment_software_keyboard_title">ソフトウェアキーボード</string>
+    <string name="pref_fragment_input_support_title">入力サポート</string>
+    <string name="pref_fragment_conversion_title">変換</string>
+    <string name="pref_fragment_dictionary_title">辞書</string>
+    <string name="pref_fragment_user_feedback_title">ユーザフィードバック</string>
+    <string name="pref_fragment_about_title">概要</string>
+    <string name="pref_fragment_development_title">開発</string>
+
     <string name="pref_software_keyboard_preferences_portrait_title">縦画面のソフトウェアキーボード設定</string>
     <string name="pref_software_keyboard_preferences_landscape_title">横画面のソフトウェアキーボード設定</string>
         <!-- Following entries are for configuration_dependent_preferences -->
@@ -53,8 +62,9 @@
         <string name="pref_popup_feedback_title">キー押下時ポップアップ</string>
     <string name="pref_other_input_support_preference_category_title">その他の入力サポートの設定</string>
         <string name="pref_fullscreen_title">フルスクリーンモード</string>
-        <string name="pref_skin_type_title">スキンの選択</string>
+        <string name="pref_skin_type_title">キーボードテーマの選択</string>
         <string name="pref_hardware_title">ハードウェアキーボードの設定</string>
+        <string name="pref_voice_input_title">音声入力ボタン</string>
     <string name="pref_conversion_category_title">変換の設定</string>
         <string name="pref_layout_adjustment_title">左右寄せ</string>
         <string name="pref_space_character_form_title">常に半角スペースを使う</string>
@@ -76,6 +86,7 @@
         <string name="pref_about_terms_of_service_title">モバイル利用規約</string>
         <string name="pref_about_privacy_policy_title">プライバシーポリシー</string>
         <string name="pref_about_oss_credits_title">オープンソースソフトウェア</string>
+        <string name="pref_launcher_icon_visibility_title">アイコンを表示する</string>
 
     <!-- Preference description -->
     <!-- Configuration Dependent Preferences -->
@@ -100,7 +111,8 @@
         <string name="pref_kana_modifier_insensitive_conversion_description">濁点、半濁点、小文字化を省略しても自動的に補って変換します。ケータイ配列とGodanキーボードの時に有効になります。例)かつこう→学校</string>
         <string name="pref_typing_correction_description">誤入力を検出して、正しいと思われる候補を表示します。例)すんかい→深海</string>
         <string name="pref_emoji_provider_type_description">絵文字を使う際の事業者を選択します。</string>
-        <string name="pref_skin_type_description">ソフトウェアキーボードのスキンを選択します。</string>
+        <string name="pref_skin_type_description">ソフトウェアキーボードのテーマを選択します。</string>
+        <string name="pref_voice_input_description">音声入力ボタンをキーボードに表示します。</string>
     <!-- Hardware Keyboard -->
         <string name="pref_hardware_keymap_description">ハードウェアキーボードの種類を選択します。</string>
     <!-- Dictionary -->
@@ -117,6 +129,7 @@
         <string name="pref_about_terms_of_service_description">モバイル利用規約を表示します(ウェブページ)。</string>
         <string name="pref_about_privacy_policy_description">プライバシーポリシーを表示します(ウェブページ)。</string>
         <string name="pref_about_oss_credits_description">本ソフトウェアはオープンソースソフトウェアを利用しています。</string>
+        <string name="pref_launcher_icon_visibility_description">アプリケーション一覧にアイコンを表示します。</string>
 
     <!-- Preference Values -->
     <string name="pref_input_style_setting_entry_toggle">ケータイ打ち</string>
@@ -135,14 +148,13 @@
     <string name="pref_skin_type_orange_lightgray">オレンジ/ライトグレー</string>
     <string name="pref_skin_type_blue_lightgray">ブルー/ライトグレー</string>
     <string name="pref_skin_type_blue_darkgray">ブルー/ダークグレー</string>
+    <string name="pref_skin_type_material_design_light">マテリアル デザイン(ライト)</string>
+    <string name="pref_skin_type_material_design_dark">マテリアル デザイン(ダーク)</string>
 
     <string name="pref_hardware_keymap_default">システム配列</string>
     <string name="pref_hardware_keymap_japanese109A">日本語109A配列</string>
     <string name="pref_hardware_keymap_twelvekey">ケータイ配列</string>
 
-    <!-- Preference url -->
-    <string name="pref_oss_credits_url">file:///android_asset/credits_ja.html</string>
-
     <string name="pref_layout_adjustment_entry_fill">全幅</string>
     <string name="pref_layout_adjustment_entry_right">右寄せ</string>
     <string name="pref_layout_adjustment_entry_left">左寄せ</string>
@@ -177,32 +189,10 @@
     <string name="symbol_input_no_history">まだ履歴がありません。\n\n右にスライドして\n候補を選んでください。</string>
     <string name="symbol_emoji_disabled_message">この入力先には、\n絵文字を入力できません。</string>
 
-    <string name="symbol_minor_symbol_history_title">履歴</string>
-    <string name="symbol_minor_symbol_general_title">一般\n記号</string>
-    <string name="symbol_minor_symbol_half_title">半角\n全角</string>
-    <string name="symbol_minor_symbol_parenthesis_title">括弧\n罫線</string>
-    <string name="symbol_minor_symbol_arrow_title">矢印\n数字</string>
-    <string name="symbol_minor_symbol_math_title">数式\n単位</string>
-
-    <string name="symbol_minor_emoticon_history_title">履歴</string>
-    <string name="symbol_minor_emoticon_smile_title">喜\n(^^)</string>
-    <string name="symbol_minor_emoticon_sweat_title">焦\n(^^;)</string>
-    <string name="symbol_minor_emoticon_surprise_title">驚\n(゜д゜)</string>
-    <string name="symbol_minor_emoticon_sadness_title">悲\n(T_T)</string>
-    <string name="symbol_minor_emoticon_displeasure_title">怒\n(-_-)</string>
-
-    <string name="symbol_minor_emoji_history_title">履歴</string>
-    <string name="symbol_minor_emoji_face_title">表情\n感情</string>
-    <string name="symbol_minor_emoji_food_title">食事\n遊び</string>
-    <string name="symbol_minor_emoji_activity_title">行事\n生活</string>
-    <string name="symbol_minor_emoji_city_title">街\n仕事</string>
-    <string name="symbol_minor_emoji_nature_title">自然\n図形</string>
-
     <!--  Menu dialog -->
     <string name="menu_dialog_title">入力オプション</string>
     <string name="menu_item_input_method">入力方法の選択</string>
     <string name="menu_item_preferences">%sの設定</string>
-    <string name="menu_item_voice_input">音声入力</string>
     <string name="menu_item_mushroom">マッシュルームの起動</string>
 
     <!-- User Dictionary Tool -->
diff --git a/src/android/static_resources/resources_oss/res/values-land/config.xml b/src/android/static_resources/resources_oss/res/values-land/config.xml
deleted file mode 100644
index 3570aa9..0000000
--- a/src/android/static_resources/resources_oss/res/values-land/config.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
-  <!-- Columns per screen in symbol input view (Emoticon). -->
-  <integer name="symbol_input_candidate_columns_emoticon">6</integer>
-  <!-- Columns per screen in symbol input view (Symbol). -->
-  <integer name="symbol_input_candidate_columns_symbol">8</integer>
-  <!-- Columns per screen in symbol input view (Emoji). -->
-  <integer name="symbol_input_candidate_columns_emoji">8</integer>
-  <!-- Rows per screen in symbol input view. -->
-  <integer name="symbol_input_candidate_rows">2</integer>
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-land/dimens.xml
index af4fca5..4340828 100644
--- a/src/android/static_resources/resources_oss/res/values-land/dimens.xml
+++ b/src/android/static_resources/resources_oss/res/values-land/dimens.xml
@@ -30,13 +30,22 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <resources>
-  <dimen name="pref_inputstyle_description_width">150dip</dimen>
 
-  <dimen name="ime_window_height">@dimen/ime_window_height_landscape</dimen>
-  <dimen name="input_frame_height">165.4dip</dimen>
-  <!-- input_frame_height_width_shadow should be input_drame_height + translucent_border_height -->
-  <dimen name="input_frame_height_with_shadow">168.8dip</dimen>
+    <dimen name="pref_inputstyle_description_width">150dip</dimen>
 
-  <dimen name="symbol_view_minor_category_tab_widget_height">40dip</dimen>
+    <dimen name="ime_window_height">206dip</dimen>
+
+    <dimen name="input_frame_height">166dip</dimen>
+    <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+    <dimen name="symbol_view_height">206dip</dimen>
+    <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+    <dimen name="symbol_view_number_keyboard_height">111dip</dimen>
+    <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+    <dimen name="symbol_view_major_category_height">41.5dip</dimen>
+
+    <dimen name="symbol_view_symbol_min_column_width">67dip</dimen>
+    <dimen name="symbol_view_emoticon_min_column_width">100dip</dimen>
+    <dimen name="symbol_view_emoji_min_column_width">67dip</dimen>
+    <dimen name="symbol_candidate_horizontal_padding_size">10dip</dimen>
 
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values-land/strings.xml b/src/android/static_resources/resources_oss/res/values-land/strings.xml
deleted file mode 100644
index 6669e78..0000000
--- a/src/android/static_resources/resources_oss/res/values-land/strings.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
-    <string name="symbol_minor_symbol_history_title">History</string>
-    <string name="symbol_minor_symbol_general_title">General\nSymbol</string>
-    <string name="symbol_minor_symbol_half_title">Half-width\nFull-width</string>
-    <string name="symbol_minor_symbol_parenthesis_title">Parenthesis\nRule</string>
-    <string name="symbol_minor_symbol_arrow_title">Arrow\nNumber</string>
-    <string name="symbol_minor_symbol_math_title">Math\nUnit</string>
-
-    <string name="symbol_minor_emoticon_history_title">History</string>
-    <string name="symbol_minor_emoticon_smile_title">Smile\n(^^)</string>
-    <string name="symbol_minor_emoticon_sweat_title">Sweat\n(^^;)</string>
-    <string name="symbol_minor_emoticon_surprise_title">Surprize\n(゜д゜)</string>
-    <string name="symbol_minor_emoticon_sadness_title">Sadness\n(T_T)</string>
-    <string name="symbol_minor_emoticon_displeasure_title">Displeasure\n(-_-)</string>
-
-    <string name="symbol_minor_emoji_history_title">History</string>
-    <string name="symbol_minor_emoji_face_title">Face\nEmotion</string>
-    <string name="symbol_minor_emoji_food_title">Food\nPlay</string>
-    <string name="symbol_minor_emoji_activity_title">Activity\nLife</string>
-    <string name="symbol_minor_emoji_city_title">City\nWork</string>
-    <string name="symbol_minor_emoji_nature_title">Nature\nFigure</string>
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v16/bools.xml b/src/android/static_resources/resources_oss/res/values-v16/bools.xml
new file mode 100644
index 0000000..cab981a
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v16/bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <bool name="enable_user_dictionary_export">true</bool>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v21/strings.xml b/src/android/static_resources/resources_oss/res/values-v21/strings.xml
new file mode 100644
index 0000000..b750846
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v21/strings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+    <string name="pref_skin_type_default">MATERIAL_DESIGN_LIGHT</string>
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v21/themes.xml b/src/android/static_resources/resources_oss/res/values-v21/themes.xml
new file mode 100644
index 0000000..5dc78f6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v21/themes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <style name="AppThemeSelector" parent="android:Theme.DeviceDefault.Light"/>
+    <style name="AppThemeSelectorSettings" parent="android:Theme.DeviceDefault.Settings"/>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/application.xml b/src/android/static_resources/resources_oss/res/values/application.xml
index 9418083..c9dab5b 100644
--- a/src/android/static_resources/resources_oss/res/values/application.xml
+++ b/src/android/static_resources/resources_oss/res/values/application.xml
@@ -30,26 +30,8 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <resources>
-
     <string name="app_name">Mozc</string>
     <string name="app_full_name">Mozc for Android</string>
     <string name="developer_organization">Mozc Project Team</string>
     <string name="mozc_preference">Preferences for Mozc</string>
-    <string name="pref_about_terms_of_service_url">http://code.google.com/p/mozc/</string>
-    <string name="pref_about_privacy_policy_url">http://code.google.com/p/mozc/</string>
-    <!--
-    MiniBrowser can access only the url which matches below pattern.
-    This restriction is introduced in order not to show unexpected website in "EULA" activity.
-    By default no restriction is applied in order to avoid from breaking existing implemntation.
-    -->
-    <string name="pref_url_restriction_regex">.*</string>
-    <string name="user_dictionary_tool_export_provider_name">org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryExportProvider</string>
-
-    <!--
-      If you developer want to activate usage stats collection feature, turn the property on
-      and change the URL in usage_stats/upload_util.cc.
-      However usually you don't need the feature so please keep this false as long as possible.
-    -->
-    <bool name="sending_information_features_enabled">false</bool>
-
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/arrays.xml b/src/android/static_resources/resources_oss/res/values/arrays.xml
index 501cc7c..80fa0a9 100644
--- a/src/android/static_resources/resources_oss/res/values/arrays.xml
+++ b/src/android/static_resources/resources_oss/res/values/arrays.xml
@@ -73,28 +73,14 @@
     <item>pref_landscape_fullscreen_key</item>
   </string-array>
 
-  <string-array name="pref_skin_type_entries">
-    <item>@string/pref_skin_type_blue_lightgray</item>
-    <item>@string/pref_skin_type_orange_lightgray</item>
-    <item>@string/pref_skin_type_blue_darkgray</item>
-  </string-array>
-
-  <string-array name="pref_skin_type_values">
-    <item>BLUE_LIGHTGRAY</item>
-    <item>ORANGE_LIGHTGRAY</item>
-    <item>BLUE_DARKGRAY</item>
-  </string-array>
-
   <string-array name="pref_hardware_keymap_entries">
     <item>@string/pref_hardware_keymap_default</item>
     <item>@string/pref_hardware_keymap_japanese109A</item>
-    <item>@string/pref_hardware_keymap_twelvekey</item>
   </string-array>
 
   <string-array name="pref_hardware_keymap_values">
     <item>DEFAULT</item>
     <item>JAPANESE109A</item>
-    <item>TWELVEKEY</item>
   </string-array>
 
   <string-array name="pref_dictionary_personalization_entries">
diff --git a/src/android/static_resources/resources_oss/res/values/arrays_skin.xml b/src/android/static_resources/resources_oss/res/values/arrays_skin.xml
new file mode 100644
index 0000000..129d651
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/arrays_skin.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<resources>
+
+    <!-- TODO(matsuzakit): Create new arrays_skin.xml into values-v20?v21? and remove material design from this file. -->
+    <string-array name="pref_skin_type_entries">
+        <item>@string/pref_skin_type_blue_lightgray</item>
+        <item>@string/pref_skin_type_orange_lightgray</item>
+        <item>@string/pref_skin_type_blue_darkgray</item>
+        <item>@string/pref_skin_type_material_design_light</item>
+        <item>@string/pref_skin_type_material_design_dark</item>
+    </string-array>
+    <string-array name="pref_skin_type_values">
+        <item>BLUE_LIGHTGRAY</item>
+        <item>ORANGE_LIGHTGRAY</item>
+        <item>BLUE_DARKGRAY</item>
+        <item>MATERIAL_DESIGN_LIGHT</item>
+        <item>MATERIAL_DESIGN_DARK</item>
+    </string-array>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/attrs.xml b/src/android/static_resources/resources_oss/res/values/attrs.xml
index 27f26bf..0cd5fec 100644
--- a/src/android/static_resources/resources_oss/res/values/attrs.xml
+++ b/src/android/static_resources/resources_oss/res/values/attrs.xml
@@ -55,20 +55,28 @@
       <enum name="qwertyRegular" value="3" />
       <enum name="qwertyFunction" value="4" />
       <enum name="qwertyFunctionWithThreeDots" value="5" />
-      <enum name="qwertyFunctionLightOn" value="6" />
-      <enum name="qwertyFunctionLightOff" value="7" />
+      <enum name="qwertyFunctionSpaceWithThreeDots" value="6" />
+      <enum name="keyboardSeparatorTop" value="7" />
+      <enum name="keyboardSeparatorCenter" value="8" />
+      <enum name="keyboardSeparatorBottom" value="9" />
+      <enum name="transparent" value="10" />
     </attr>
 
     <attr name="keyWidth" format="dimension|fraction" />
     <attr name="keyHeight" format="dimension|fraction" />
+    <attr name="keyHorizontalLayoutWeight" format="integer" />
     <attr name="horizontalGap" format="dimension|fraction" />
     <attr name="verticalGap" format="dimension|fraction" />
-
-    <attr name="popUpWidth" format="dimension|fraction" />
+    <attr name="defaultIconWidth" format="dimension|fraction" />
+    <attr name="defaultIconHeight" format="dimension|fraction" />
+    <attr name="defaultHorizontalPadding" format="dimension|fraction" />
+    <attr name="defaultVerticalPadding" format="dimension|fraction" />
     <attr name="popUpHeight" format="dimension|fraction" />
     <!-- following offset is diff between a center of a key and a center of the popup window. -->
     <attr name="popUpXOffset" format="dimension|fraction" />
     <attr name="popUpYOffset" format="dimension|fraction" />
+    <attr name="popUpIconWidth" format="dimension|fraction" />
+    <attr name="popUpIconHeight" format="dimension|fraction" />
   </declare-styleable>
 
   <declare-styleable name="Row">
@@ -90,7 +98,6 @@
     </attr>
     <attr name="isRepeatable" format="boolean" />
     <attr name="isModifier" format="boolean" />
-    <attr name="isSticky" format="boolean" />
   </declare-styleable>
 
   <declare-styleable name="KeyState">
@@ -117,9 +124,19 @@
       <flag name="variation_uri" value="1024" />
       <flag name="variation_email_address" value="2048" />
 
+      <!-- globe and no_globe are XOR. -->
       <flag name="globe" value="4096" />
+      <flag name="no_globe" value="8192" />
 
-      <flag name="composing" value="8192" />
+      <flag name="composing" value="16384" />
+      <flag name="handling_touch_event" value="32768" />
+
+      <!-- "fallback" works as "catch all" when no other flags are matched.
+           metaState="fallback" equals to metaState="" so typically
+           this flag is not specified explicity.
+           However this is useful when used with logical-OR operator.
+           e.g., metaState="fallback|composing" -->
+      <flag name="fallback" value="1073741824" />
     </attr>
     <attr name="nextMetaState">
       <!-- TODO(matsuzakit): Rename to nextAddedMetaStates -->
@@ -132,7 +149,7 @@
       <flag name="capsLock" value="2" />
       <flag name="alt" value="4" />
     </attr>
-    </declare-styleable>
+  </declare-styleable>
 
   <declare-styleable name="Flick">
     <attr name="direction">
@@ -149,12 +166,39 @@
     <attr name="sourceId" format="integer" />
     <attr name="keyCode" format="integer|string" />
     <attr name="longPressKeyCode" format="integer|string" />
+    <attr name="longPressTimeoutTrigger" format="boolean" />
     <attr name="keyIcon" format="reference" />
     <attr name="keyCharacter" format="string" />
     <attr name="flickHighlight" format="boolean" />
-  </declare-styleable>
+    <attr name="horizontalPadding" format="fraction" />
+    <attr name="verticalPadding" format="fraction" />
+    <!-- iconWidth/Height are used to control the size of shown icon.
+         The region on which an icon is shown is detemined in below way:
+         1. The region is initially given by keyboard parser (Size: Key width x Row height).
+         2. The region is shrinked by horizontal/verticalPadding.
+         3. If (iconWidth > region_width OR iconHeight > region_height),
+            the icon is drawn in the region (iconWidth/Height is not used).
+            If not, the icon is shown in the size (iconHeight, iconWidth).
+         4. Aspect ratio is always kept.
+         The default values are too large so
+         if not provided the icon is drawn as large as possible. -->
+    <attr name="iconHeight" format="fraction|dimension" />
+    <attr name="iconWidth" format="fraction|dimension" />
+    </declare-styleable>
 
   <declare-styleable name="PopUp">
     <attr name="popUpIcon" format="reference" />
+    <attr name="popUpLongPressIcon" format="reference" />
+  </declare-styleable>
+
+  <declare-styleable name="Skin">
+    <attr name="dimension" format="dimension|fraction|reference" />
+  </declare-styleable>
+
+  <declare-styleable name="MozcImageView">
+    <!-- Drawable represened as raw resource must be specified through "rawSrc" attribute. -->
+    <attr name="rawSrc" format="reference" />
+    <attr name="maxImageWidth" format="dimension" />
+    <attr name="maxImageHeight" format="dimension" />
   </declare-styleable>
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/bools.xml b/src/android/static_resources/resources_oss/res/values/bools.xml
index 3417c7f..c4279eb 100644
--- a/src/android/static_resources/resources_oss/res/values/bools.xml
+++ b/src/android/static_resources/resources_oss/res/values/bools.xml
@@ -32,6 +32,8 @@
 <resources>
 
     <bool name="im_is_default">false</bool>
-    <bool name="enable_user_dictionary_tools_activity">true</bool>
+    <!-- Note: User dictionary export is enabled from v16 due to the bug in v14 framework.  -->
+    <!-- See values-v16/bools.xml. -->
+    <bool name="enable_user_dictionary_export">false</bool>
 
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/colors.xml b/src/android/static_resources/resources_oss/res/values/colors.xml
index 5fea831..bd40aa8 100644
--- a/src/android/static_resources/resources_oss/res/values/colors.xml
+++ b/src/android/static_resources/resources_oss/res/values/colors.xml
@@ -34,13 +34,6 @@
   <color name="pref_inputstyle_title_disabled">#80D8D8D8</color>
   <color name="symbol_input_background_top" >#D8D8D8</color>
   <color name="symbol_input_background_bottom" >#ABABAB</color>
-  <color name="symbol_view_tab_background">#E5E5E5</color>
-
-  <!-- This color is used only by QWERTY keyboard
-           because only it has span between keys. -->
-  <color name="keyboard_background">#524C51</color>
-  <!--  TODO(matsuzakit): Background color is TBD. -->
-  <color name="candidate_background">#C6C6C6</color>
   <color name="input_frame_background">#e5e5e5</color>
 
   <!-- Color setting of "action bar"-like UI for User Dictionary Tool. -->
@@ -48,7 +41,17 @@
   <color name="action_bar_background_shade">#CCC</color>
   <color name="action_bar_pressed_background">#77C5E1</color>
 
-  <color name="dropshadow_start">#50000000</color>
-  <color name="dropshadow_end">#00000000</color>
+  <!-- Floating candidate window. -->
+  <color name="floating_candidate_window_background">#eceff1</color>
+  <color name="floating_candidate_text">#cc37474f</color>
+  <color name="floating_candidate_focus_background">#1a37474f</color>
+  <color name="floating_candidate_focused_text">#000</color>
+  <color name="floating_candidate_shortcut_text">#8037474f</color>
+  <color name="floating_candidate_description_text">#8037474f</color>
+  <color name="floating_candidate_footer_icon_pressed_background">#1a37474f</color>
+  <color name="floating_candidate_footer_text">#8037474f</color>
+  <color name="floating_candidate_footer_separator">#4d37474f</color>
+  <color name="floating_candidate_scroll_indicator">#4db6ac</color>
+  <color name="floating_candidate_shadow">#9937474f</color>
 
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/config.xml b/src/android/static_resources/resources_oss/res/values/config.xml
index 04f9222..97e8e78 100644
--- a/src/android/static_resources/resources_oss/res/values/config.xml
+++ b/src/android/static_resources/resources_oss/res/values/config.xml
@@ -44,8 +44,6 @@
   <integer name="input_frame_expand_overshoot_rate">30000</integer>
   <!-- Overshoot duration rate for expanding input frame in ppm -->
   <integer name="input_frame_expand_overshoot_duration_rate">400000</integer>
-  <!-- The threshold velocity of snapping input window. -->
-  <integer name="input_frame_snap_velocity_threshold">100</integer>
   <!-- Duration for fading in/out of candidate frame (in pixels/sec). -->
   <integer name="candidate_frame_transition_duration">100</integer>
   <!-- Candidate window scroll animation : Velocity decay rate in ppm -->
@@ -57,25 +55,9 @@
   <!-- Symbol input window scroll animation : Minimum velocity in pixels per sec -->
   <integer name="symbol_input_scroller_minimum_velocity">500</integer>
   <!-- Symbol input window : The duration of the animation when a sub-category changes, in ms. -->
-  <integer name="symbol_input_slide_to_next_category_duration">200</integer>
 
-  <!-- Columns per screen in symbol input view (Emoticon). -->
-  <integer name="symbol_input_candidate_columns_emoticon">4</integer>
-  <!-- Columns per screen in symbol input view (Symbol). -->
-  <integer name="symbol_input_candidate_columns_symbol">5</integer>
-  <!-- Columns per screen in symbol input view (Emoji). -->
-  <integer name="symbol_input_candidate_columns_emoji">5</integer>
-  <!-- Rows per screen in symbol input view. -->
-  <integer name="symbol_input_candidate_rows">4</integer>
-  <!-- Transition duration of symbol input (in) -->
-  <integer name="symbol_input_transition_duration_in">200</integer>
-  <!-- Transition duration of symbol input (out) -->
-  <integer name="symbol_input_transition_duration_out">100</integer>
-  <!--  Configurations used by the classed from LatinIME -->
-  <integer name="config_delay_before_preview">0</integer>
-  <integer name="config_delay_after_preview">10</integer>
-  <integer name="config_keyboard_grid_width">8</integer>
-  <integer name="config_keyboard_grid_height">8</integer>
+  <!-- Transition duration of symbol input -->
+  <integer name="symbol_input_transition_duration">50</integer>
 
   <!-- Configurations for key event timing (in milliseconds). -->
   <integer name="config_repeat_key_delay">400</integer>
@@ -88,4 +70,9 @@
   <!-- Duration for fading in/out of candidate frame (in pixels/sec). -->
   <integer name="layout_adjustment_transition_duration">200</integer>
 
+  <integer name="floating_candidate_candidate_num">5</integer>
+  <integer name="floating_mode_indicator_in_duration">50</integer>
+  <integer name="floating_mode_indicator_out_duration">100</integer>
+  <integer name="floating_mode_indicator_display_time">420</integer>
+
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/contentdescription.xml b/src/android/static_resources/resources_oss/res/values/contentdescription.xml
index 7bd3534..b9f9d54 100644
--- a/src/android/static_resources/resources_oss/res/values/contentdescription.xml
+++ b/src/android/static_resources/resources_oss/res/values/contentdescription.xml
@@ -44,186 +44,185 @@
          so explicitly "じー" is used instead.
     -->
 
-    <string name="cd_key_shift">shift</string>
-    <string name="cd_key_up">up</string>
-    <string name="cd_key_left">left</string>
-    <string name="cd_key_right">right</string>
-    <string name="cd_key_down">down</string>
-    <string name="cd_key_chartype_to_kana">switch to Kana keyboard</string>
-    <string name="cd_key_chartype_to_123">switch to number keyboard</string>
-    <string name="cd_key_chartype_to_abc">switch to Alphabet keyboard</string>
-    <string name="cd_key_chartype_to_kana_123">switch to symbol keyboard</string>
-    <string name="cd_key_chartype_to_abc_123">switch to symbol keyboard</string>
-    <string name="cd_key_undo">undo</string>
-    <string name="cd_key_symbol">symbol input screen</string>
-    <string name="cd_key_alt">alternative symbols</string>
-    <string name="cd_key_alt_unmodified">normal symbols</string>
-    <string name="cd_key_capslock">caps lock</string>
-    <string name="cd_key_capsunlock">caps unlock</string>
-    <string name="cd_key_menu_dialog">open menu</string>
-    <string name="cd_key_ime_picker_dialog">switch input method</string>
-    <string name="cd_key_uchar_backspace">backspace</string>
-    <string name="cd_key_uchar_linefeed">linefeed</string>
-    <string name="cd_key_uchar_space">space</string>
-    <string name="cd_key_uchar_exclamation_mark">exclamation mark</string>
-    <string name="cd_key_uchar_quotation_mark">quotation mark</string>
-    <string name="cd_key_uchar_number_sign">number sign</string>
-    <string name="cd_key_uchar_dollar_sign">dollar sign</string>
-    <string name="cd_key_uchar_percent_sign">percent sign</string>
-    <string name="cd_key_uchar_ampersand">ampersand</string>
-    <string name="cd_key_uchar_apostrophe">apostrophe</string>
-    <string name="cd_key_uchar_left_parenthesis">left parenthesis</string>
-    <string name="cd_key_uchar_right_parenthesis">right parenthesis</string>
-    <string name="cd_key_uchar_asterisk">asterisk</string>
-    <string name="cd_key_uchar_plus_sign">plus sign</string>
-    <string name="cd_key_uchar_comma">comma</string>
-    <string name="cd_key_uchar_hyphen_minus">hyphen</string>
-    <string name="cd_key_uchar_full_stop">period</string>
-    <string name="cd_key_uchar_solidus">slash</string>
-    <string name="cd_key_uchar_digit_zero">0</string>
-    <string name="cd_key_uchar_digit_one">1</string>
-    <string name="cd_key_uchar_digit_two">2</string>
-    <string name="cd_key_uchar_digit_three">3</string>
-    <string name="cd_key_uchar_digit_four">4</string>
-    <string name="cd_key_uchar_digit_five">5</string>
-    <string name="cd_key_uchar_digit_six">6</string>
-    <string name="cd_key_uchar_digit_seven">7</string>
-    <string name="cd_key_uchar_digit_eight">8</string>
-    <string name="cd_key_uchar_digit_nine">9</string>
-    <string name="cd_key_uchar_colon">colon</string>
-    <string name="cd_key_uchar_semicolon">semicolon</string>
-    <string name="cd_key_uchar_less_than_sign">less than sign</string>
-    <string name="cd_key_uchar_equals_sign">equals sign</string>
-    <string name="cd_key_uchar_greater_than_sign">greater than sign</string>
-    <string name="cd_key_uchar_question_mark">question mark</string>
-    <string name="cd_key_uchar_commercial_at">at mark</string>
-    <string name="cd_key_uchar_latin_capital_letter_a">A</string>
-    <string name="cd_key_uchar_latin_capital_letter_b">B</string>
-    <string name="cd_key_uchar_latin_capital_letter_c">C</string>
-    <string name="cd_key_uchar_latin_capital_letter_d">D</string>
-    <string name="cd_key_uchar_latin_capital_letter_e">E</string>
-    <string name="cd_key_uchar_latin_capital_letter_f">F</string>
-    <string name="cd_key_uchar_latin_capital_letter_g">G</string>
-    <string name="cd_key_uchar_latin_capital_letter_h">H</string>
-    <string name="cd_key_uchar_latin_capital_letter_i">I</string>
-    <string name="cd_key_uchar_latin_capital_letter_j">J</string>
-    <string name="cd_key_uchar_latin_capital_letter_k">K</string>
-    <string name="cd_key_uchar_latin_capital_letter_l">L</string>
-    <string name="cd_key_uchar_latin_capital_letter_m">M</string>
-    <string name="cd_key_uchar_latin_capital_letter_n">N</string>
-    <string name="cd_key_uchar_latin_capital_letter_o">O</string>
-    <string name="cd_key_uchar_latin_capital_letter_p">P</string>
-    <string name="cd_key_uchar_latin_capital_letter_q">Q</string>
-    <string name="cd_key_uchar_latin_capital_letter_r">R</string>
-    <string name="cd_key_uchar_latin_capital_letter_s">S</string>
-    <string name="cd_key_uchar_latin_capital_letter_t">T</string>
-    <string name="cd_key_uchar_latin_capital_letter_u">U</string>
-    <string name="cd_key_uchar_latin_capital_letter_v">V</string>
-    <string name="cd_key_uchar_latin_capital_letter_w">W</string>
-    <string name="cd_key_uchar_latin_capital_letter_x">X</string>
-    <string name="cd_key_uchar_latin_capital_letter_y">Y</string>
-    <string name="cd_key_uchar_latin_capital_letter_z">Z</string>
-    <string name="cd_key_uchar_left_square_bracket">left square bracket</string>
-    <string name="cd_key_uchar_reverse_solidus">back slash</string>
-    <string name="cd_key_uchar_right_square_bracket">right square bracket</string>
-    <string name="cd_key_uchar_circumflex_accent">hat</string>
-    <string name="cd_key_uchar_low_line">under score</string>
-    <string name="cd_key_uchar_grave_accent">grave</string>
-    <string name="cd_key_uchar_latin_small_letter_a">a</string>
-    <string name="cd_key_uchar_latin_small_letter_b">b</string>
-    <string name="cd_key_uchar_latin_small_letter_c">c</string>
-    <string name="cd_key_uchar_latin_small_letter_d">d</string>
-    <string name="cd_key_uchar_latin_small_letter_e">e</string>
-    <string name="cd_key_uchar_latin_small_letter_f">f</string>
-    <string name="cd_key_uchar_latin_small_letter_g">g</string>
-    <string name="cd_key_uchar_latin_small_letter_h">h</string>
-    <string name="cd_key_uchar_latin_small_letter_i">i</string>
-    <string name="cd_key_uchar_latin_small_letter_j">j</string>
-    <string name="cd_key_uchar_latin_small_letter_k">k</string>
-    <string name="cd_key_uchar_latin_small_letter_l">l</string>
-    <string name="cd_key_uchar_latin_small_letter_m">m</string>
-    <string name="cd_key_uchar_latin_small_letter_n">n</string>
-    <string name="cd_key_uchar_latin_small_letter_o">o</string>
-    <string name="cd_key_uchar_latin_small_letter_p">p</string>
-    <string name="cd_key_uchar_latin_small_letter_q">q</string>
-    <string name="cd_key_uchar_latin_small_letter_r">r</string>
-    <string name="cd_key_uchar_latin_small_letter_s">s</string>
-    <string name="cd_key_uchar_latin_small_letter_t">t</string>
-    <string name="cd_key_uchar_latin_small_letter_u">u</string>
-    <string name="cd_key_uchar_latin_small_letter_v">v</string>
-    <string name="cd_key_uchar_latin_small_letter_w">w</string>
-    <string name="cd_key_uchar_latin_small_letter_x">x</string>
-    <string name="cd_key_uchar_latin_small_letter_y">y</string>
-    <string name="cd_key_uchar_latin_small_letter_z">z</string>
-    <string name="cd_key_uchar_left_curly_bracket">left curly bracket</string>
-    <string name="cd_key_uchar_vertical_line">vertical line</string>
-    <string name="cd_key_uchar_right_curly_bracket">right curly bracket</string>
-    <string name="cd_key_uchar_tilde">tilde</string>
+    <string name="cd_key_shift" translation_description="When 'Shift' key in the keyboard is pressed, this string is spoken up for accessibility">shift</string>
+    <string name="cd_key_up" translation_description="When 'Up' arrow key in the keyboard is pressed, this string is spoken up for accessibility">up</string>
+    <string name="cd_key_left" translation_description="When 'Left' arrow key in the keyboard is pressed, this string is spoken up for accessibility">left</string>
+    <string name="cd_key_right" translation_description="When 'Right' arrow key in the keyboard is pressed, this string is spoken up for accessibility">right</string>
+    <string name="cd_key_down" translation_description="When 'Down' arrow key in the keyboard is pressed, this string is spoken up for accessibility">down</string>
+    <string name="cd_key_chartype_to_kana" translation_description="When the keyboard is switched to the 'Kana' (Japanese phonogram) mode, this string is spoken up for accessibility">switch to Kana keyboard</string>
+    <string name="cd_key_chartype_to_abc" translation_description="When the keyboard is switched to the 'Alphabet' mode, this string is spoken up for accessibility">switch to Alphabet keyboard</string>
+    <string name="cd_key_chartype_to_abc_123" translation_description="When the keyboard is switched to the 'Symbol' mode, this string is spoken up for accessibility">switch to symbol keyboard</string>
+    <string name="cd_key_undo" translation_description="When 'Undo' key in the keyboard is pressed, this string is spoken up for accessibility">undo</string>
+    <string name="cd_key_symbol" translation_description="When 'Symbol' key in the keyboard is pressed, this string is spoken up for accessibility">symbol input screen</string>
+    <string name="cd_key_alt" translation_description="When the keyboard is switched into alternative symbol mode, this string is spoken up for accessibility">alternative symbols</string>
+    <string name="cd_key_alt_unmodified" translation_description="When the keyboard is swtiched back from alternative symbol mode to normal symbole mode, this string is spoken up for accessibility">normal symbols</string>
+    <string name="cd_key_capslock" translation_description="When the keyboard is switched into caps lock mode, this string is spoken up for accessibility">caps lock</string>
+    <string name="cd_key_capsunlock" translation_description="When the keyboard is swtiched back from caps lock mode to normal mode, this string is spoken up for accessibility">caps unlock</string>
+    <string name="cd_key_menu_dialog" translation_description="When the menu dialog is opened, this string is spoken up for accessibility.  'Open' is a verb.">open menu</string>
+    <string name="cd_key_globe" translation_description="When the input method is switched to another, this string is spoken up for accessibility">switch input method</string>
+    <string name="cd_key_uchar_backspace" translation_description="When 'Backspace' key in the keyboard is pressed, this string is spoken up for accessibility">backspace</string>
+    <string name="cd_key_uchar_linefeed" translation_description="When 'Linefeed' key in the keyboard is pressed, this string is spoken up for accessibility">linefeed</string>
+    <string name="cd_key_uchar_space" translation_description="When 'Space' key in the keyboard is pressed, this string is spoken up for accessibility">space</string>
+    <string name="cd_key_uchar_exclamation_mark" translation_description="When '!' key in the keyboard is pressed, this string is spoken up for accessibility">exclamation mark</string>
+    <string name="cd_key_uchar_quotation_mark" translation_description="When [&quot;] key in the keyboard is pressed, this string is spoken up for accessibility">quotation mark</string>
+    <string name="cd_key_uchar_number_sign" translation_description="When '#' key in the keyboard is pressed, this string is spoken up for accessibility">number sign</string>
+    <string name="cd_key_uchar_dollar_sign" translation_description="When '$' key in the keyboard is pressed, this string is spoken up for accessibility">dollar sign</string>
+    <string name="cd_key_uchar_percent_sign" translation_description="When '%' key in the keyboard is pressed, this string is spoken up for accessibility">percent sign</string>
+    <string name="cd_key_uchar_ampersand" translation_description="When '&amp;' key in the keyboard is pressed, this string is spoken up for accessibility">ampersand</string>
+    <string name="cd_key_uchar_apostrophe" translation_description="When [&apos;] key in the keyboard is pressed, this string is spoken up for accessibility">apostrophe</string>
+    <string name="cd_key_uchar_left_parenthesis" translation_description="When '(' key in the keyboard is pressed, this string is spoken up for accessibility">left parenthesis</string>
+    <string name="cd_key_uchar_right_parenthesis" translation_description="When ')' key in the keyboard is pressed, this string is spoken up for accessibility">right parenthesis</string>
+    <string name="cd_key_uchar_asterisk" translation_description="When '*' key in the keyboard is pressed, this string is spoken up for accessibility">asterisk</string>
+    <string name="cd_key_uchar_plus_sign" translation_description="When '+' key in the keyboard is pressed, this string is spoken up for accessibility">plus sign</string>
+    <string name="cd_key_uchar_comma" translation_description="When ',' key in the keyboard is pressed, this string is spoken up for accessibility">comma</string>
+    <string name="cd_key_uchar_hyphen_minus" translation_description="When '-' key in the keyboard is pressed, this string is spoken up for accessibility">hyphen</string>
+    <string name="cd_key_uchar_full_stop" translation_description="When '.' key in the keyboard is pressed, this string is spoken up for accessibility">period</string>
+    <string name="cd_key_uchar_solidus" translation_description="When '/' key in the keyboard is pressed, this string is spoken up for accessibility">slash</string>
+    <string name="cd_key_uchar_digit_zero" translation_description="When '0' key in the keyboard is pressed, this string is spoken up for accessibility">0</string>
+    <string name="cd_key_uchar_digit_one" translation_description="When '1' key in the keyboard is pressed, this string is spoken up for accessibility">1</string>
+    <string name="cd_key_uchar_digit_two" translation_description="When '2' key in the keyboard is pressed, this string is spoken up for accessibility">2</string>
+    <string name="cd_key_uchar_digit_three" translation_description="When '3' key in the keyboard is pressed, this string is spoken up for accessibility">3</string>
+    <string name="cd_key_uchar_digit_four" translation_description="When '4' key in the keyboard is pressed, this string is spoken up for accessibility">4</string>
+    <string name="cd_key_uchar_digit_five" translation_description="When '5' key in the keyboard is pressed, this string is spoken up for accessibility">5</string>
+    <string name="cd_key_uchar_digit_six" translation_description="When '6' key in the keyboard is pressed, this string is spoken up for accessibility">6</string>
+    <string name="cd_key_uchar_digit_seven" translation_description="When '7' key in the keyboard is pressed, this string is spoken up for accessibility">7</string>
+    <string name="cd_key_uchar_digit_eight" translation_description="When '8' key in the keyboard is pressed, this string is spoken up for accessibility">8</string>
+    <string name="cd_key_uchar_digit_nine" translation_description="When '9' key in the keyboard is pressed, this string is spoken up for accessibility">9</string>
+    <string name="cd_key_uchar_colon" translation_description="When ':' key in the keyboard is pressed, this string is spoken up for accessibility">colon</string>
+    <string name="cd_key_uchar_semicolon" translation_description="When ';' key in the keyboard is pressed, this string is spoken up for accessibility">semicolon</string>
+    <string name="cd_key_uchar_less_than_sign" translation_description="When '&lt;' key in the keyboard is pressed, this string is spoken up for accessibility">less than sign</string>
+    <string name="cd_key_uchar_equals_sign" translation_description="When '=' key in the keyboard is pressed, this string is spoken up for accessibility">equals sign</string>
+    <string name="cd_key_uchar_greater_than_sign" translation_description="When '&gt;' key in the keyboard is pressed, this string is spoken up for accessibility">greater than sign</string>
+    <string name="cd_key_uchar_question_mark" translation_description="When '?' key in the keyboard is pressed, this string is spoken up for accessibility">question mark</string>
+    <string name="cd_key_uchar_commercial_at" translation_description="When '@' key in the keyboard is pressed, this string is spoken up for accessibility">at mark</string>
+    <string name="cd_key_uchar_latin_capital_letter_a" translation_description="When 'A' key in the keyboard is pressed, this string is spoken up for accessibility">A</string>
+    <string name="cd_key_uchar_latin_capital_letter_b" translation_description="When 'B' key in the keyboard is pressed, this string is spoken up for accessibility">B</string>
+    <string name="cd_key_uchar_latin_capital_letter_c" translation_description="When 'C' key in the keyboard is pressed, this string is spoken up for accessibility">C</string>
+    <string name="cd_key_uchar_latin_capital_letter_d" translation_description="When 'D' key in the keyboard is pressed, this string is spoken up for accessibility">D</string>
+    <string name="cd_key_uchar_latin_capital_letter_e" translation_description="When 'E' key in the keyboard is pressed, this string is spoken up for accessibility">E</string>
+    <string name="cd_key_uchar_latin_capital_letter_f" translation_description="When 'F' key in the keyboard is pressed, this string is spoken up for accessibility">F</string>
+    <string name="cd_key_uchar_latin_capital_letter_g" translation_description="When 'G' key in the keyboard is pressed, this string is spoken up for accessibility">G</string>
+    <string name="cd_key_uchar_latin_capital_letter_h" translation_description="When 'H' key in the keyboard is pressed, this string is spoken up for accessibility">H</string>
+    <string name="cd_key_uchar_latin_capital_letter_i" translation_description="When 'I' key in the keyboard is pressed, this string is spoken up for accessibility">I</string>
+    <string name="cd_key_uchar_latin_capital_letter_j" translation_description="When 'J' key in the keyboard is pressed, this string is spoken up for accessibility">J</string>
+    <string name="cd_key_uchar_latin_capital_letter_k" translation_description="When 'K' key in the keyboard is pressed, this string is spoken up for accessibility">K</string>
+    <string name="cd_key_uchar_latin_capital_letter_l" translation_description="When 'L' key in the keyboard is pressed, this string is spoken up for accessibility">L</string>
+    <string name="cd_key_uchar_latin_capital_letter_m" translation_description="When 'M' key in the keyboard is pressed, this string is spoken up for accessibility">M</string>
+    <string name="cd_key_uchar_latin_capital_letter_n" translation_description="When 'N' key in the keyboard is pressed, this string is spoken up for accessibility">N</string>
+    <string name="cd_key_uchar_latin_capital_letter_o" translation_description="When 'O' key in the keyboard is pressed, this string is spoken up for accessibility">O</string>
+    <string name="cd_key_uchar_latin_capital_letter_p" translation_description="When 'P' key in the keyboard is pressed, this string is spoken up for accessibility">P</string>
+    <string name="cd_key_uchar_latin_capital_letter_q" translation_description="When 'Q' key in the keyboard is pressed, this string is spoken up for accessibility">Q</string>
+    <string name="cd_key_uchar_latin_capital_letter_r" translation_description="When 'R' key in the keyboard is pressed, this string is spoken up for accessibility">R</string>
+    <string name="cd_key_uchar_latin_capital_letter_s" translation_description="When 'S' key in the keyboard is pressed, this string is spoken up for accessibility">S</string>
+    <string name="cd_key_uchar_latin_capital_letter_t" translation_description="When 'T' key in the keyboard is pressed, this string is spoken up for accessibility">T</string>
+    <string name="cd_key_uchar_latin_capital_letter_u" translation_description="When 'U' key in the keyboard is pressed, this string is spoken up for accessibility">U</string>
+    <string name="cd_key_uchar_latin_capital_letter_v" translation_description="When 'V' key in the keyboard is pressed, this string is spoken up for accessibility">V</string>
+    <string name="cd_key_uchar_latin_capital_letter_w" translation_description="When 'W' key in the keyboard is pressed, this string is spoken up for accessibility">W</string>
+    <string name="cd_key_uchar_latin_capital_letter_x" translation_description="When 'X' key in the keyboard is pressed, this string is spoken up for accessibility">X</string>
+    <string name="cd_key_uchar_latin_capital_letter_y" translation_description="When 'Y' key in the keyboard is pressed, this string is spoken up for accessibility">Y</string>
+    <string name="cd_key_uchar_latin_capital_letter_z" translation_description="When 'Z' key in the keyboard is pressed, this string is spoken up for accessibility">Z</string>
+    <string name="cd_key_uchar_left_square_bracket" translation_description="When '[' key in the keyboard is pressed, this string is spoken up for accessibility">left square bracket</string>
+    <string name="cd_key_uchar_reverse_solidus" translation_description="When '\' key in the keyboard is pressed, this string is spoken up for accessibility">back slash</string>
+    <string name="cd_key_uchar_right_square_bracket" translation_description="When ']' key in the keyboard is pressed, this string is spoken up for accessibility">right square bracket</string>
+    <string name="cd_key_uchar_circumflex_accent" translation_description="When '^' key in the keyboard is pressed, this string is spoken up for accessibility">hat</string>
+    <string name="cd_key_uchar_low_line" translation_description="When '_' key in the keyboard is pressed, this string is spoken up for accessibility">under score</string>
+    <string name="cd_key_uchar_grave_accent" translation_description="When '`' key in the keyboard is pressed, this string is spoken up for accessibility">grave</string>
+    <string name="cd_key_uchar_latin_small_letter_a" translation_description="When 'a' key in the keyboard is pressed, this string is spoken up for accessibility">a</string>
+    <string name="cd_key_uchar_latin_small_letter_b" translation_description="When 'b' key in the keyboard is pressed, this string is spoken up for accessibility">b</string>
+    <string name="cd_key_uchar_latin_small_letter_c" translation_description="When 'c' key in the keyboard is pressed, this string is spoken up for accessibility">c</string>
+    <string name="cd_key_uchar_latin_small_letter_d" translation_description="When 'd' key in the keyboard is pressed, this string is spoken up for accessibility">d</string>
+    <string name="cd_key_uchar_latin_small_letter_e" translation_description="When 'e' key in the keyboard is pressed, this string is spoken up for accessibility">e</string>
+    <string name="cd_key_uchar_latin_small_letter_f" translation_description="When 'f' key in the keyboard is pressed, this string is spoken up for accessibility">f</string>
+    <string name="cd_key_uchar_latin_small_letter_g" translation_description="When 'g' key in the keyboard is pressed, this string is spoken up for accessibility">g</string>
+    <string name="cd_key_uchar_latin_small_letter_h" translation_description="When 'h' key in the keyboard is pressed, this string is spoken up for accessibility">h</string>
+    <string name="cd_key_uchar_latin_small_letter_i" translation_description="When 'i' key in the keyboard is pressed, this string is spoken up for accessibility">i</string>
+    <string name="cd_key_uchar_latin_small_letter_j" translation_description="When 'j' key in the keyboard is pressed, this string is spoken up for accessibility">j</string>
+    <string name="cd_key_uchar_latin_small_letter_k" translation_description="When 'k' key in the keyboard is pressed, this string is spoken up for accessibility">k</string>
+    <string name="cd_key_uchar_latin_small_letter_l" translation_description="When 'l' key in the keyboard is pressed, this string is spoken up for accessibility">l</string>
+    <string name="cd_key_uchar_latin_small_letter_m" translation_description="When 'm' key in the keyboard is pressed, this string is spoken up for accessibility">m</string>
+    <string name="cd_key_uchar_latin_small_letter_n" translation_description="When 'n' key in the keyboard is pressed, this string is spoken up for accessibility">n</string>
+    <string name="cd_key_uchar_latin_small_letter_o" translation_description="When 'o' key in the keyboard is pressed, this string is spoken up for accessibility">o</string>
+    <string name="cd_key_uchar_latin_small_letter_p" translation_description="When 'p' key in the keyboard is pressed, this string is spoken up for accessibility">p</string>
+    <string name="cd_key_uchar_latin_small_letter_q" translation_description="When 'q' key in the keyboard is pressed, this string is spoken up for accessibility">q</string>
+    <string name="cd_key_uchar_latin_small_letter_r" translation_description="When 'r' key in the keyboard is pressed, this string is spoken up for accessibility">r</string>
+    <string name="cd_key_uchar_latin_small_letter_s" translation_description="When 's' key in the keyboard is pressed, this string is spoken up for accessibility">s</string>
+    <string name="cd_key_uchar_latin_small_letter_t" translation_description="When 't' key in the keyboard is pressed, this string is spoken up for accessibility">t</string>
+    <string name="cd_key_uchar_latin_small_letter_u" translation_description="When 'u' key in the keyboard is pressed, this string is spoken up for accessibility">u</string>
+    <string name="cd_key_uchar_latin_small_letter_v" translation_description="When 'v' key in the keyboard is pressed, this string is spoken up for accessibility">v</string>
+    <string name="cd_key_uchar_latin_small_letter_w" translation_description="When 'w' key in the keyboard is pressed, this string is spoken up for accessibility">w</string>
+    <string name="cd_key_uchar_latin_small_letter_x" translation_description="When 'x' key in the keyboard is pressed, this string is spoken up for accessibility">x</string>
+    <string name="cd_key_uchar_latin_small_letter_y" translation_description="When 'y' key in the keyboard is pressed, this string is spoken up for accessibility">y</string>
+    <string name="cd_key_uchar_latin_small_letter_z" translation_description="When 'z' key in the keyboard is pressed, this string is spoken up for accessibility">z</string>
+    <string name="cd_key_uchar_left_curly_bracket" translation_description="When '{' key in the keyboard is pressed, this string is spoken up for accessibility">left curly bracket</string>
+    <string name="cd_key_uchar_vertical_line" translation_description="When '|' key in the keyboard is pressed, this string is spoken up for accessibility">vertical line</string>
+    <string name="cd_key_uchar_right_curly_bracket" translation_description="When '}' key in the keyboard is pressed, this string is spoken up for accessibility">right curly bracket</string>
+    <string name="cd_key_uchar_tilde" translation_description="When '~' key in the keyboard is pressed, this string is spoken up for accessibility">tilde</string>
+    <string name="cd_key_action_done" translation_description="When 'done' key in the keyboard is pressed, this string is spoken up for accessibility">done</string>
+    <string name="cd_key_action_go" translation_description="When 'go' key in the keyboard is pressed, this string is spoken up for accessibility">go</string>
+    <string name="cd_key_action_next" translation_description="When 'next' key in the keyboard is pressed, this string is spoken up for accessibility">next</string>
+    <string name="cd_key_action_previous" translation_description="When 'previous' key in the keyboard is pressed, this string is spoken up for accessibility">previous</string>
+    <string name="cd_key_action_search" translation_description="When 'search' key in the keyboard is pressed, this string is spoken up for accessibility">search</string>
+    <string name="cd_key_action_send" translation_description="When 'send' key in the keyboard is pressed, this string is spoken up for accessibility.  This key is used when the composed text will be sent like chat app.">send</string>
+    <string name="cd_key_composing_done" translation_description="When 'submit' key in the keyboard is pressed, this string is spoken up for accessibility.  This key is generically used when text composing is finished.">submit</string>
 
     <!-- Keys in Kana keyboard -->
-    <string name="cd_key_kana_line_a">A row</string>
-    <string name="cd_key_kana_line_ka">KA row</string>
-    <string name="cd_key_kana_line_sa">SA row</string>
-    <string name="cd_key_kana_line_ta">TA row</string>
-    <string name="cd_key_kana_line_na">NA row</string>
-    <string name="cd_key_kana_line_ha">HA row</string>
-    <string name="cd_key_kana_line_ma">MA row</string>
-    <string name="cd_key_kana_line_ya">YA row</string>
-    <string name="cd_key_kana_line_ra">RA row</string>
-    <string name="cd_key_kana_modifier">voiced sound mark</string>
-    <string name="cd_key_kana_line_wa">WA row</string>
-    <string name="cd_key_kana_punctuation">punctuation</string>
+    <string name="cd_key_kana_line_a" translation_description="This string is spoken up for accessibility, when the button of Japanese A column (あ行: A, I, U, E, O) in the keyboard is pressed.">A column</string>
+    <string name="cd_key_kana_line_ka" translation_description="This string is spoken up for accessibility, when the button of Japanese KA column (か行: KA, KI, KU, KE, KO) in the keyboard is pressed.">KA column</string>
+    <string name="cd_key_kana_line_sa" translation_description="This string is spoken up for accessibility, when the button of Japanese SA column (さ行: SA, SHI, SU, SE, SO) in the keyboard is pressed.">SA column</string>
+    <string name="cd_key_kana_line_ta" translation_description="This string is spoken up for accessibility, when the button of Japanese TA column (た行: TA, CHI, TSU, TE, TO) in the keyboard is pressed.">TA column</string>
+    <string name="cd_key_kana_line_na" translation_description="This string is spoken up for accessibility, when the button of Japanese NA column (な行: NA, NI, NU, NE, NO) in the keyboard is pressed.">NA column</string>
+    <string name="cd_key_kana_line_ha" translation_description="This string is spoken up for accessibility, when the button of Japanese HA column (は行: HA, HI, FU, HE, HO) in the keyboard is pressed.">HA column</string>
+    <string name="cd_key_kana_line_ma" translation_description="This string is spoken up for accessibility, when the button of Japanese MA column (ま行: MA, MI, MU, ME, MO) in the keyboard is pressed.">MA column</string>
+    <string name="cd_key_kana_line_ya" translation_description="This string is spoken up for accessibility, when the button of Japanese YA column (や行: YA, YU, YO) in the keyboard is pressed.">YA column</string>
+    <string name="cd_key_kana_line_ra" translation_description="This string is spoken up for accessibility, when the button of Japanese RA column (ら行: RA, RI, RU, RE, RO) in the keyboard is pressed.">RA column</string>
+    <string name="cd_key_kana_modifier" translation_description="This string is spoken up for accessibility, when the button of Japanese voiced sound mark (゛) in the keyboard is pressed.">voiced sound mark</string>
+    <string name="cd_key_kana_line_wa" translation_description="This string is spoken up for accessibility, when the button of Japanese WA column (わ行: WA, WO, N) in the keyboard is pressed.">WA column</string>
+    <string name="cd_key_kana_punctuation" translation_description="This string is spoken up for accessibility, when the button of Japanese punctuation mark (、 。) in the keyboard is pressed.">punctuation</string>
+    <string name="cd_key_uchar_katakana_middle_dot" translation_description="This string is spoken up for accessibility, when the button of middle dot mark (・) in the keyboard s pressed.">middle dot</string>
+    <string name="cd_key_uchar_ideographic_comma" translation_description="This string is spoken up for accessibility, when the button of Japanese comma character (、) in the keyboard is pressed.">comma</string>
+    <string name="cd_key_uchar_ideographic_full_stop" translation_description="This string is spoken up for accessibility, when the button of Japanese period character (。) in the keyboard is pressed.">period</string>
+    <string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark" translation_description="This string is spoken up for accessibility, when the button of Japanese prolonged sound mark (ー) in the keyboard is pressed.">prolonged sound mark</string>
 
-    <!-- Keys in Qwerty-Kana keyboard -->
-    <string name="cd_key_uchar_black_star">star</string>
-    <string name="cd_key_uchar_black_heart_suit">heart</string>
-    <string name="cd_key_uchar_eighth_note">music note</string>
-    <string name="cd_key_uchar_reference_mark">reference mark</string>
-    <string name="cd_key_uchar_postal_mark">postal mark</string>
-    <string name="cd_key_uchar_multiplication_sign">multiplication sign</string>
-    <string name="cd_key_uchar_division_sign">division sign</string>
-    <string name="cd_key_uchar_left_corner_bracket">left corner bracket</string>
-    <string name="cd_key_uchar_right_corner_bracket">right corner bracket</string>
-    <string name="cd_key_uchar_katakana_middle_dot">middle dot</string>
-    <string name="cd_key_uchar_two_dot_leader">two dot leader</string>
-    <string name="cd_key_uchar_three_dot_leader">three dot leader</string>
-    <string name="cd_key_uchar_left_black_lenticular_bracket">left lenticular bracket</string>
-    <string name="cd_key_uchar_right_black_lenticular_bracket">right black lenticular bracket</string>
-    <string name="cd_key_uchar_u6642">hour</string>
-    <string name="cd_key_uchar_u5206">minute</string>
-    <string name="cd_key_uchar_u6708">month</string>
-    <string name="cd_key_uchar_u65e5">date</string>
-    <string name="cd_key_uchar_wave_dash">wave dash</string>
-    <string name="cd_key_compound_monday">monday</string>
-    <string name="cd_key_compound_tuesday">tuesday</string>
-    <string name="cd_key_compound_wednesday">wednesday</string>
-    <string name="cd_key_compound_thursday">thursday</string>
-    <string name="cd_key_compound_friday">friday</string>
-    <string name="cd_key_compound_saturday">saturday</string>
-    <string name="cd_key_compound_sunday">sunday</string>
-    <string name="cd_key_uchar_ideographic_comma">comma</string>
-    <string name="cd_key_uchar_ideographic_full_stop">period</string>
-    <string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark">prolonged sound mark</string>
     <!-- Keys in Alphabet keyboard -->
-    <string name="cd_key_alphabet_abc">ABC</string>
-    <string name="cd_key_alphabet_def">DEF</string>
-    <string name="cd_key_alphabet_ghi">GHI</string>
-    <string name="cd_key_alphabet_jkl">JKL</string>
-    <string name="cd_key_alphabet_mno">MNO</string>
-    <string name="cd_key_alphabet_pqrs">PQRS</string>
-    <string name="cd_key_alphabet_tuv">TUV</string>
-    <string name="cd_key_alphabet_wxyz">WXYZ</string>
-    <string name="cd_key_alphabet_capitalize">capitalize</string>
-    <string name="spoken_use_headphone_for_password">Plug in a headset to hear password keys spoken aloud</string>
-    <string name="cd_keyboard_fold_button">Change the size of candidate window</string>
+    <string name="cd_key_alphabet_abc" translation_description="This string is spoken up for accessibility, when the button of ABC characters in the keyboard is pressed.">ABC</string>
+    <string name="cd_key_alphabet_def" translation_description="This string is spoken up for accessibility, when the button of DEF characters in the keyboard is pressed.">DEF</string>
+    <string name="cd_key_alphabet_ghi" translation_description="This string is spoken up for accessibility, when the button of GHI characters in the keyboard is pressed.">GHI</string>
+    <string name="cd_key_alphabet_jkl" translation_description="This string is spoken up for accessibility, when the button of JKL characters in the keyboard is pressed.">JKL</string>
+    <string name="cd_key_alphabet_mno" translation_description="This string is spoken up for accessibility, when the button of MNO characters in the keyboard is pressed.">MNO</string>
+    <string name="cd_key_alphabet_pqrs" translation_description="This string is spoken up for accessibility, when the button of PQRS characters in the keyboard is pressed.">PQRS</string>
+    <string name="cd_key_alphabet_tuv" translation_description="This string is spoken up for accessibility, when the button of TUV characters in the keyboard is pressed.">TUV</string>
+    <string name="cd_key_alphabet_wxyz" translation_description="This string is spoken up for accessibility, when the button of WXYZ characters in the keyboard is pressed.">WXYZ</string>
+    <string name="cd_key_alphabet_capitalize" translation_description="This string is spoken up for accessibility, when the button to capitalize alphabet characters in the keyboard is pressed.">capitalize</string>
+    <string name="spoken_use_headphone_for_password" translation_description="This string is spoken up for accessibility, when the system starts reading the characters in the passowrd field.">Plug in a headset to hear password keys spoken aloud</string>
+    <string name="cd_keyboard_fold_button" translation_description="This string is spoken up for accessibility, when the button to expand/fold the candidate word list is pressed.  More details are described in Page 33 of http://goo.gl/jLDD7P">Change the size of candidate window</string>
 
     <!-- Views -->
-    <string name="cd_close_symbol_window">Back to keyboard</string>
-    <string name="cd_symbol_window_symbol">Symbol</string>
-    <string name="cd_symbol_window_emoticon">Emoticon</string>
-    <string name="cd_symbol_window_emoji">Emoji</string>
-    <string name="cd_symbol_window_backspace">Backspace</string>
-    <string name="help_userdictionary_dictionary_name">Input dictionary name</string>
-    <string name="help_userdictionary_edit_word_value">Input word</string>
-    <string name="help_userdictionary_edit_word_key">Input reading</string>
+    <string name="cd_close_symbol_window" translation_description="This string is spoken up for accessibility, when the button to back to the keyboard is pressed.">Back to keyboard</string>
+    <string name="cd_symbol_window_number" translation_description="This string is spoken up for accessibility, when the button to go to the number keyboard is pressed.">Number</string>
+    <string name="cd_symbol_window_symbol" translation_description="This string is spoken up for accessibility, when the button to go to the symbol keyboard is pressed.">Symbol</string>
+    <string name="cd_symbol_window_emoticon" translation_description="This string is spoken up for accessibility, when the button to go to the emoticon keyboard is pressed.">Emoticon</string>
+    <string name="cd_symbol_window_emoji" translation_description="This string is spoken up for accessibility, when the button to go to the emoji keyboard is pressed.">Emoji</string>
+    <string name="cd_symbol_window_enter" translation_description="This string is spoken up for accessibility, when the enter key is pressed.">Linefeed</string>
+    <string name="cd_symbol_window_backspace" translation_description="This string is spoken up for accessibility, when the backspace key is pressed.">Backspace</string>
+    <string name="cd_symbol_window_minor_history" translation_description="This string is spoken up for accessibility, when the button to show symbol/emoticon/emoji history is pressed.">History</string>
+    <string name="cd_symbol_window_minor_symbol_general" translation_description="This string is spoken up for accessibility, when the button to show general symbols is pressed.">General symbol</string>
+    <string name="cd_symbol_window_minor_symbol_half" translation_description="This string is spoken up for accessibility, when the button to show full and half width symbols is pressed.">Full and half width symbol</string>
+    <string name="cd_symbol_window_minor_symbol_parenthesis" translation_description="This string is spoken up for accessibility, when the button to show parenthesis is pressed.">Parenthesis symbol</string>
+    <string name="cd_symbol_window_minor_symbol_arrow" translation_description="This string is spoken up for accessibility, when the button to show arrow symbols is pressed.">Arrow symbol</string>
+    <string name="cd_symbol_window_minor_symbol_math" translation_description="This string is spoken up for accessibility, when the button to show math symbols is pressed.">Math symbol</string>
+    <string name="cd_symbol_window_minor_emoticon_smile" translation_description="This string is spoken up for accessibility, when the button to show smile emoticon is pressed.">Smile emoticon</string>
+    <string name="cd_symbol_window_minor_emoticon_sweat" translation_description="This string is spoken up for accessibility, when the button to show sweat emoticon is pressed.">Sweat emoticon</string>
+    <string name="cd_symbol_window_minor_emoticon_surprise" translation_description="This string is spoken up for accessibility, when the button to show surprise emoticon is pressed.">Surprise emoticon</string>
+    <string name="cd_symbol_window_minor_emoticon_sadness" translation_description="This string is spoken up for accessibility, when the button to show sadness emoticon is pressed.">Sadness emoticon</string>
+    <string name="cd_symbol_window_minor_emoticon_displeasure" translation_description="This string is spoken up for accessibility, when the button to show displeasure emoticon is pressed.">Displeasure emoticon</string>
+    <string name="cd_symbol_window_minor_emoji_face" translation_description="This string is spoken up for accessibility, when the button to show face emoji is pressed.">Face emoji</string>
+    <string name="cd_symbol_window_minor_emoji_food" translation_description="This string is spoken up for accessibility, when the button to show food emoji is pressed.">Food emoji</string>
+    <string name="cd_symbol_window_minor_emoji_activity" translation_description="This string is spoken up for accessibility, when the button to show activity emoji is pressed.">Activity emoji</string>
+    <string name="cd_symbol_window_minor_emoji_city" translation_description="This string is spoken up for accessibility, when the button to show city emoji is pressed.">City emoji</string>
+    <string name="cd_symbol_window_minor_emoji_nature" translation_description="This string is spoken up for accessibility, when the button to show nature emoji is pressed.">Nature emoji</string>
+    <string name="help_userdictionary_dictionary_name" translation_description="Label asking the user to input the dictionary name.">Input dictionary name</string>
+    <string name="help_userdictionary_edit_word_value" translation_description="Label asking the user to input the word.">Input word</string>
+    <string name="help_userdictionary_edit_word_key" translation_description="Label asking the user to input the reading (pronunciation) of the word.">Input reading</string>
+    <string name="cd_voice_input" translation_description="This string is spoken up for accessibility, when voice input button is being pressed. Note that typically suffix 'button' is also spoken (e.g., 'Voice input button' in English).">Voice input</string>
+    <string name="cd_narrow_frame_widen_button" translation_description="This string is spoken up for accessibility, when the button to show the software keyboard is pressed. This button is available iff a physical keyboard is available.">Show the keyboard</string>
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/dimens.xml b/src/android/static_resources/resources_oss/res/values/dimens.xml
index 7a763f9..6c4eda5 100644
--- a/src/android/static_resources/resources_oss/res/values/dimens.xml
+++ b/src/android/static_resources/resources_oss/res/values/dimens.xml
@@ -31,84 +31,126 @@
 -->
 <resources>
 
-    <dimen name="key_preview_height">74dip</dimen>
-    <dimen name="keyboard_vertical_correction">-8dip</dimen>
+    <dimen name="key_preview_height">60dip</dimen>
+    <dimen name="popup_width_limitation">60dip</dimen>
     <dimen name="mini_keyboard_vertical_correction">-81dip</dimen>
+    <dimen name="keyboard_separator_padding">16dip</dimen>
+    <dimen name="keyboard_separator_width">1dip</dimen>
+    <dimen name="default_function_icon_height">32dip</dimen>
+    <!-- This values is effective only when the keyboard height is very short.
+         As the icon resoureces of QWERTY keyboard don't have padding in them,
+         without minimum padding the design breaks. -->
+    <item name="keyboard_qwerty_default_vertical_padding" format="fraction" type="fraction">0.75%</item>
+    <item name="keyboard_qwerty_default_horizontal_padding" format="fraction" type="fraction">0.80%</item>
     <dimen name="default_flick_threshold">20dip</dimen>
     <dimen name="candidate_text_size">20dip</dimen>
     <dimen name="candidate_description_text_size">10dip</dimen>
-    <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+    <dimen name="candidate_text_size_aligned_layout">18dip</dimen>
     <dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
-    <dimen name="candidate_description_horizontal_padding">0.7dip</dimen>
-    <dimen name="candidate_description_bottom_padding">4dip</dimen>
     <dimen name="candidate_text_minimum_width">40dip</dimen>
-    <dimen name="candidate_horizontal_padding_size">3dip</dimen>
-    <dimen name="candidate_vertical_padding_size">8dip</dimen>
+    <dimen name="candidate_fold_icon_width">23dip</dimen>
+    <dimen name="candidate_horizontal_padding_size">5dip</dimen>
+    <dimen name="candidate_vertical_padding_size">10dip</dimen>
     <dimen name="candidate_scrollbar_width">4.5dip</dimen>
     <dimen name="candidate_scrollbar_minimum_height">10dip</dimen>
+    <dimen name="candidate_separator_width">1dip</dimen>
+    <dimen name="floating_candidate_window_minimum_width">200dip</dimen>
+    <dimen name="floating_candidate_window_horizontal_padding">10dip</dimen>
+    <dimen name="floating_candidate_window_horizontal_margin">2dip</dimen>
+    <dimen name="floating_candidate_window_vertical_margin">2dip</dimen>
+    <dimen name="floating_candidate_window_round_rect_radius">1dip</dimen>
+    <dimen name="floating_candidate_window_shadow_offset_y">1dip</dimen>
+    <dimen name="floating_candidate_window_shadow_radius">2dip</dimen>
+    <dimen name="floating_candidate_text_size">20dip</dimen>
+    <dimen name="floating_candidate_candidate_vertical_padding">10dip</dimen>
+    <dimen name="floating_candidate_candidate_description_minimum_padding">20dip</dimen>
+    <dimen name="floating_candidate_description_text_size">12dip</dimen>
+    <dimen name="floating_candidate_scroll_indicator_width">3dip</dimen>
+    <dimen name="floating_candidate_scroll_indicator_radius">1dip</dimen>
+    <dimen name="floating_candidate_footer_text_size">14dip</dimen>
+    <dimen name="floating_candidate_separator_width">1dip</dimen>
+    <dimen name="floating_candidate_separator_horizontal_padding">14dip</dimen>
+    <dimen name="floating_candidate_shortcut_text_size">20dip</dimen>
+    <dimen name="floating_candidate_shortcut_candidate_padding">8dip</dimen>
+    <dimen name="floating_mode_indicator_size">40dip</dimen>
+    <dimen name="floating_mode_indicator_vertical_margin">2dip</dimen>
     <dimen name="pref_inputstyle_image_width">200dip</dimen>
-    <dimen name="pref_inputstyle_gallery_height">200dip</dimen>
     <dimen name="pref_inputstyle_horizontal_span">10dip</dimen>
     <dimen name="pref_inputstyle_description_height">50dip</dimen>
     <dimen name="pref_inputstyle_title_fontsize">20dip</dimen>
-    <dimen name="symbol_horizontal_offset">7dip</dimen>
-    <dimen name="symbol_view_scroll_guide_width_per_page">35dip</dimen>
-    <dimen name="symbol_view_candidate_horizontal_padding_size">5dip</dimen>
-    <dimen name="symbol_description_text_size">10dip</dimen>
-    <dimen name="symbol_description_right_padding">2dip</dimen>
+    <!-- The width of on-memory keyboard to render keyboard preview image. 360dip is Nexus5's. -->
+    <dimen name="pref_inputstyle_reference_width">360dip</dimen>
+    <dimen name="symbol_candidate_horizontal_padding_size">8dip</dimen>
+    <dimen name="symbol_description_right_padding">5dip</dimen>
     <dimen name="symbol_description_bottom_padding">4dip</dimen>
-    <dimen name="symbol_view_minor_category_height">53dip</dimen>
-    <dimen name="symbol_view_major_category_height">53dip</dimen>
-    <dimen name="symbol_view_scroll_height">21dip</dimen>
+    <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+    <dimen name="symbol_view_major_category_height">55dip</dimen>
     <dimen name="symbol_view_no_history_text_size">20dip</dimen>
-    <dimen name="symbol_view_minor_category_text_size">14dip</dimen>
-    <dimen name="symbol_view_minor_category_tab_widget_height">64dip</dimen>
-    <dimen name="symbol_view_symbol_min_column_width">64dip</dimen>
+    <dimen name="symbol_view_symbol_min_column_width">60dip</dimen>
     <dimen name="symbol_view_emoticon_min_column_width">88dip</dimen>
-    <dimen name="symbol_view_emoji_min_column_width">64dip</dimen>
-    <dimen name="symbol_view_candidate_height">48dip</dimen>
-    <dimen name="translucent_border_height">3.4dip</dimen>
+    <dimen name="symbol_view_emoji_min_column_width">60dip</dimen>
+    <dimen name="symbol_view_candidate_height">@dimen/symbol_view_major_category_height</dimen>
+    <item name="symbol_separator_padding_fraction" format="fraction" type="fraction">25%</item>
+    <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+    <dimen name="symbol_view_height">263.3dip</dimen>
+    <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+    <dimen name="symbol_view_number_keyboard_height">168.3dip</dimen>
     <!--
-       All "ime_window_height_{portrait|landscape}_{screensize}" are defined here
-       for testing purpose.
+       ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+       n = 2 for portrait. Otherwise n = 1.
     -->
-    <dimen name="ime_window_height_portrait_normal">328.4dip</dimen>
-    <dimen name="ime_window_height_landscape_normal">207.4dip</dimen>
-    <dimen name="ime_window_height_portrait_xlarge">500dip</dimen>
-    <dimen name="ime_window_height_landscape_xlarge">450dip</dimen>
-    <dimen name="ime_window_height_portrait">@dimen/ime_window_height_portrait_normal</dimen>
-    <dimen name="ime_window_height_landscape">@dimen/ime_window_height_landscape_normal</dimen>
-    <!--
-       The ime height to be applied is specified by referencing
-       ime_window_height_{portrait|landscape}.
-       And includes translucent_border_height.
-    -->
-    <dimen name="ime_window_height">@dimen/ime_window_height_portrait</dimen>
-    <dimen name="input_frame_height">240dip</dimen>
-    <!-- input_frame_height_width_shadow should be input_drame_height + translucent_border_height -->
-    <dimen name="input_frame_height_with_shadow">243.4dip</dimen>
+    <dimen name="ime_window_height">303.3dip</dimen>
+    <dimen name="input_frame_height">223.3dip</dimen>
     <dimen name="ime_window_partial_width">300dip</dimen>
     <dimen name="side_frame_width">40dip</dimen>
     <dimen name="side_adjust_button_width">25dip</dimen>
     <dimen name="side_adjust_button_height">35dip</dimen>
     <dimen name="ime_window_region_inset_threshold">650dip</dimen>
+    <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+    <dimen name="button_frame_height">40dip</dimen>
+    <dimen name="button_frame_button_width">45dip</dimen>
+    <dimen name="button_frame_button_height">35dip</dimen>
 
-    <!-- Preferences used by the classes from LatinIME -->
-    <dimen name="key_preview_text_size_large">37dip</dimen>
-    <dimen name="mini_keyboard_slide_allowance">85dip</dimen>
-
-    <!--
-        If (PHYSICAL_SCREEN_HEIGHT - input_frame_height < fullscreen_threshold),
-        then fullscreen mode is applied as default.
-        This calculation is performed for Portrait and Landscape, respectively.
-    -->
     <dimen name="fullscreen_threshold">200dip</dimen>
     <dimen name="firsttime_app_name_text_size">22dip</dimen>
     <dimen name="firsttime_description_text_size">14dip</dimen>
     <dimen name="firsttime_padding_height">14dip</dimen>
     <dimen name="firsttime_padding_width">20dip</dimen>
-    <dimen name="narrow_ime_window_height">125dip</dimen>
-    <dimen name="narrow_frame_height">40dip</dimen>
+    <dimen name="narrow_ime_window_height">126dip</dimen>
+    <dimen name="narrow_frame_height">41dip</dimen>
 
 
+    <!-- Icon size.
+         Both phones and tables employ the same size except for
+         - Characters on keyboareds.
+         - Icons on symbol picker.
+    -->
+    <dimen name="unlimited">10000dip</dimen>
+    <dimen name="button_frame_microphone_height">22dip</dimen>
+    <dimen name="keyboard_enter_width">36dip</dimen>
+    <dimen name="keyboard_qwerty_space_height">30dip</dimen>
+    <dimen name="symbol_close_button_width">34dip</dimen>
+    <dimen name="symbol_major_emoji_disable_icon_height">16dip</dimen>
+    <dimen name="symbol_major_emoji_height">20dip</dimen>
+    <dimen name="symbol_major_emoticon_height">17dip</dimen>
+    <dimen name="symbol_major_number_height">14dip</dimen>
+    <dimen name="symbol_major_symbol_height">17dip</dimen>
+    <dimen name="symbol_minor_default_height">20dip</dimen>
+    <dimen name="symbol_minor_emoticon_height">16dip</dimen>
+
+    <!-- Character size of keyboard, depending on the screen size. -->
+    <dimen name="keyboard_godan_default_height">42dip</dimen>
+    <dimen name="keyboard_twelvekeys_default_height">56dip</dimen>
+    <dimen name="keyboard_qwerty_default_height">32dip</dimen>
+    <!--
+        Popup icon size is 20% bigger than key icon.
+        - On qwerty keyboard, popup has enough area so we can use same image
+          resources and simply scale it.
+        - On other keyboard, popup doesn't have enough area so we use enlarged
+          image resources.
+    -->
+    <dimen name="key_preview_icon_height">@dimen/keyboard_twelvekeys_default_height</dimen>
+    <dimen name="key_preview_qwerty_icon_height">38.4dip</dimen>
+    <dimen name="key_preview_emoji_icon_height">36dip</dimen>
+
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/keycodes.xml b/src/android/static_resources/resources_oss/res/values/keycodes.xml
index 8dfea13..77e7913 100644
--- a/src/android/static_resources/resources_oss/res/values/keycodes.xml
+++ b/src/android/static_resources/resources_oss/res/values/keycodes.xml
@@ -39,9 +39,7 @@
   <integer name="key_right">-12</integer>
   <integer name="key_down">-13</integer>
   <integer name="key_chartype_to_kana">-14</integer>
-  <integer name="key_chartype_to_123">-15</integer>
   <integer name="key_chartype_to_abc">-16</integer>
-  <integer name="key_chartype_to_kana_123">-23</integer>
   <integer name="key_chartype_to_abc_123">-24</integer>
 
   <integer name="key_undo">-18</integer>
@@ -50,7 +48,9 @@
   <integer name="key_capslock">-21</integer>
   <integer name="key_menu_dialog">-22</integer>
   <integer name="key_ime_picker_dialog">-25</integer>
-  <!-- Next available value is -26. -->
+  <integer name="key_globe">-26</integer>
+  <integer name="key_symbol_emoji">-27</integer>
+  <!-- Next available value is -28. -->
 
   <!-- Deprecate : Use uchar_backspace -->
   <integer name="key_backspace">8</integer>
diff --git a/src/android/static_resources/resources_oss/res/values/raws.xml b/src/android/static_resources/resources_oss/res/values/raws.xml
new file mode 100644
index 0000000..e26fc02
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/raws.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <!-- Raw drawable for popup.
+         On phones they are shown but on tables they are hidden.
+         To do this these items are overridden by other raws.xml file. -->
+    <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@raw/qwerty__keyicon__ampersand</item>
+    <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@raw/qwerty__keyicon__apostrophe</item>
+    <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@raw/qwerty__keyicon__asterisk</item>
+    <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@raw/qwerty__keyicon__circumflex_accent</item>
+    <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@raw/qwerty__keyicon__colon</item>
+    <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@raw/qwerty__keyicon__comma</item>
+    <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@raw/qwerty__keyicon__commercial_at</item>
+    <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@raw/qwerty__keyicon__digit_eight</item>
+    <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@raw/qwerty__keyicon__digit_five</item>
+    <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@raw/qwerty__keyicon__digit_four</item>
+    <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@raw/qwerty__keyicon__digit_nine</item>
+    <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@raw/qwerty__keyicon__digit_one</item>
+    <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@raw/qwerty__keyicon__digit_seven</item>
+    <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@raw/qwerty__keyicon__digit_six</item>
+    <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@raw/qwerty__keyicon__digit_three</item>
+    <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@raw/qwerty__keyicon__digit_two</item>
+    <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@raw/qwerty__keyicon__digit_zero</item>
+    <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@raw/qwerty__keyicon__dollar_sign</item>
+    <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@raw/qwerty__keyicon__equals_sign</item>
+    <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@raw/qwerty__keyicon__exclamation_mark</item>
+    <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@raw/qwerty__keyicon__full_stop</item>
+    <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@raw/qwerty__keyicon__grave_accent</item>
+    <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@raw/qwerty__keyicon__greater_than_sign</item>
+    <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@raw/qwerty__keyicon__hyphen_minus</item>
+    <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@raw/qwerty__keyicon__ideographic_comma</item>
+    <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@raw/qwerty__keyicon__ideographic_full_stop</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_a</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_b</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_c</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_d</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_f</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_g</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_h</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_j</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_k</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_l</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_m</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_n</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_s</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_v</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_x</item>
+    <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_z</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_a</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_b</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_c</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_d</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_f</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_g</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_h</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_j</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_k</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_l</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_m</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_n</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_s</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_v</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_x</item>
+    <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_z</item>
+    <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@raw/qwerty__keyicon__left_curly_bracket</item>
+    <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@raw/qwerty__keyicon__left_parenthesis</item>
+    <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@raw/qwerty__keyicon__left_square_bracket</item>
+    <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@raw/qwerty__keyicon__less_than_sign</item>
+    <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@raw/qwerty__keyicon__low_line</item>
+    <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@raw/qwerty__keyicon__minus_sign</item>
+    <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@raw/qwerty__keyicon__number_sign</item>
+    <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@raw/qwerty__keyicon__percent_sign</item>
+    <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@raw/qwerty__keyicon__plus_sign</item>
+    <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@raw/qwerty__keyicon__question_mark</item>
+    <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@raw/qwerty__keyicon__quotation_mark</item>
+    <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@raw/qwerty__keyicon__reverse_solidus</item>
+    <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@raw/qwerty__keyicon__right_curly_bracket</item>
+    <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@raw/qwerty__keyicon__right_parenthesis</item>
+    <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@raw/qwerty__keyicon__right_square_bracket</item>
+    <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@raw/qwerty__keyicon__semicolon</item>
+    <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@raw/qwerty__keyicon__solidus</item>
+    <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@raw/qwerty__keyicon__tilde</item>
+    <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@raw/qwerty__keyicon__vertical_line</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_e</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_i</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_o</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_p</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_q</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_r</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_t</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_u</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_w</item>
+    <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_y</item>
+    <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_e</item>
+    <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_i</item>
+    <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_o</item>
+    <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_p</item>
+    <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_q</item>
+    <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_r</item>
+    <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_t</item>
+    <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_u</item>
+    <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_w</item>
+    <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_y</item>
+    <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@raw/twelvekeys__popup__zero</item>
+    <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@raw/twelvekeys__popup__one</item>
+    <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@raw/twelvekeys__popup__two</item>
+    <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@raw/twelvekeys__popup__three</item>
+    <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@raw/twelvekeys__popup__four</item>
+    <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@raw/twelvekeys__popup__five</item>
+    <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@raw/twelvekeys__popup__six</item>
+    <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@raw/twelvekeys__popup__seven</item>
+    <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@raw/twelvekeys__popup__eight</item>
+    <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@raw/twelvekeys__popup__nine</item>
+    <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@raw/twelvekeys__popup__asterisk</item>
+    <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@raw/twelvekeys__popup__number_sign</item>
+    <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@raw/twelvekeys__popup__plus_sign</item>
+    <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@raw/twelvekeys__popup__hyphen_minus</item>
+    <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@raw/twelvekeys__popup__comma</item>
+    <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@raw/twelvekeys__popup__full_stop</item>
+    <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@raw/twelvekeys__popup__solidus</item>
+    <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@raw/twelvekeys__popup__equals_sign</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/strings.xml b/src/android/static_resources/resources_oss/res/values/strings.xml
index 2118b23..b616c72 100644
--- a/src/android/static_resources/resources_oss/res/values/strings.xml
+++ b/src/android/static_resources/resources_oss/res/values/strings.xml
@@ -29,346 +29,289 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
+<!-- The next number of translation_description is (237). -->
 <resources>
-    <string name="subtype_ja">Japanese</string>
+    <string name="subtype_ja" translation_description="(0) in http://goo.gl/jLDD7P">Japanese</string>
+
+    <!-- Preference keys -->
+    <string name="pref_skin_type_key" translation_description="(1) in http://goo.gl/jLDD7P">pref_skin_type_key</string>
 
     <!-- Preference titles -->
-    <string name="pref_software_keyboard_category_title">Software keyboard</string>
-        <string name="pref_software_keyboard_advanced_settings_title">Software keyboard advanced settings</string>
+    <string name="pref_software_keyboard_category_title" translation_description="(2) in http://goo.gl/jLDD7P">Software keyboard</string>
+        <string name="pref_software_keyboard_advanced_settings_title" translation_description="(3) in http://goo.gl/jLDD7P">Software keyboard advanced settings</string>
 
-    <string name="pref_software_keyboard_preferences_portrait_title">Software keyboard preferences for portrait mode</string>
-    <string name="pref_software_keyboard_preferences_landscape_title">Software keyboard preferences for landscape mode</string>
+    <!-- Fragment preference titles -->
+    <string name="pref_fragment_software_keyboard_title" translation_description="(230) in http://goo.gl/jLDD7P">Software keyboard</string>
+    <string name="pref_fragment_input_support_title" translation_description="(231) in http://goo.gl/jLDD7P">Input support</string>
+    <string name="pref_fragment_conversion_title" translation_description="(232) in http://goo.gl/jLDD7P">Conversion</string>
+    <string name="pref_fragment_dictionary_title" translation_description="(233) in http://goo.gl/jLDD7P">Dictionary</string>
+    <string name="pref_fragment_user_feedback_title" translation_description="(234) in http://goo.gl/jLDD7P">User feedback</string>
+    <string name="pref_fragment_about_title" translation_description="(235) in http://goo.gl/jLDD7P">About</string>
+    <string name="pref_fragment_development_title" translation_description="(236) in http://goo.gl/jLDD7P">Development</string>
+
+    <string name="pref_software_keyboard_preferences_portrait_title" translation_description="(4) in http://goo.gl/jLDD7P">Software keyboard preferences for portrait mode</string>
+    <string name="pref_software_keyboard_preferences_landscape_title" translation_description="(5) in http://goo.gl/jLDD7P">Software keyboard preferences for landscape mode</string>
         <!-- Following entries are for configuration_dependent_preferences -->
-        <string name="pref_keyboard_layout_title">Keyboard layout</string>
-        <string name="pref_input_style_title">Input style</string>
-        <string name="pref_qwerty_layout_for_alphabet_title">QWERTY mode</string>
-        <string name="pref_flick_sensitivity_title">Flick sensitivity</string>
-        <string name="pref_use_portrait_keyboard_settings_for_landscape_title">Use portrait settings</string>
-        <string name="pref_keyboard_height_ratio_title">Keyboard height</string>
-    <string name="pref_input_feedback_category_title">Input feedback preferences</string>
-        <string name="pref_haptic_feedback_title">Haptic feedback</string>
-        <string name="pref_haptic_feedback_duration_title">Haptic feedback duration</string>
-        <string name="pref_sound_feedback_title">Audio feedback</string>
-        <string name="pref_sound_feedback_volume_title">Audio feedback volume</string>
-        <string name="pref_popup_feedback_title">Popup feedback</string>
-    <string name="pref_other_input_support_preference_category_title">Other input support preferences</string>
-        <string name="pref_fullscreen_title">Fullscreen mode</string>
-        <string name="pref_skin_type_title">Select Skin type</string>
-        <string name="pref_hardware_title">Preferences for hardware keyboards</string>
-    <string name="pref_conversion_category_title">Conversion preferences</string>
-        <string name="pref_layout_adjustment_title">Layout adjustment</string>
-        <string name="pref_space_character_form_title">Use half-width space</string>
-        <string name="pref_kana_modifier_insensitive_conversion_title">Modifier insensitive conversion</string>
-        <string name="pref_typing_correction_title">Typing correction</string>
-        <string name="pref_other_incognito_mode_title">Incognito mode</string>
-        <string name="pref_emoji_provider_type_title">Select Emoji provider</string>
-    <string name="pref_dictionry_category_title">Dictionary preferences</string>
-        <string name="pref_dictionary_personalization_title">Personalization</string>
-        <string name="pref_dictionary_user_dictionary_tool_title">Dictionary Tool</string>
-        <string name="pref_clear_category_title">Clear history</string>
-            <string name="pref_clear_conversion_history_title">Conversion history</string>
-            <string name="pref_clear_symbol_history_title">Symbol history</string>
-            <string name="pref_clear_user_dictionary_title">User dictionary</string>
-    <string name="pref_user_feedback_category_title">User feedback</string>
-      <string name="pref_other_usage_stats_title">Send usage statistics</string>
-    <string name="pref_about_about_this_software_title">About this software</string>
-        <string name="pref_about_version_title">Version</string>
-        <string name="pref_about_terms_of_service_title">Terms of service</string>
-        <string name="pref_about_privacy_policy_title">Privacy policy</string>
-        <string name="pref_about_oss_credits_title">Open source software</string>
-
+        <string name="pref_keyboard_layout_title" translation_description="Title label in the settings">Keyboard layout</string>
+        <string name="pref_input_style_title" translation_description="Item label in the settings">Input style</string>
+        <string name="pref_qwerty_layout_for_alphabet_title" translation_description="Title label of pref_qwerty_layout_for_alphabet_description in the settings">QWERTY mode</string>
+        <string name="pref_flick_sensitivity_title" translation_description="(9) in http://goo.gl/jLDD7P">Flick sensitivity</string>
+        <string name="pref_use_portrait_keyboard_settings_for_landscape_title" translation_description="(10) in http://goo.gl/jLDD7P">Use portrait settings</string>
+        <string name="pref_keyboard_height_ratio_title" translation_description="(11) in http://goo.gl/jLDD7P">Keyboard height</string>
+    <string name="pref_input_feedback_category_title" translation_description="(12) in http://goo.gl/jLDD7P">Input feedback preferences</string>
+        <string name="pref_haptic_feedback_title" translation_description="(13) in http://goo.gl/jLDD7P">Haptic feedback</string>
+        <string name="pref_haptic_feedback_duration_title" translation_description="(14) in http://goo.gl/jLDD7P">Haptic feedback duration</string>
+        <string name="pref_sound_feedback_title" translation_description="(15) in http://goo.gl/jLDD7P">Audio feedback</string>
+        <string name="pref_sound_feedback_volume_title" translation_description="(16) in http://goo.gl/jLDD7P">Audio feedback volume</string>
+        <string name="pref_popup_feedback_title" translation_description="(17) in http://goo.gl/jLDD7P">Popup feedback</string>
+    <string name="pref_other_input_support_preference_category_title" translation_description="(18) in http://goo.gl/jLDD7P">Other input support preferences</string>
+        <string name="pref_fullscreen_title" translation_description="(19) in http://goo.gl/jLDD7P">Fullscreen mode</string>
+        <string name="pref_skin_type_title" translation_description="(20) in http://goo.gl/jLDD7P">Keyboard theme</string>
+        <string name="pref_hardware_title" translation_description="(21) in http://goo.gl/jLDD7P">Preferences for hardware keyboards</string>
+        <string name="pref_voice_input_title" translation_description="(228) in http://goo.gl/jLDD7P">Show voice input button</string>
+    <string name="pref_conversion_category_title" translation_description="(22) in http://goo.gl/jLDD7P">Conversion preferences</string>
+        <string name="pref_layout_adjustment_title" translation_description="(23) in http://goo.gl/jLDD7P">Layout adjustment</string>
+        <string name="pref_space_character_form_title" translation_description="(24) in http://goo.gl/jLDD7P">Use half-width space</string>
+        <string name="pref_kana_modifier_insensitive_conversion_title" translation_description="(25) in http://goo.gl/jLDD7P">Modifier insensitive conversion</string>
+        <string name="pref_typing_correction_title" translation_description="(26) in http://goo.gl/jLDD7P">Typing correction</string>
+        <string name="pref_other_incognito_mode_title" translation_description="(27) in http://goo.gl/jLDD7P">Incognito mode</string>
+        <string name="pref_emoji_provider_type_title" translation_description="(28) in http://goo.gl/jLDD7P">Select Emoji provider</string>
+    <string name="pref_dictionry_category_title" translation_description="(29) in http://goo.gl/jLDD7P">Dictionary preferences</string>
+        <string name="pref_dictionary_personalization_title" translation_description="(30) in http://goo.gl/jLDD7P">Personalization</string>
+        <string name="pref_dictionary_user_dictionary_tool_title" translation_description="(31) in http://goo.gl/jLDD7P">Dictionary Tool</string>
+        <string name="pref_clear_category_title" translation_description="(32) in http://goo.gl/jLDD7P">Clear history</string>
+            <string name="pref_clear_conversion_history_title" translation_description="(33) in http://goo.gl/jLDD7P">Conversion history</string>
+            <string name="pref_clear_symbol_history_title" translation_description="(34) in http://goo.gl/jLDD7P">Symbol history</string>
+            <string name="pref_clear_user_dictionary_title" translation_description="(35) in http://goo.gl/jLDD7P">User dictionary</string>
+    <string name="pref_user_feedback_category_title" translation_description="(36) in http://goo.gl/jLDD7P">User feedback</string>
+      <string name="pref_other_usage_stats_title" translation_description="(37) in http://goo.gl/jLDD7P">Send usage statistics</string>
+    <string name="pref_about_about_this_software_title" translation_description="(38) in http://goo.gl/jLDD7P">About this software</string>
+        <string name="pref_about_version_title" translation_description="(39) in http://goo.gl/jLDD7P">Version</string>
+        <string name="pref_about_terms_of_service_title" translation_description="(40) in http://goo.gl/jLDD7P">Terms of service</string>
+        <string name="pref_about_privacy_policy_title" translation_description="(41) in http://goo.gl/jLDD7P">Privacy policy</string>
+        <string name="pref_about_oss_credits_title" translation_description="(42) in http://goo.gl/jLDD7P">Open source software</string>
+        <string name="pref_launcher_icon_visibility_title" translation_description="(43) in http://goo.gl/jLDD7P">Show app icon</string>
     <!-- Preference description -->
     <!-- Configuration Dependent Preferences -->
         <!-- Following entries are for configuration_dependent_preferences -->
-        <string name="pref_haptic_feedback_description">Vibrate on key press.</string>
-        <string name="pref_sound_feedback_description">Sound on key press.</string>
-        <string name="pref_popup_feedback_description">Popup on key press.</string>
-        <string name="pref_keyboard_layout_description">Switch keyboard layout.</string>
-            <string name="pref_keyboard_layout_title_12keys">12 keys</string>
-            <string name="pref_keyboard_layout_title_qwerty">QWERTY</string>
-            <string name="pref_keyboard_layout_title_godan">Godan Keyboard</string>
-            <string name="pref_keyboard_layout_description_12keys">Mobile phone layout.</string>
-            <string name="pref_keyboard_layout_description_qwerty">PC keyboard layout.</string>
-            <string name="pref_keyboard_layout_description_godan">Romaji-dedicated layout. <![CDATA[<a href=\'http://support.google.com/ime/japanese/bin/answer.py?hl=ja&topic=25606&answer=2700298\'>Usage</a>]]></string>
-        <string name="pref_input_style_setting_description">Select input style.</string>
-        <string name="pref_qwerty_layout_for_alphabet_description">If checked, QWERTY layout will be used for alphabet input mode regardless of main layout.</string>
-        <string name="pref_fullscreen_description">If checked, target textbox shows in fullscreen mode.</string>
-        <string name="pref_flick_sensitivity_description">Tune the flick sensitivity.</string>
-        <string name="pref_layout_adjustment_description">Switch keyboard adjustment.</string>
-        <string name="pref_keyboard_height_ratio_description">Change the keyboard height.</string>
-        <string name="pref_space_character_form_description">Always use half-width space, no matter the input mode.</string>
-        <string name="pref_kana_modifier_insensitive_conversion_description">Use kana modifier insensitive conversion. Applied to 12 keys and Godan keyboard. e.g. かつこう→学校</string>
-        <string name="pref_typing_correction_description">Detect mistyping and show corrected candidates. e.g. すんかい→深海</string>
-        <string name="pref_emoji_provider_type_description">Select the Emoji provider properly to use emoji.</string>
-        <string name="pref_skin_type_description">Select the skin type to customize the software keyboard look.</string>
+        <string name="pref_haptic_feedback_description" translation_description="(44) in http://goo.gl/jLDD7P">Vibrate on key press.</string>
+        <string name="pref_sound_feedback_description" translation_description="(45) in http://goo.gl/jLDD7P">Sound on key press.</string>
+        <string name="pref_popup_feedback_description" translation_description="(46) in http://goo.gl/jLDD7P">Popup on key press.</string>
+        <string name="pref_keyboard_layout_description" translation_description="(47) in http://goo.gl/jLDD7P">Switch keyboard layout.</string>
+            <string name="pref_keyboard_layout_title_12keys" translation_description="(48) in http://goo.gl/jLDD7P">12 keys</string>
+            <string name="pref_keyboard_layout_title_qwerty" translation_description="(49) in http://goo.gl/jLDD7P">QWERTY</string>
+            <string name="pref_keyboard_layout_title_godan" translation_description="(50) in http://goo.gl/jLDD7P">Godan Keyboard</string>
+            <string name="pref_keyboard_layout_description_12keys" translation_description="(51) in http://goo.gl/jLDD7P">Mobile phone layout.</string>
+            <string name="pref_keyboard_layout_description_qwerty" translation_description="(52) in http://goo.gl/jLDD7P">PC keyboard layout.</string>
+            <string name="pref_keyboard_layout_description_godan" translation_description="(53) in http://goo.gl/jLDD7P">Romaji-dedicated layout. <![CDATA[<a href=\'http://support.google.com/ime/japanese/bin/answer.py?hl=ja&topic=25606&answer=2700298\'>Usage</a>]]></string>
+        <string name="pref_input_style_setting_description" translation_description="(54) in http://goo.gl/jLDD7P">Select input style.</string>
+        <string name="pref_qwerty_layout_for_alphabet_description" translation_description="(55) in http://goo.gl/jLDD7P">If checked, QWERTY layout will be used for alphabet input mode regardless of main layout.</string>
+        <string name="pref_fullscreen_description" translation_description="(56) in http://goo.gl/jLDD7P">If checked, target textbox shows in fullscreen mode.</string>
+        <string name="pref_flick_sensitivity_description" translation_description="(57) in http://goo.gl/jLDD7P">Tune the flick sensitivity.</string>
+        <string name="pref_layout_adjustment_description" translation_description="(58) in http://goo.gl/jLDD7P">Switch keyboard adjustment.</string>
+        <string name="pref_keyboard_height_ratio_description" translation_description="(59) in http://goo.gl/jLDD7P">Change the keyboard height.</string>
+        <string name="pref_space_character_form_description" translation_description="(60) in http://goo.gl/jLDD7P">Always use half-width space, no matter the input mode.</string>
+        <string name="pref_kana_modifier_insensitive_conversion_description" translation_description="(61) in http://goo.gl/jLDD7P">Use kana modifier insensitive conversion. Applied to 12 keys and Godan keyboard. e.g. かつこう→学校</string>
+        <string name="pref_typing_correction_description" translation_description="(62) in http://goo.gl/jLDD7P">Detect mistyping and show corrected candidates. e.g. すんかい→深海</string>
+        <string name="pref_emoji_provider_type_description" translation_description="(63) in http://goo.gl/jLDD7P">Select the Emoji provider properly to use emoji.</string>
+        <string name="pref_skin_type_description" translation_description="(64) in http://goo.gl/jLDD7P">Select the keyboard theme to customize the software keyboard look.</string>
+        <string name="pref_voice_input_description" translation_description="(229) in http://goo.gl/jLDD7P">Show voice input button on the software keyboard.</string>
     <!-- Hardware Keyboard -->
-        <string name="pref_hardware_keymap_description">Select key mapping for hardware keyboards.</string>
+        <string name="pref_hardware_keymap_description" translation_description="(65) in http://goo.gl/jLDD7P">Select key mapping for hardware keyboards.</string>
     <!-- Dictionary -->
-        <string name="pref_dictionary_personalization_description">Enable personal suggestions based on past input.</string>
-        <string name="pref_dictionary_user_dictionary_tool_description">Edit user dictionaries.</string>
-        <string name="pref_clear_category_description">Clear personalization or suggestion data.</string>
-            <string name="pref_clear_conversion_history_description">Clear conversion history.</string>
-            <string name="pref_clear_symbol_history_description">Clear symbol input history.</string>
-            <string name="pref_clear_user_dictionary_description">Clear user dictionary.</string>
+        <string name="pref_dictionary_personalization_description" translation_description="(66) in http://goo.gl/jLDD7P">Enable personal suggestions based on past input.</string>
+        <string name="pref_dictionary_user_dictionary_tool_description" translation_description="(67) in http://goo.gl/jLDD7P">Edit user dictionaries.</string>
+        <string name="pref_clear_category_description" translation_description="(68) in http://goo.gl/jLDD7P">Clear personalization or suggestion data.</string>
+            <string name="pref_clear_conversion_history_description" translation_description="(69) in http://goo.gl/jLDD7P">Clear conversion history.</string>
+            <string name="pref_clear_symbol_history_description" translation_description="(70) in http://goo.gl/jLDD7P">Clear symbol input history.</string>
+            <string name="pref_clear_user_dictionary_description" translation_description="(71) in http://goo.gl/jLDD7P">Clear user dictionary.</string>
     <!-- Other -->
-        <string name="pref_other_incognito_mode_description">Temporarily disable personalization, suggestions and user dictionary.</string>
+        <string name="pref_other_incognito_mode_description" translation_description="(72) in http://goo.gl/jLDD7P">Temporarily disable personalization, suggestions and user dictionary.</string>
         <!-- TODO(matsuzakit): Needs an expert's check => need to check with legal -->
-        <string name="pref_other_usage_stats_description">Send usage statistics to %1$s. These will only be used to improve %1$s products and services.</string>
+        <string name="pref_other_usage_stats_description" translation_description="(73) in http://goo.gl/jLDD7P">Send usage statistics to %1$s. These will only be used to improve %1$s products and services.</string>
     <!-- About -->
-        <string name="pref_about_terms_of_service_description">Display the terms of service (webpage).</string>
-        <string name="pref_about_privacy_policy_description">Display the privacy policy (webpage).</string>
-        <string name="pref_about_oss_credits_description">This software uses open source software: view the licenses.</string>
+        <string name="pref_about_terms_of_service_description" translation_description="(74) in http://goo.gl/jLDD7P">Display the terms of service (webpage).</string>
+        <string name="pref_about_privacy_policy_description" translation_description="(75) in http://goo.gl/jLDD7P">Display the privacy policy (webpage).</string>
+        <string name="pref_about_oss_credits_description" translation_description="(76) in http://goo.gl/jLDD7P">This software uses open source software: view the licenses.</string>
+        <string name="pref_launcher_icon_visibility_description" translation_description="(77) in http://goo.gl/jLDD7P">Display application icon in the launcher</string>
 
     <!-- Preference Values -->
-    <string name="pref_input_style_setting_entry_toggle">Toggle</string>
-    <string name="pref_input_style_setting_entry_flick">Flick</string>
-    <string name="pref_input_style_setting_entry_toggle_and_flick">Toggle &amp; Flick</string>
+    <string name="pref_input_style_setting_entry_toggle" translation_description="(78) in http://goo.gl/jLDD7P">Toggle</string>
+    <string name="pref_input_style_setting_entry_flick" translation_description="(79) in http://goo.gl/jLDD7P">Flick</string>
+    <string name="pref_input_style_setting_entry_toggle_and_flick" translation_description="(80) in http://goo.gl/jLDD7P">Toggle &amp; Flick</string>
 
-    <string name="pref_fullscreen_portrait">Enable on portrait</string>
-    <string name="pref_fullscreen_landscape">Enable on landscape</string>
+    <string name="pref_fullscreen_portrait" translation_description="(81) in http://goo.gl/jLDD7P">Enable on portrait</string>
+    <string name="pref_fullscreen_landscape" translation_description="(82) in http://goo.gl/jLDD7P">Enable on landscape</string>
 
-    <string name="pref_emoji_provider_type_unicode">Disable carrier Emoji</string>
-    <string name="pref_emoji_provider_type_docomo">NTT docomo</string>
-    <string name="pref_emoji_provider_type_kddi">KDDI (au)</string>
-    <string name="pref_emoji_provider_type_softbank">SoftBank</string>
+    <string name="pref_emoji_provider_type_unicode" translation_description="(83) in http://goo.gl/jLDD7P">Disable carrier Emoji</string>
+    <string name="pref_emoji_provider_type_docomo" translation_description="(84) in http://goo.gl/jLDD7P">NTT docomo</string>
+    <string name="pref_emoji_provider_type_kddi" translation_description="(85) in http://goo.gl/jLDD7P">KDDI (au)</string>
+    <string name="pref_emoji_provider_type_softbank" translation_description="(86) in http://goo.gl/jLDD7P">SoftBank</string>
 
-    <string name="pref_skin_type_orange_lightgray">Orange/Light-gray</string>
-    <string name="pref_skin_type_blue_lightgray">Blue/Light-gray</string>
-    <string name="pref_skin_type_blue_darkgray">Blue/Dark-gray</string>
+    <string name="pref_skin_type_orange_lightgray" translation_description="(87) in http://goo.gl/jLDD7P">Orange/Light-gray</string>
+    <string name="pref_skin_type_blue_lightgray" translation_description="(88) in http://goo.gl/jLDD7P">Blue/Light-gray</string>
+    <string name="pref_skin_type_blue_darkgray" translation_description="(89) in http://goo.gl/jLDD7P">Blue/Dark-gray</string>
+    <string name="pref_skin_type_material_design_light" translation_description="(90) in http://goo.gl/jLDD7P">Material Design (Light)</string>
+    <string name="pref_skin_type_material_design_dark" translation_description="(91) in http://goo.gl/jLDD7P">Material Design (Dark)</string>
 
-    <string name="pref_hardware_keymap_default">System Default</string>
-    <string name="pref_hardware_keymap_japanese109A">Japanese 109A</string>
-    <string name="pref_hardware_keymap_twelvekey">12 keys</string>
+    <string name="pref_hardware_keymap_default" translation_description="(92) in http://goo.gl/jLDD7P">System Default</string>
+    <string name="pref_hardware_keymap_japanese109A" translation_description="(93) in http://goo.gl/jLDD7P">Japanese 109A</string>
+    <string name="pref_hardware_keymap_twelvekey" translation_description="(94) in http://goo.gl/jLDD7P">12 keys</string>
 
-    <string name="pref_dictionary_personalization_entry_enabled">Enable</string>
-    <string name="pref_dictionary_personalization_entry_readonly">Frozen</string>
-    <string name="pref_dictionary_personalization_entry_disabled">Disable</string>
+    <string name="pref_dictionary_personalization_entry_enabled" translation_description="(95) in http://goo.gl/jLDD7P">Enable</string>
+    <string name="pref_dictionary_personalization_entry_readonly" translation_description="(96) in http://goo.gl/jLDD7P">Frozen</string>
+    <string name="pref_dictionary_personalization_entry_disabled" translation_description="(97) in http://goo.gl/jLDD7P">Disable</string>
 
-    <!-- Preference url -->
-    <string name="pref_oss_credits_url">file:///android_asset/credits_en.html</string>
-
-    <string name="pref_layout_adjustment_entry_fill">Fill</string>
-    <string name="pref_layout_adjustment_entry_right">Right</string>
-    <string name="pref_layout_adjustment_entry_left">Left</string>
+    <string name="pref_layout_adjustment_entry_fill" translation_description="(99) in http://goo.gl/jLDD7P">Fill</string>
+    <string name="pref_layout_adjustment_entry_right" translation_description="(100) in http://goo.gl/jLDD7P">Right</string>
+    <string name="pref_layout_adjustment_entry_left" translation_description="(101) in http://goo.gl/jLDD7P">Left</string>
 
     <!-- First time launch activity -->
-    <string name="firsttime_close_button">Next &gt;&gt;</string>
+    <string name="firsttime_close_button" translation_description="(102) in http://goo.gl/jLDD7P">Next &gt;&gt;</string>
     <!-- TODO(matsuzakit): Needs an expert's check -->
-    <string name="firsttime_description_thank_you">Thank you for using %s.</string>
-    <string name="firsttime_description_usage_stats"><![CDATA[In order for us to improve %s products and services, we kindly ask you to consider enabling usage statistics.\n\nThis setting can be changed from the preferences screen.]]></string>
-    <string name="firsttime_send_usage_stats_devchannel">Usage statistics are enabled because you are using a development version.</string>
+    <string name="firsttime_description_thank_you" translation_description="(103) in http://goo.gl/jLDD7P">Thank you for using %s.</string>
+    <string name="firsttime_description_usage_stats" translation_description="(104) in http://goo.gl/jLDD7P"><![CDATA[In order for us to improve %s products and services, we kindly ask you to consider enabling usage statistics.\n\nThis setting can be changed from the preferences screen.]]></string>
+    <string name="firsttime_send_usage_stats_devchannel" translation_description="(105) in http://goo.gl/jLDD7P">Usage statistics are enabled because you are using a development version.</string>
 
     <!-- Alert messages -->
-    <string name="pref_ime_enable_alert_title">Setup for text settings</string>
-    <string name="pref_ime_enable_alert_message">Please enable %s.</string>
-    <string name="pref_ime_switch_alert_title">Setup for input method</string>
-    <string name="pref_ime_switch_alert_message">Please change the input method to %s.</string>
-    <string name="pref_ime_alert_next">Next</string>
-    <string name="pref_ime_alert_cancel">Cancel</string>
+    <string name="pref_ime_enable_alert_title" translation_description="(106) in http://goo.gl/jLDD7P">Setup for text settings</string>
+    <string name="pref_ime_enable_alert_message" translation_description="(107) in http://goo.gl/jLDD7P">Please enable %s.</string>
+    <string name="pref_ime_switch_alert_title" translation_description="(108) in http://goo.gl/jLDD7P">Setup for input method</string>
+    <string name="pref_ime_switch_alert_message" translation_description="(109) in http://goo.gl/jLDD7P">Please change the input method to %s.</string>
+    <string name="pref_ime_alert_next" translation_description="(110) in http://goo.gl/jLDD7P">Next</string>
+    <string name="pref_ime_alert_cancel" translation_description="(111) in http://goo.gl/jLDD7P">Cancel</string>
 
     <!-- Misc text for preferences -->
-    <string name="pref_flick_sensitivity_seekbar_low_text">Low</string>
-    <string name="pref_flick_sensitivity_seekbar_middle_text">Mid</string>
-    <string name="pref_flick_sensitivity_seekbar_high_text">High</string>
+    <string name="pref_flick_sensitivity_seekbar_low_text" translation_description="(112) in http://goo.gl/jLDD7P">Low</string>
+    <string name="pref_flick_sensitivity_seekbar_middle_text" translation_description="(113) in http://goo.gl/jLDD7P">Mid</string>
+    <string name="pref_flick_sensitivity_seekbar_high_text" translation_description="(114) in http://goo.gl/jLDD7P">High</string>
 
-    <string name="pref_haptic_feedback_duration_low_text">Short</string>
-    <string name="pref_haptic_feedback_duration_high_text">Long</string>
+    <string name="pref_haptic_feedback_duration_low_text" translation_description="(115) in http://goo.gl/jLDD7P">Short</string>
+    <string name="pref_haptic_feedback_duration_high_text" translation_description="(116) in http://goo.gl/jLDD7P">Long</string>
 
-    <string name="pref_sound_feedback_volume_low_text">Min</string>
-    <string name="pref_sound_feedback_volume_middle_text">Mid</string>
-    <string name="pref_sound_feedback_volume_high_text">Max</string>
+    <string name="pref_sound_feedback_volume_low_text" translation_description="(117) in http://goo.gl/jLDD7P">Min</string>
+    <string name="pref_sound_feedback_volume_middle_text" translation_description="(118) in http://goo.gl/jLDD7P">Mid</string>
+    <string name="pref_sound_feedback_volume_high_text" translation_description="(119) in http://goo.gl/jLDD7P">Max</string>
 
 
-    <string name="symbol_input_no_history">No history.\n\nSwipe the screen\nto browse categories.</string>
-    <string name="symbol_emoji_disabled_message">This text field does not support Emoji input.</string>
-
-    <!-- Symbol minor category text -->
-    <!-- TODO(hidehiko): The line break looks very dirty on English. Fix it. -->
-    <string name="symbol_minor_symbol_history_title">History</string>
-    <string name="symbol_minor_symbol_general_title">General\nSymbol</string>
-    <string name="symbol_minor_symbol_half_title">Half\nFull</string>
-    <string name="symbol_minor_symbol_parenthesis_title">Paren.\nRule</string>
-    <string name="symbol_minor_symbol_arrow_title">Arrow\nNumber</string>
-    <string name="symbol_minor_symbol_math_title">Math\nUnit</string>
-
-    <string name="symbol_minor_emoticon_history_title">History</string>
-    <string name="symbol_minor_emoticon_smile_title">Smile\n(^^)</string>
-    <string name="symbol_minor_emoticon_sweat_title">Sweat\n(^^;)</string>
-    <string name="symbol_minor_emoticon_surprise_title">Surprise\n(゜д゜)</string>
-    <string name="symbol_minor_emoticon_sadness_title">Sadness\n(T_T)</string>
-    <string name="symbol_minor_emoticon_displeasure_title">Displeasure\n(-_-)</string>
-
-    <string name="symbol_minor_emoji_history_title">History</string>
-    <string name="symbol_minor_emoji_face_title">Face\nEmotion</string>
-    <string name="symbol_minor_emoji_food_title">Food\nPlay</string>
-    <string name="symbol_minor_emoji_activity_title">Activity\nLife</string>
-    <string name="symbol_minor_emoji_city_title">City\nWork</string>
-    <string name="symbol_minor_emoji_nature_title">Nature\nFigure</string>
+    <string name="symbol_input_no_history" translation_description="(128) in http://goo.gl/jLDD7P">No history.\n\nSwipe the screen\nto browse categories.</string>
+    <string name="symbol_emoji_disabled_message" translation_description="(129) in http://goo.gl/jLDD7P">This text field does not support Emoji input.</string>
 
     <!--  Menu dialog -->
-    <string name="menu_dialog_title">Input options</string>
-    <string name="menu_item_input_method">Select input method</string>
-    <string name="menu_item_preferences">%s settings</string>
-    <string name="menu_item_voice_input">Voice input</string>
-    <string name="menu_item_mushroom">Launch Mushroom</string>
+    <string name="menu_dialog_title" translation_description="(130) in http://goo.gl/jLDD7P">Input options</string>
+    <string name="menu_item_input_method" translation_description="(131) in http://goo.gl/jLDD7P">Select input method</string>
+    <string name="menu_item_preferences" translation_description="(132) in http://goo.gl/jLDD7P">%s settings</string>
+    <string name="menu_item_mushroom" translation_description="(134) in http://goo.gl/jLDD7P">Launch Mushroom</string>
 
     <!-- User Dictionary Tool -->
-    <string name="user_dictionary_tool_app_name">Dictionary tool</string>
+    <string name="user_dictionary_tool_app_name" translation_description="(135) in http://goo.gl/jLDD7P">Dictionary tool</string>
       <!-- Menu -->
-      <string name="user_dictionary_tool_menu_add_entry_title">New word</string>
-      <string name="user_dictionary_tool_menu_delete_entry_title">Delete word</string>
-      <string name="user_dictionary_tool_menu_undo_title">Undo</string>
-      <string name="user_dictionary_tool_menu_create_dictionary_title">New dictionary</string>
-      <string name="user_dictionary_tool_menu_rename_dictionary_title">Rename current dictionary</string>
-      <string name="user_dictionary_tool_menu_delete_dictionary_title">Delete current dictionary</string>
-      <string name="user_dictionary_tool_menu_export_dictionary_title">Export current dictionary</string>
+      <string name="user_dictionary_tool_menu_add_entry_title" translation_description="(136) in http://goo.gl/jLDD7P">New word</string>
+      <string name="user_dictionary_tool_menu_delete_entry_title" translation_description="(137) in http://goo.gl/jLDD7P">Delete word</string>
+      <string name="user_dictionary_tool_menu_undo_title" translation_description="(138) in http://goo.gl/jLDD7P">Undo</string>
+      <string name="user_dictionary_tool_menu_create_dictionary_title" translation_description="(139) in http://goo.gl/jLDD7P">New dictionary</string>
+      <string name="user_dictionary_tool_menu_rename_dictionary_title" translation_description="(140) in http://goo.gl/jLDD7P">Rename current dictionary</string>
+      <string name="user_dictionary_tool_menu_delete_dictionary_title" translation_description="(141) in http://goo.gl/jLDD7P">Delete current dictionary</string>
+      <string name="user_dictionary_tool_menu_export_dictionary_title" translation_description="(142) in http://goo.gl/jLDD7P">Export current dictionary</string>
 
       <!-- Dictionary editing -->
-      <string name="user_dictionary_tool_default_dictionary_name">User Dictionary 1</string>
-      <string name="user_dictionary_tool_create_dictionary_dialog_title">Create a new dictionary</string>
-      <string name="user_dictionary_tool_rename_dictionary_dialog_title">Edit the name of the dictionary</string>
-      <string name="user_dictionary_tool_dictionary_name_dialog_dictionary_name_label">Name of the dictionary</string>
+      <string name="user_dictionary_tool_default_dictionary_name" translation_description="(143) in http://goo.gl/jLDD7P">User Dictionary 1</string>
+      <string name="user_dictionary_tool_create_dictionary_dialog_title" translation_description="(144) in http://goo.gl/jLDD7P">Create a new dictionary</string>
+      <string name="user_dictionary_tool_rename_dictionary_dialog_title" translation_description="(145) in http://goo.gl/jLDD7P">Edit the name of the dictionary</string>
+      <string name="user_dictionary_tool_dictionary_name_dialog_dictionary_name_label" translation_description="(146) in http://goo.gl/jLDD7P">Name of the dictionary</string>
 
       <!-- Word register dialog -->
-      <string name="user_dictionary_tool_add_entry_dialog_title">Add a new word</string>
-      <string name="user_dictionary_tool_edit_entry_dialog_title">Edit a word</string>
-      <string name="user_dictionary_tool_word_register_dialog_reading_label">Reading</string>
-      <string name="user_dictionary_tool_word_register_dialog_word_label">Word</string>
-      <string name="user_dictionary_tool_word_register_dialog_pos_label">Category</string>
+      <string name="user_dictionary_tool_add_entry_dialog_title" translation_description="(147) in http://goo.gl/jLDD7P">Add a new word</string>
+      <string name="user_dictionary_tool_edit_entry_dialog_title" translation_description="(148) in http://goo.gl/jLDD7P">Edit a word</string>
+      <string name="user_dictionary_tool_word_register_dialog_reading_label" translation_description="(149) in http://goo.gl/jLDD7P">Reading</string>
+      <string name="user_dictionary_tool_word_register_dialog_word_label" translation_description="(150) in http://goo.gl/jLDD7P">Word</string>
+      <string name="user_dictionary_tool_word_register_dialog_pos_label" translation_description="(151) in http://goo.gl/jLDD7P">Category</string>
 
       <!-- Import dialog -->
-      <string name="user_dictionary_tool_zip_file_selection_dialog_title">Select import source</string>
-      <string name="user_dictionary_tool_import_dictionary_selection_dialog_title">Select import destination</string>
-      <string name="user_dictionary_tool_import_dictionary_selection_dialog_new_dictionary">Import as a new dictionary</string>
+      <string name="user_dictionary_tool_zip_file_selection_dialog_title" translation_description="(152) in http://goo.gl/jLDD7P">Select import source</string>
+      <string name="user_dictionary_tool_import_dictionary_selection_dialog_title" translation_description="(153) in http://goo.gl/jLDD7P">Select import destination</string>
+      <string name="user_dictionary_tool_import_dictionary_selection_dialog_new_dictionary" translation_description="(154) in http://goo.gl/jLDD7P">Import as a new dictionary</string>
 
       <!-- Message -->
-      <string name="user_dictionary_tool_delete_done_message">Delete operation successful.</string>
-      <string name="user_dictionary_tool_undo_done_message">Undo operation successful.</string>
+      <string name="user_dictionary_tool_delete_done_message" translation_description="(155) in http://goo.gl/jLDD7P">Delete operation successful.</string>
+      <string name="user_dictionary_tool_undo_done_message" translation_description="(156) in http://goo.gl/jLDD7P">Undo operation successful.</string>
 
       <!-- Error messages -->
-      <string name="user_dictionary_tool_error_delete_entries_without_check">Select the words you would like to delete.</string>
-      <string name="user_dictionary_tool_error_import_source_invalid_scheme">Data import only works on files.</string>
-      <string name="user_dictionary_tool_error_import_cannot_read_import_source">Could not read the file.</string>
-      <string name="user_dictionary_tool_error_import_no_zip_entry">The ZIP file is empty.</string>
-      <string name="user_dictionary_tool_error_export_no_exportable_applications">There are no applications (e.g. Google Docs) to export the user dictionary.</string>
-      <string name="user_dictionary_tool_error_export_failed_to_export">Failed to export the user dictionary.</string>
-      <string name="user_dictionary_tool_status_error_general">The operation has failed.</string>
-      <string name="user_dictionary_tool_status_error_file_not_found">Could not open the file.</string>
-      <string name="user_dictionary_tool_status_error_invalid_file_format">Could not read the file.</string>
-      <string name="user_dictionary_tool_status_error_file_size_limit_exceeded">The data size exceeds the file size limit.</string>
-      <string name="user_dictionary_tool_status_error_dictionary_size_limit_exceeded">Can\'t create any more dictionaries.</string>
-      <string name="user_dictionary_tool_status_error_entry_size_limit_exceeded">Can\'t create any more entries in this dictionary.</string>
-      <string name="user_dictionary_tool_status_error_dictionary_name_empty">Please type a dictionary name.</string>
-      <string name="user_dictionary_tool_status_error_dictionary_name_too_long">The name is too long.</string>
-      <string name="user_dictionary_tool_status_error_dictionary_name_contains_invalid_character">The name contains invalid character(s).</string>
-      <string name="user_dictionary_tool_status_error_dictionary_name_duplicated">The name already exists.</string>
-      <string name="user_dictionary_tool_status_error_reading_empty">Please type the reading.</string>
-      <string name="user_dictionary_tool_status_error_reading_too_long">The reading is too long.</string>
-      <string name="user_dictionary_tool_status_error_reading_contains_invalid_character">The reading contains invalid character(s).</string>
-      <string name="user_dictionary_tool_status_error_word_empty">Please type the word.</string>
-      <string name="user_dictionary_tool_status_error_word_too_long">The word is too long.</string>
-      <string name="user_dictionary_tool_status_error_word_contains_invalid_character">Thw word contains invalid character(s).</string>
-      <string name="user_dictionary_tool_status_error_import_too_many_words">The import source contains too many words.</string>
-      <string name="user_dictionary_tool_status_error_import_invalid_entries">Some words could not be imported.</string>
-      <string name="user_dictionary_tool_status_error_no_undo_history">No more undo-able operation.</string>
+      <string name="user_dictionary_tool_error_delete_entries_without_check" translation_description="(157) in http://goo.gl/jLDD7P">Select the words you would like to delete.</string>
+      <string name="user_dictionary_tool_error_import_source_invalid_scheme" translation_description="(158) in http://goo.gl/jLDD7P">Data import only works on files.</string>
+      <string name="user_dictionary_tool_error_import_cannot_read_import_source" translation_description="(159) in http://goo.gl/jLDD7P">Could not read the file.</string>
+      <string name="user_dictionary_tool_error_import_no_zip_entry" translation_description="(160) in http://goo.gl/jLDD7P">The ZIP file is empty.</string>
+      <string name="user_dictionary_tool_error_export_no_exportable_applications" translation_description="(161) in http://goo.gl/jLDD7P">There are no applications (e.g. Google Docs) to export the user dictionary.</string>
+      <string name="user_dictionary_tool_error_export_failed_to_export" translation_description="(162) in http://goo.gl/jLDD7P">Failed to export the user dictionary.</string>
+      <string name="user_dictionary_tool_status_error_general" translation_description="(163) in http://goo.gl/jLDD7P">The operation has failed.</string>
+      <string name="user_dictionary_tool_status_error_file_not_found" translation_description="(164) in http://goo.gl/jLDD7P">Could not open the file.</string>
+      <string name="user_dictionary_tool_status_error_invalid_file_format" translation_description="(165) in http://goo.gl/jLDD7P">Could not read the file.</string>
+      <string name="user_dictionary_tool_status_error_file_size_limit_exceeded" translation_description="(166) in http://goo.gl/jLDD7P">The data size exceeds the file size limit.</string>
+      <string name="user_dictionary_tool_status_error_dictionary_size_limit_exceeded" translation_description="(167) in http://goo.gl/jLDD7P">Can\'t create any more dictionaries.</string>
+      <string name="user_dictionary_tool_status_error_entry_size_limit_exceeded" translation_description="(168) in http://goo.gl/jLDD7P">Can\'t create any more entries in this dictionary.</string>
+      <string name="user_dictionary_tool_status_error_dictionary_name_empty" translation_description="(169) in http://goo.gl/jLDD7P">Please type a dictionary name.</string>
+      <string name="user_dictionary_tool_status_error_dictionary_name_too_long" translation_description="(170) in http://goo.gl/jLDD7P">The name is too long.</string>
+      <string name="user_dictionary_tool_status_error_dictionary_name_contains_invalid_character" translation_description="(171) in http://goo.gl/jLDD7P">The name contains invalid character(s).</string>
+      <string name="user_dictionary_tool_status_error_dictionary_name_duplicated" translation_description="(172) in http://goo.gl/jLDD7P">The name already exists.</string>
+      <string name="user_dictionary_tool_status_error_reading_empty" translation_description="(173) in http://goo.gl/jLDD7P">Please type the reading.</string>
+      <string name="user_dictionary_tool_status_error_reading_too_long" translation_description="(174) in http://goo.gl/jLDD7P">The reading is too long.</string>
+      <string name="user_dictionary_tool_status_error_reading_contains_invalid_character" translation_description="(175) in http://goo.gl/jLDD7P">The reading contains invalid character(s).</string>
+      <string name="user_dictionary_tool_status_error_word_empty" translation_description="(176) in http://goo.gl/jLDD7P">Please type the word.</string>
+      <string name="user_dictionary_tool_status_error_word_too_long" translation_description="(177) in http://goo.gl/jLDD7P">The word is too long.</string>
+      <string name="user_dictionary_tool_status_error_word_contains_invalid_character" translation_description="(178) in http://goo.gl/jLDD7P">Thw word contains invalid character(s).</string>
+      <string name="user_dictionary_tool_status_error_import_too_many_words" translation_description="(179) in http://goo.gl/jLDD7P">The import source contains too many words.</string>
+      <string name="user_dictionary_tool_status_error_import_invalid_entries" translation_description="(180) in http://goo.gl/jLDD7P">Some words could not be imported.</string>
+      <string name="user_dictionary_tool_status_error_no_undo_history" translation_description="(181) in http://goo.gl/jLDD7P">No more undo-able operation.</string>
 
       <!-- List of Japanese POS -->
       <!-- You should keep a consistency with japanese_pos_for_dictionary_export_*. -->
-      <string name="japanese_pos_noun">Noun</string>
-      <string name="japanese_pos_abbreviation">Abbreviation</string>
-      <string name="japanese_pos_suggestion_only">Suggestion only</string>
-      <string name="japanese_pos_proper_noun">Proper noun</string>
-      <string name="japanese_pos_personal_name">Personal name</string>
-      <string name="japanese_pos_family_name">Family name</string>
-      <string name="japanese_pos_first_name">First name</string>
-      <string name="japanese_pos_organization_name">Organization name</string>
-      <string name="japanese_pos_place_name">Place name</string>
-      <string name="japanese_pos_sa_irregular_conjugation_noun">SA-irregular conjugation noun</string>
-      <string name="japanese_pos_adjective_verbal_noun">Adjective verbal noun</string>
-      <string name="japanese_pos_number">Number</string>
-      <string name="japanese_pos_alphabet">Alphabet</string>
-      <string name="japanese_pos_symbol">Symbol</string>
-      <string name="japanese_pos_emoticon">Emoticon</string>
-      <string name="japanese_pos_adverb">Adverb</string>
-      <string name="japanese_pos_prenoun_adjectival">Prenoun adjectival</string>
-      <string name="japanese_pos_conjunction">Conjunction</string>
-      <string name="japanese_pos_interjection">Interjection</string>
-      <string name="japanese_pos_prefix">Prefix</string>
-      <string name="japanese_pos_counter_suffix">Counter suffix</string>
-      <string name="japanese_pos_generic_suffix">Generic suffix</string>
-      <string name="japanese_pos_person_name_suffix">Person name suffix</string>
-      <string name="japanese_pos_place_name_suffix">Place name suffix</string>
-      <string name="japanese_pos_wa_group1_verb">WA-Group1 verb</string>
-      <string name="japanese_pos_ka_group1_verb">KA-Group1 verb</string>
-      <string name="japanese_pos_sa_group1_verb">SA-Group1 verb</string>
-      <string name="japanese_pos_ta_group1_verb">TA-Group1 verb</string>
-      <string name="japanese_pos_na_group1_verb">NA-Group1 verb</string>
-      <string name="japanese_pos_ma_group1_verb">MA-Group1 verb</string>
-      <string name="japanese_pos_ra_group1_verb">RA-Group1 verb</string>
-      <string name="japanese_pos_ga_group1_verb">GA-Group1 verb</string>
-      <string name="japanese_pos_ba_group1_verb">BA-Group1 verb</string>
-      <string name="japanese_pos_ha_group1_verb">HA-Group1 verb</string>
-      <string name="japanese_pos_group2_verb">Group2 verb</string>
-      <string name="japanese_pos_kuru_group3_verb">Kuru-Group3 verb</string>
-      <string name="japanese_pos_suru_group3_verb">Suru-Group3 verb</string>
-      <string name="japanese_pos_zuru_group3_verb">Zuru-Group3 verb</string>
-      <string name="japanese_pos_ru_group3_verb">Ru-Group3 verb</string>
-      <string name="japanese_pos_adjective">Adjective</string>
-      <string name="japanese_pos_sentence_ending_particle">Sentence ending particle</string>
-      <string name="japanese_pos_punctuation">Punctuation</string>
-      <string name="japanese_pos_free_standing_word">Free standing word</string>
-      <string name="japanese_pos_suppression_word">Suppression word</string>
-
-      <!-- List of Japanese POS for user dictionary export feature -->
-      <!-- You should keep a consistency with japanese_pos_*. -->
-      <string name="japanese_pos_for_dictionary_export_noun">名詞</string>
-      <string name="japanese_pos_for_dictionary_export_abbreviation">短縮よみ</string>
-      <string name="japanese_pos_for_dictionary_export_suggestion_only">サジェストのみ</string>
-      <string name="japanese_pos_for_dictionary_export_proper_noun">固有名詞</string>
-      <string name="japanese_pos_for_dictionary_export_personal_name">人名</string>
-      <string name="japanese_pos_for_dictionary_export_family_name">姓</string>
-      <string name="japanese_pos_for_dictionary_export_first_name">名</string>
-      <string name="japanese_pos_for_dictionary_export_organization_name">組織</string>
-      <string name="japanese_pos_for_dictionary_export_place_name">地名</string>
-      <string name="japanese_pos_for_dictionary_export_sa_irregular_conjugation_noun">名詞サ変</string>
-      <string name="japanese_pos_for_dictionary_export_adjective_verbal_noun">名詞形動</string>
-      <string name="japanese_pos_for_dictionary_export_number">数字</string>
-      <string name="japanese_pos_for_dictionary_export_alphabet">アルファベット</string>
-      <string name="japanese_pos_for_dictionary_export_symbol">記号</string>
-      <string name="japanese_pos_for_dictionary_export_emoticon">顔文字</string>
-      <string name="japanese_pos_for_dictionary_export_adverb">副詞</string>
-      <string name="japanese_pos_for_dictionary_export_prenoun_adjectival">連体詞</string>
-      <string name="japanese_pos_for_dictionary_export_conjunction">接続詞</string>
-      <string name="japanese_pos_for_dictionary_export_interjection">感動詞</string>
-      <string name="japanese_pos_for_dictionary_export_prefix">接頭語</string>
-      <string name="japanese_pos_for_dictionary_export_counter_suffix">助数詞</string>
-      <string name="japanese_pos_for_dictionary_export_generic_suffix">接尾一般</string>
-      <string name="japanese_pos_for_dictionary_export_person_name_suffix">接尾人名</string>
-      <string name="japanese_pos_for_dictionary_export_place_name_suffix">接尾地名</string>
-      <string name="japanese_pos_for_dictionary_export_wa_group1_verb">動詞ワ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ka_group1_verb">動詞カ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_sa_group1_verb">動詞サ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ta_group1_verb">動詞タ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_na_group1_verb">動詞ナ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ma_group1_verb">動詞マ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ra_group1_verb">動詞ラ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ga_group1_verb">動詞ガ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ba_group1_verb">動詞バ行五段</string>
-      <string name="japanese_pos_for_dictionary_export_ha_group1_verb">動詞ハ行四段</string>
-      <string name="japanese_pos_for_dictionary_export_group2_verb">動詞一段</string>
-      <string name="japanese_pos_for_dictionary_export_kuru_group3_verb">動詞カ変</string>
-      <string name="japanese_pos_for_dictionary_export_suru_group3_verb">動詞サ変</string>
-      <string name="japanese_pos_for_dictionary_export_zuru_group3_verb">動詞ザ変</string>
-      <string name="japanese_pos_for_dictionary_export_ru_group3_verb">動詞ラ変</string>
-      <string name="japanese_pos_for_dictionary_export_adjective">形容詞</string>
-      <string name="japanese_pos_for_dictionary_export_sentence_ending_particle">終助詞</string>
-      <string name="japanese_pos_for_dictionary_export_punctuation">句読点</string>
-      <string name="japanese_pos_for_dictionary_export_free_standing_word">独立語</string>
-      <string name="japanese_pos_for_dictionary_export_suppression_word">抑制単語</string>
-
+      <string name="japanese_pos_noun" translation_description="(182) in http://goo.gl/jLDD7P">Noun</string>
+      <string name="japanese_pos_abbreviation" translation_description="(183) in http://goo.gl/jLDD7P">Abbreviation</string>
+      <string name="japanese_pos_suggestion_only" translation_description="(184) in http://goo.gl/jLDD7P">Suggestion only</string>
+      <string name="japanese_pos_proper_noun" translation_description="(185) in http://goo.gl/jLDD7P">Proper noun</string>
+      <string name="japanese_pos_personal_name" translation_description="(186) in http://goo.gl/jLDD7P">Personal name</string>
+      <string name="japanese_pos_family_name" translation_description="(187) in http://goo.gl/jLDD7P">Family name</string>
+      <string name="japanese_pos_first_name" translation_description="(188) in http://goo.gl/jLDD7P">First name</string>
+      <string name="japanese_pos_organization_name" translation_description="(189) in http://goo.gl/jLDD7P">Organization name</string>
+      <string name="japanese_pos_place_name" translation_description="(190) in http://goo.gl/jLDD7P">Place name</string>
+      <string name="japanese_pos_sa_irregular_conjugation_noun" translation_description="(191) in http://goo.gl/jLDD7P">SA-irregular conjugation noun</string>
+      <string name="japanese_pos_adjective_verbal_noun" translation_description="(192) in http://goo.gl/jLDD7P">Adjective verbal noun</string>
+      <string name="japanese_pos_number" translation_description="(193) in http://goo.gl/jLDD7P">Number</string>
+      <string name="japanese_pos_alphabet" translation_description="(194) in http://goo.gl/jLDD7P">Alphabet</string>
+      <string name="japanese_pos_symbol" translation_description="(195) in http://goo.gl/jLDD7P">Symbol</string>
+      <string name="japanese_pos_emoticon" translation_description="(196) in http://goo.gl/jLDD7P">Emoticon</string>
+      <string name="japanese_pos_adverb" translation_description="(197) in http://goo.gl/jLDD7P">Adverb</string>
+      <string name="japanese_pos_prenoun_adjectival" translation_description="(198) in http://goo.gl/jLDD7P">Prenoun adjectival</string>
+      <string name="japanese_pos_conjunction" translation_description="(199) in http://goo.gl/jLDD7P">Conjunction</string>
+      <string name="japanese_pos_interjection" translation_description="(200) in http://goo.gl/jLDD7P">Interjection</string>
+      <string name="japanese_pos_prefix" translation_description="(201) in http://goo.gl/jLDD7P">Prefix</string>
+      <string name="japanese_pos_counter_suffix" translation_description="(202) in http://goo.gl/jLDD7P">Counter suffix</string>
+      <string name="japanese_pos_generic_suffix" translation_description="(203) in http://goo.gl/jLDD7P">Generic suffix</string>
+      <string name="japanese_pos_person_name_suffix" translation_description="(204) in http://goo.gl/jLDD7P">Person name suffix</string>
+      <string name="japanese_pos_place_name_suffix" translation_description="(205) in http://goo.gl/jLDD7P">Place name suffix</string>
+      <string name="japanese_pos_wa_group1_verb" translation_description="(206) in http://goo.gl/jLDD7P">WA-Group1 verb</string>
+      <string name="japanese_pos_ka_group1_verb" translation_description="(207) in http://goo.gl/jLDD7P">KA-Group1 verb</string>
+      <string name="japanese_pos_sa_group1_verb" translation_description="(208) in http://goo.gl/jLDD7P">SA-Group1 verb</string>
+      <string name="japanese_pos_ta_group1_verb" translation_description="(209) in http://goo.gl/jLDD7P">TA-Group1 verb</string>
+      <string name="japanese_pos_na_group1_verb" translation_description="(210) in http://goo.gl/jLDD7P">NA-Group1 verb</string>
+      <string name="japanese_pos_ma_group1_verb" translation_description="(211) in http://goo.gl/jLDD7P">MA-Group1 verb</string>
+      <string name="japanese_pos_ra_group1_verb" translation_description="(212) in http://goo.gl/jLDD7P">RA-Group1 verb</string>
+      <string name="japanese_pos_ga_group1_verb" translation_description="(213) in http://goo.gl/jLDD7P">GA-Group1 verb</string>
+      <string name="japanese_pos_ba_group1_verb" translation_description="(214) in http://goo.gl/jLDD7P">BA-Group1 verb</string>
+      <string name="japanese_pos_ha_group1_verb" translation_description="(215) in http://goo.gl/jLDD7P">HA-Group1 verb</string>
+      <string name="japanese_pos_group2_verb" translation_description="(216) in http://goo.gl/jLDD7P">Group2 verb</string>
+      <string name="japanese_pos_kuru_group3_verb" translation_description="(217) in http://goo.gl/jLDD7P">Kuru-Group3 verb</string>
+      <string name="japanese_pos_suru_group3_verb" translation_description="(218) in http://goo.gl/jLDD7P">Suru-Group3 verb</string>
+      <string name="japanese_pos_zuru_group3_verb" translation_description="(219) in http://goo.gl/jLDD7P">Zuru-Group3 verb</string>
+      <string name="japanese_pos_ru_group3_verb" translation_description="(220) in http://goo.gl/jLDD7P">Ru-Group3 verb</string>
+      <string name="japanese_pos_adjective" translation_description="(221) in http://goo.gl/jLDD7P">Adjective</string>
+      <string name="japanese_pos_sentence_ending_particle" translation_description="(222) in http://goo.gl/jLDD7P">Sentence ending particle</string>
+      <string name="japanese_pos_punctuation" translation_description="(223) in http://goo.gl/jLDD7P">Punctuation</string>
+      <string name="japanese_pos_free_standing_word" translation_description="(224) in http://goo.gl/jLDD7P">Free standing word</string>
+      <string name="japanese_pos_suppression_word" translation_description="(225) in http://goo.gl/jLDD7P">Suppression word</string>
 
       <!-- Yes/No -->
       <!-- Unfortunately android.R.string.yes/no correspond to OK/Cancel. -->
-      <string name="yes">Yes</string>
-      <string name="no">No</string>
+      <string name="yes" translation_description="(226) in http://goo.gl/jLDD7P">Yes</string>
+      <string name="no" translation_description="(227) in http://goo.gl/jLDD7P">No</string>
 </resources>
diff --git a/src/android/static_resources/resources_oss/res/values/styles.xml b/src/android/static_resources/resources_oss/res/values/styles.xml
deleted file mode 100644
index e87f661..0000000
--- a/src/android/static_resources/resources_oss/res/values/styles.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
-  <!-- Theme for user dictionary tool. -->
-  <style name="MozcActionBar">
-    <item name="android:background">@color/action_bar_background</item>
-  </style>
-
-  <style name="MozcDialogTextViewTextAppearance">
-    <item name="android:textColor">@android:color/primary_text_dark</item>
-    <item name="android:textSize">14sp</item>
-  </style>
-  <style name="MozcDialogTextView" parent="@android:style/Widget.TextView">
-    <item name="android:textAppearance">@style/MozcDialogTextViewTextAppearance</item>
-  </style>
-  <style name="MozcLightTheme" parent="@android:style/Theme.Light">
-    <item name="android:windowTitleSize">48dip</item>
-    <item name="android:windowTitleBackgroundStyle">@style/MozcActionBar</item>
-    <item name="android:windowContentOverlay">@drawable/action_bar_shadow</item>
-  </style>
-
-  <!-- Theme for mushroom dialog. -->
-  <style name="MozcMushroomDialogTheme" parent="@android:style/Theme.Dialog" />
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/themes.xml b/src/android/static_resources/resources_oss/res/values/themes.xml
new file mode 100644
index 0000000..079a107
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/themes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <style name="AppThemeSelector" parent="android:Theme.DeviceDefault"/>
+    <style name="AppThemeSelectorSettings" parent="android:Theme.DeviceDefault"/>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml b/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml
new file mode 100644
index 0000000..cb0d19b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!--
+This file contains strings, which are untranslatable and differ from the OSS
+version.
+-->
+<resources>
+    <string name="pref_about_terms_of_service_url">http://code.google.com/p/mozc/</string>
+    <string name="pref_about_privacy_policy_url">http://code.google.com/p/mozc/</string>
+    <!--
+    MiniBrowser can access only the url which matches below pattern.
+    This restriction is introduced in order not to show unexpected website in "EULA" activity.
+    By default no restriction is applied in order to avoid from breaking existing implemntation.
+    -->
+    <string name="pref_url_restriction_regex">.*</string>
+    <string name="user_dictionary_tool_export_provider_name">org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryExportProvider</string>
+
+    <!--
+      If you developer want to activate usage stats collection feature, turn the property on
+      and change the URL in usage_stats/upload_util.cc.
+      However usually you don't need the feature so please keep this false as long as possible.
+    -->
+    <bool name="sending_information_features_enabled">false</bool>
+
+</resources>
+
diff --git a/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml b/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml
new file mode 100644
index 0000000..affc6e2
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+    <!-- Default skin for pre-L -->
+    <string name="pref_skin_type_default" translatable="false">BLUE_DARKGRAY</string>
+
+    <!-- Preference url -->
+    <string name="pref_oss_credits_url" translatable="false">file:///android_asset/credits_en.html</string>
+
+    <!-- User Dictionary Tool -->
+      <!-- List of Japanese POS for user dictionary export feature -->
+      <!-- You should keep a consistency with japanese_pos_*. -->
+      <string name="japanese_pos_for_dictionary_export_noun" translatable="false">名詞</string>
+      <string name="japanese_pos_for_dictionary_export_abbreviation" translatable="false">短縮よみ</string>
+      <string name="japanese_pos_for_dictionary_export_suggestion_only" translatable="false">サジェストのみ</string>
+      <string name="japanese_pos_for_dictionary_export_proper_noun" translatable="false">固有名詞</string>
+      <string name="japanese_pos_for_dictionary_export_personal_name" translatable="false">人名</string>
+      <string name="japanese_pos_for_dictionary_export_family_name" translatable="false">姓</string>
+      <string name="japanese_pos_for_dictionary_export_first_name" translatable="false">名</string>
+      <string name="japanese_pos_for_dictionary_export_organization_name" translatable="false">組織</string>
+      <string name="japanese_pos_for_dictionary_export_place_name" translatable="false">地名</string>
+      <string name="japanese_pos_for_dictionary_export_sa_irregular_conjugation_noun" translatable="false">名詞サ変</string>
+      <string name="japanese_pos_for_dictionary_export_adjective_verbal_noun" translatable="false">名詞形動</string>
+      <string name="japanese_pos_for_dictionary_export_number" translatable="false">数字</string>
+      <string name="japanese_pos_for_dictionary_export_alphabet" translatable="false">アルファベット</string>
+      <string name="japanese_pos_for_dictionary_export_symbol" translatable="false">記号</string>
+      <string name="japanese_pos_for_dictionary_export_emoticon" translatable="false">顔文字</string>
+      <string name="japanese_pos_for_dictionary_export_adverb" translatable="false">副詞</string>
+      <string name="japanese_pos_for_dictionary_export_prenoun_adjectival" translatable="false">連体詞</string>
+      <string name="japanese_pos_for_dictionary_export_conjunction" translatable="false">接続詞</string>
+      <string name="japanese_pos_for_dictionary_export_interjection" translatable="false">感動詞</string>
+      <string name="japanese_pos_for_dictionary_export_prefix" translatable="false">接頭語</string>
+      <string name="japanese_pos_for_dictionary_export_counter_suffix" translatable="false">助数詞</string>
+      <string name="japanese_pos_for_dictionary_export_generic_suffix" translatable="false">接尾一般</string>
+      <string name="japanese_pos_for_dictionary_export_person_name_suffix" translatable="false">接尾人名</string>
+      <string name="japanese_pos_for_dictionary_export_place_name_suffix" translatable="false">接尾地名</string>
+      <string name="japanese_pos_for_dictionary_export_wa_group1_verb" translatable="false">動詞ワ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ka_group1_verb" translatable="false">動詞カ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_sa_group1_verb" translatable="false">動詞サ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ta_group1_verb" translatable="false">動詞タ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_na_group1_verb" translatable="false">動詞ナ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ma_group1_verb" translatable="false">動詞マ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ra_group1_verb" translatable="false">動詞ラ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ga_group1_verb" translatable="false">動詞ガ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ba_group1_verb" translatable="false">動詞バ行五段</string>
+      <string name="japanese_pos_for_dictionary_export_ha_group1_verb" translatable="false">動詞ハ行四段</string>
+      <string name="japanese_pos_for_dictionary_export_group2_verb" translatable="false">動詞一段</string>
+      <string name="japanese_pos_for_dictionary_export_kuru_group3_verb" translatable="false">動詞カ変</string>
+      <string name="japanese_pos_for_dictionary_export_suru_group3_verb" translatable="false">動詞サ変</string>
+      <string name="japanese_pos_for_dictionary_export_zuru_group3_verb" translatable="false">動詞ザ変</string>
+      <string name="japanese_pos_for_dictionary_export_ru_group3_verb" translatable="false">動詞ラ変</string>
+      <string name="japanese_pos_for_dictionary_export_adjective" translatable="false">形容詞</string>
+      <string name="japanese_pos_for_dictionary_export_sentence_ending_particle" translatable="false">終助詞</string>
+      <string name="japanese_pos_for_dictionary_export_punctuation" translatable="false">句読点</string>
+      <string name="japanese_pos_for_dictionary_export_free_standing_word" translatable="false">独立語</string>
+      <string name="japanese_pos_for_dictionary_export_suppression_word" translatable="false">抑制単語</string>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_123.xml
new file mode 100644
index 0000000..68d05e5
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_123.xml
@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+  <!--
+    The current keycode mapping to flick direction and tapping action is as follows;
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '+'  |    '1'    |    '2'    |    '3'    | 'BS'  |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '-'  |    '4'    |    '5'    |    '6'    |  '/'  |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======|
+     |       |           |           |           |       |
+     |  ','  |    '7'    |    '8'    |    '9'    | 'SPC' |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '.'  |    '*'    |    '0'    |    '#'    | 'ENT' |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+   -->
+<Keyboard
+    xmlns:mozc="http://schemas.android.com/apk/res-auto"
+    mozc:keyboardContentDescription="@string/cd_keyboard_number"
+    mozc:keyBackground="twelvekeysRegular"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
+    mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/unlimited">
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
+        <Flick>
+          <KeyEntity mozc:sourceId="1"
+                     mozc:keyCode="@integer/uchar_plus_sign"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__plus_sign" >
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__plus_sign" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
+        <Flick>
+          <KeyEntity mozc:sourceId="2"
+                     mozc:keyCode="@integer/uchar_digit_one"
+                     mozc:keyIcon="@raw/twelvekeys__number__one">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__one" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
+        <Flick>
+          <KeyEntity mozc:sourceId="3"
+                     mozc:keyCode="@integer/uchar_digit_two"
+                     mozc:keyIcon="@raw/twelvekeys__number__two">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__two" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
+        <Flick>
+          <KeyEntity mozc:sourceId="4"
+                     mozc:keyCode="@integer/uchar_digit_three"
+                     mozc:keyIcon="@raw/twelvekeys__number__three">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__three" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0"
+         mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
+        <Flick>
+          <KeyEntity mozc:sourceId="5"
+                     mozc:keyCode="@integer/key_backspace"
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
+        <Flick>
+          <KeyEntity mozc:sourceId="6"
+                     mozc:keyCode="@integer/uchar_hyphen_minus"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__hyphen_minus" >
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__hyphen_minus" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
+        <Flick>
+          <KeyEntity mozc:sourceId="7"
+                     mozc:keyCode="@integer/uchar_digit_four"
+                     mozc:keyIcon="@raw/twelvekeys__number__four">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__four" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
+        <Flick>
+          <KeyEntity mozc:sourceId="8"
+                     mozc:keyCode="@integer/uchar_digit_five"
+                     mozc:keyIcon="@raw/twelvekeys__number__five">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__five" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
+        <Flick>
+          <KeyEntity mozc:sourceId="9"
+                     mozc:keyCode="@integer/uchar_digit_six"
+                     mozc:keyIcon="@raw/twelvekeys__number__six">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__six" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
+        <Flick>
+          <KeyEntity mozc:sourceId="10"
+                     mozc:keyCode="@integer/uchar_solidus"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__solidus" >
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__solidus" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
+        <Flick>
+          <KeyEntity mozc:sourceId="11"
+                     mozc:keyCode="@integer/uchar_comma"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__comma" >
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__comma" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
+        <Flick>
+          <KeyEntity mozc:sourceId="12"
+                     mozc:keyCode="@integer/uchar_digit_seven"
+                     mozc:keyIcon="@raw/twelvekeys__number__seven">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__seven" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
+        <Flick>
+          <KeyEntity mozc:sourceId="13"
+                     mozc:keyCode="@integer/uchar_digit_eight"
+                     mozc:keyIcon="@raw/twelvekeys__number__eight">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__eight" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
+        <Flick>
+          <KeyEntity mozc:sourceId="14"
+                     mozc:keyCode="@integer/uchar_digit_nine"
+                     mozc:keyIcon="@raw/twelvekeys__number__nine">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__nine" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
+        <Flick>
+          <KeyEntity mozc:sourceId="15"
+                     mozc:keyCode="@integer/uchar_space"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
+        <Flick>
+          <KeyEntity mozc:sourceId="16"
+                     mozc:keyCode="@integer/uchar_full_stop"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__full_stop" >
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__full_stop" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+        <Flick>
+          <KeyEntity mozc:sourceId="17"
+                     mozc:keyCode="@integer/uchar_asterisk"
+                     mozc:keyIcon="@raw/twelvekeys__number__asterisk">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__asterisk" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
+        <Flick>
+          <KeyEntity mozc:sourceId="18"
+                     mozc:keyCode="@integer/uchar_digit_zero"
+                     mozc:keyIcon="@raw/twelvekeys__number__zero">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__zero" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
+        <Flick>
+          <KeyEntity mozc:sourceId="19"
+                     mozc:keyCode="@integer/uchar_number_sign"
+                     mozc:keyIcon="@raw/twelvekeys__number__number_sign">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__number_sign" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
+        <Flick>
+          <KeyEntity mozc:sourceId="20"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__enter__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="21"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__enter__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="22"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="23"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="24"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="25"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="26"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="27"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <!-- Next sourceId: 28 -->
+</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml
deleted file mode 100644
index cf52c20..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml
+++ /dev/null
@@ -1,280 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
-    xmlns:mozc="http://schemas.android.com/apk/res-auto"
-    mozc:keyboardContentDescription="@string/cd_keyboard_number"
-    mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
-    mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_undo">
-        <Flick>
-          <KeyEntity mozc:sourceId="1"
-                     mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
-        <Flick>
-          <KeyEntity mozc:sourceId="2"
-                     mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/twelvekeys__number__01">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__01" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
-        <Flick>
-          <KeyEntity mozc:sourceId="3"
-                     mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/twelvekeys__number__02">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__02" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
-        <Flick>
-          <KeyEntity mozc:sourceId="4"
-                     mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/twelvekeys__number__03">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__03" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
-        <Flick>
-          <KeyEntity mozc:sourceId="5"
-                     mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_left">
-        <Flick>
-          <KeyEntity mozc:sourceId="6"
-                     mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
-        <Flick>
-          <KeyEntity mozc:sourceId="7"
-                     mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/twelvekeys__number__04">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__04" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
-        <Flick>
-          <KeyEntity mozc:sourceId="8"
-                     mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/twelvekeys__number__05">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__05" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
-        <Flick>
-          <KeyEntity mozc:sourceId="9"
-                     mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/twelvekeys__number__06">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__06" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_right">
-        <Flick>
-          <KeyEntity mozc:sourceId="10"
-                     mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_symbol">
-        <Flick>
-          <KeyEntity mozc:sourceId="11"
-                     mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
-        <Flick>
-          <KeyEntity mozc:sourceId="12"
-                     mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/twelvekeys__number__07">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__07" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
-        <Flick>
-          <KeyEntity mozc:sourceId="13"
-                     mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/twelvekeys__number__08">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__08" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
-        <Flick>
-          <KeyEntity mozc:sourceId="14"
-                     mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/twelvekeys__number__09">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__09" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
-        <Flick>
-          <KeyEntity mozc:sourceId="15"
-                     mozc:keyCode="@integer/uchar_space"
-                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
-        <Flick>
-          <KeyEntity mozc:sourceId="16"
-                     mozc:keyCode="@integer/key_chartype_to_kana"
-                     mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__number__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__kana__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
-        <Flick>
-          <KeyEntity mozc:sourceId="17"
-                     mozc:keyCode="@integer/uchar_asterisk"
-                     mozc:keyIcon="@raw/twelvekeys__number__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__10" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
-        <Flick>
-          <KeyEntity mozc:sourceId="18"
-                     mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/twelvekeys__number__11">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__11" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
-        <Flick>
-          <KeyEntity mozc:sourceId="19"
-                     mozc:keyCode="@integer/uchar_number_sign"
-                     mozc:keyIcon="@raw/twelvekeys__number__12">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__12" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
-        <Flick>
-          <KeyEntity mozc:sourceId="20"
-                     mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <!-- Next sourceId: 21 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
index ae8f7e2..16c7839 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
@@ -33,31 +33,34 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
     mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
     mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_undo">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
         <Flick>
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_digit_one"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__01">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__01" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__01" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -68,7 +71,7 @@
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_digit_two"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__02">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__02" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__02" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -79,44 +82,48 @@
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_digit_three"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__03">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__03" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__03" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_left">
         <Flick>
           <KeyEntity mozc:sourceId="6"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_ghi">
         <Flick>
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_digit_four"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__04">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__04" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__04" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -127,7 +134,7 @@
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_digit_five"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__05">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__05" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__05" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -138,44 +145,56 @@
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_digit_six"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__06">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__06" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__06" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_right">
         <Flick>
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_symbol">
         <Flick>
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="28"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_pqrs">
         <Flick>
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_digit_seven"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__07">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__07" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__07" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -186,7 +205,7 @@
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_digit_eight"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__08">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__08" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__08" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -197,46 +216,50 @@
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/uchar_digit_nine"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__09">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__09" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__09" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
         <Flick>
           <KeyEntity mozc:sourceId="16"
-                     mozc:keyCode="@integer/key_chartype_to_123"
+                     mozc:keyCode="@integer/key_chartype_to_kana"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_capitalize">
         <Flick>
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_asterisk"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__10" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__10" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -247,7 +270,7 @@
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_digit_zero"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__11">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__11" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__11" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -258,23 +281,121 @@
           <KeyEntity mozc:sourceId="19"
                      mozc:keyCode="@integer/uchar_number_sign"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__12">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__12" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__12" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="21"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="22"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="23"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="24"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="25"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="26"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="27"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 21 -->
+  <!-- Next sourceId: 29 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml
deleted file mode 100644
index b624ec4..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml
+++ /dev/null
@@ -1,342 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-  <!--
-    The current keycode mapping to flick direction and tapping action is as follows;
-     +===========+===========+===========+
-     |           |           |           |
-     |    '1'    |    '2'    |    '3'    |
-     |           |           |           |
-     +===========+===========+===========+
-     |           |           |           |
-     |    '4'    |    '5'    |    '6'    |
-     |           |           |           |
-     +===========+===========+===========+
-     |           |           |           |
-     |    '7'    |    '8'    |    '9'    |
-     |           |           |           |
-     +===========+===========+===========+
-     |    '.'    |           |    '='    |
-     |'~' '/' '*'|    '0'    |'-' '+' '#'|
-     |           |           |           |
-     +===========+===========+===========+
-   -->
-<Keyboard
-    xmlns:mozc="http://schemas.android.com/apk/res-auto"
-    mozc:keyboardContentDescription="@string/cd_keyboard_number"
-    mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
-    mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_undo">
-        <Flick>
-          <KeyEntity mozc:sourceId="1"
-                     mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
-        <Flick>
-          <KeyEntity mozc:sourceId="2"
-                     mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/twelvekeys__number__01">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__01" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
-        <Flick>
-          <KeyEntity mozc:sourceId="3"
-                     mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/twelvekeys__number__02">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__02" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
-        <Flick>
-          <KeyEntity mozc:sourceId="4"
-                     mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/twelvekeys__number__03">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__03" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
-        <Flick>
-          <KeyEntity mozc:sourceId="5"
-                     mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_left">
-        <Flick>
-          <KeyEntity mozc:sourceId="6"
-                     mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
-        <Flick>
-          <KeyEntity mozc:sourceId="7"
-                     mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/twelvekeys__number__04">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__04" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
-        <Flick>
-          <KeyEntity mozc:sourceId="8"
-                     mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/twelvekeys__number__05">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__05" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
-        <Flick>
-          <KeyEntity mozc:sourceId="9"
-                     mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/twelvekeys__number__06">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__06" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_right">
-        <Flick>
-          <KeyEntity mozc:sourceId="10"
-                     mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_symbol">
-        <Flick>
-          <KeyEntity mozc:sourceId="11"
-                     mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
-        <Flick>
-          <KeyEntity mozc:sourceId="12"
-                     mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/twelvekeys__number__07">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__07" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
-        <Flick>
-          <KeyEntity mozc:sourceId="13"
-                     mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/twelvekeys__number__08">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__08" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
-        <Flick>
-          <KeyEntity mozc:sourceId="14"
-                     mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/twelvekeys__number__09">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__09" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
-        <Flick>
-          <KeyEntity mozc:sourceId="15"
-                     mozc:keyCode="@integer/uchar_space"
-                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
-        <Flick>
-          <KeyEntity mozc:sourceId="16"
-                     mozc:keyCode="@integer/key_chartype_to_kana"
-                     mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__number__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__kana__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
-        <Flick>
-          <KeyEntity mozc:sourceId="17"
-                     mozc:keyCode="@integer/uchar_solidus"
-                     mozc:keyIcon="@raw/twelvekeys__number__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__support__popup__10" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="left">
-          <KeyEntity mozc:sourceId="18"
-                     mozc:keyCode="@integer/uchar_tilde"
-                     mozc:keyIcon="@raw/twelvekeys__number__10">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__tilde" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="19"
-                     mozc:keyCode="@integer/uchar_full_stop"
-                     mozc:keyIcon="@raw/twelvekeys__number__10">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="right">
-          <KeyEntity mozc:sourceId="20"
-                     mozc:keyCode="@integer/uchar_asterisk"
-                     mozc:keyIcon="@raw/twelvekeys__number__10">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__asterisk" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
-        <Flick>
-          <KeyEntity mozc:sourceId="21"
-                     mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/twelvekeys__number__11">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__11" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
-        <Flick>
-          <KeyEntity mozc:sourceId="22"
-                     mozc:keyCode="@integer/uchar_plus_sign"
-                     mozc:keyIcon="@raw/twelvekeys__number__12">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__support__popup__12" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="left">
-          <KeyEntity mozc:sourceId="23"
-                     mozc:keyCode="@integer/uchar_hyphen_minus"
-                     mozc:keyIcon="@raw/twelvekeys__number__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="24"
-                     mozc:keyCode="@integer/uchar_equals_sign"
-                     mozc:keyIcon="@raw/twelvekeys__number__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__equals_sign" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="right">
-          <KeyEntity mozc:sourceId="25"
-                     mozc:keyCode="@integer/uchar_number_sign"
-                     mozc:keyIcon="@raw/twelvekeys__number__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
-        <Flick>
-          <KeyEntity mozc:sourceId="26"
-                     mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <!-- Next sourceId: 27 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
index 8653eca..fa9a01b 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
@@ -34,19 +34,19 @@
      +===========+===========+===========+
      |    '_'    |    'c'    |    'f'    |
      |'-' '1' '/'|'b' '2'    |'e' '3'    |
-     |    '&'    |           |           |
+     |    '@'    |    '|'    |    '~'    |
      +===========+===========+===========+
      |    'i'    |    'l'    |    'o'    |
      |'h' '4'    |'k' '5'    |'n' '6'    |
-     |           |           |           |
+     |    '$'    |    '%'    |    '&'    |
      +===========+===========+===========+
      |    'r'    |    'v'    |    'y'    |
      |'q' '7' 's'|'u' '8'    |'x' '9' 'z'|
-     |           |           |           |
+     |    '<'    |    '^'    |    '>'    |
      +===========+===========+===========+
      |           |    ':'    |    '?'    |
      |    '*'    |'"' '0' ';'|',' '.' '!'|
-     |           |           |           |
+     |           |    '#'    |           |
      +===========+===========+===========+
    -->
    <!-- TODO(matsuzakit): Use icons for flick mode. Currently toggle mode's are used. -->
@@ -54,59 +54,63 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
     mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
     mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_undo">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
         <Flick>
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__01">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__01"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_hyphen_minus"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__01">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus"/>
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__hyphen_minus"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_low_line"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__01">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__low_line"/>
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__low_line"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/uchar_solidus"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__01">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus"/>
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__solidus"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
           <KeyEntity mozc:sourceId="6"
-                     mozc:keyCode="@integer/uchar_ampersand"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__01">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand"/>
+                     mozc:keyCode="@integer/uchar_commercial_at"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__one"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -116,22 +120,30 @@
         <Flick>
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__02">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__02" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_latin_small_letter_b"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__02">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_b" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_latin_small_letter_c"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__02">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_c" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="56"
+                     mozc:keyCode="@integer/uchar_vertical_line"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__two"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -141,73 +153,93 @@
         <Flick>
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__03">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__03" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/uchar_latin_small_letter_e"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__03">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_e" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_latin_small_letter_f"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__03">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_f" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="57"
+                     mozc:keyCode="@integer/uchar_tilde"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__three"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_left">
         <Flick>
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_ghi">
         <Flick>
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__04">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__04" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="16"
                      mozc:keyCode="@integer/uchar_latin_small_letter_h"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__04">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_h" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_latin_small_letter_i"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__04">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_i" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="58"
+                     mozc:keyCode="@integer/uchar_dollar_sign"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__four"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -217,22 +249,30 @@
         <Flick>
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__05">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__05" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="19"
                      mozc:keyCode="@integer/uchar_latin_small_letter_k"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__05">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_k" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_latin_small_letter_l"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__05">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_l" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="59"
+                     mozc:keyCode="@integer/uchar_percent_sign"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__five"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -242,80 +282,108 @@
         <Flick>
           <KeyEntity mozc:sourceId="21"
                      mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__06">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__06" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="22"
                      mozc:keyCode="@integer/uchar_latin_small_letter_n"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__06">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_n" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="23"
                      mozc:keyCode="@integer/uchar_latin_small_letter_o"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__06">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_o" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="60"
+                     mozc:keyCode="@integer/uchar_ampersand"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__six"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_right">
         <Flick>
           <KeyEntity mozc:sourceId="24"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_symbol">
         <Flick>
           <KeyEntity mozc:sourceId="25"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="65"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_pqrs">
         <Flick>
           <KeyEntity mozc:sourceId="26"
                      mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__07">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__07" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="27"
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__07">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_q" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="28"
                      mozc:keyCode="@integer/uchar_latin_small_letter_r"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__07">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_r" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="29"
                      mozc:keyCode="@integer/uchar_latin_small_letter_s"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__07">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_s" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="61"
+                     mozc:keyCode="@integer/uchar_less_than_sign"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__seven"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -325,22 +393,30 @@
         <Flick>
           <KeyEntity mozc:sourceId="30"
                      mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__08">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__08" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="31"
                      mozc:keyCode="@integer/uchar_latin_small_letter_u"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__08">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_u" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="32"
                      mozc:keyCode="@integer/uchar_latin_small_letter_v"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__08">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_v" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="62"
+                     mozc:keyCode="@integer/uchar_circumflex_accent"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__eight"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -350,68 +426,80 @@
         <Flick>
           <KeyEntity mozc:sourceId="33"
                      mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__09">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__09" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="34"
                      mozc:keyCode="@integer/uchar_latin_small_letter_x"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__09">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_x" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="35"
                      mozc:keyCode="@integer/uchar_latin_small_letter_y"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__09">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_y" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="36"
                      mozc:keyCode="@integer/uchar_latin_small_letter_z"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__09">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_z" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="63"
+                     mozc:keyCode="@integer/uchar_greater_than_sign"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__nine"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="37"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
         <Flick>
           <KeyEntity mozc:sourceId="38"
-                     mozc:keyCode="@integer/key_chartype_to_123"
+                     mozc:keyCode="@integer/key_chartype_to_kana"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_alphabet_capitalize">
         <Flick>
           <KeyEntity mozc:sourceId="39"
                      mozc:keyCode="@integer/uchar_asterisk"
                      mozc:keyIcon="@raw/twelvekeys__alphabet__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__10" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__10" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -421,29 +509,37 @@
         <Flick>
           <KeyEntity mozc:sourceId="40"
                      mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__11">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__11" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="41"
                      mozc:keyCode="@integer/uchar_quotation_mark"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__11">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__quotation_mark" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__quotation_mark" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="42"
                      mozc:keyCode="@integer/uchar_colon"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__11">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__colon" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__colon" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="43"
                      mozc:keyCode="@integer/uchar_semicolon"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__11">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__semicolon" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__semicolon" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="down">
+          <KeyEntity mozc:sourceId="64"
+                     mozc:keyCode="@integer/uchar_number_sign"
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__number__zero"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -453,45 +549,143 @@
         <Flick>
           <KeyEntity mozc:sourceId="44"
                      mozc:keyCode="@integer/uchar_full_stop"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__12">
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
             <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__12" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="45"
                      mozc:keyCode="@integer/uchar_comma"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__comma" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
           <KeyEntity mozc:sourceId="46"
                      mozc:keyCode="@integer/uchar_question_mark"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__question_mark" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__question_mark" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="47"
                      mozc:keyCode="@integer/uchar_exclamation_mark"
-                     mozc:keyIcon="@raw/twelvekeys__alphabet__12">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
+                     mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__exclamation_mark" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="48"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="49"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="50"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="51"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="52"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="53"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="54"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="55"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 48 -->
+  <!-- Next sourceId: 66 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
index c0e23f8..e250f32 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
@@ -49,31 +49,34 @@
      |           |    '<'    |    '>'    |
      +===========+===========+===========+
 
-  TODO(hidehiko): Now the key id is inconsistent between keyIcon and flick popup due to
-      historical reason. Standardize them.
-   -->
+     TODO(hidehiko): Now the key id is inconsistent between keyIcon and flick popup due to
+     historical reason. Standardize them.
+     -->
 <Keyboard
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_kana"
     mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
     mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height" >
   <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+    <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_undo">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_a">
         <Flick>
@@ -89,7 +92,7 @@
                      mozc:keyCode="@integer/uchar_low_line"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__01_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__i" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__i" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -97,7 +100,7 @@
                      mozc:keyCode="@integer/uchar_semicolon"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__01_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__u" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__u" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -105,7 +108,7 @@
                      mozc:keyCode="@integer/uchar_colon"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__01_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__e" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__e" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -113,7 +116,7 @@
                      mozc:keyCode="@integer/uchar_commercial_at"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__01_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__o" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__o" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -133,7 +136,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_a"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__02_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ki" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ki" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -141,7 +144,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_b"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__02_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ku" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ku" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -149,7 +152,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_c"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__02_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ke" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ke" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -157,7 +160,7 @@
                      mozc:keyCode="@integer/uchar_vertical_line"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__02_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ko" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ko" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -177,7 +180,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_d"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__03_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__shi" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__shi" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -185,7 +188,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_e"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__03_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__su" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__su" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -193,7 +196,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_f"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__03_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__se" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__se" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -201,37 +204,41 @@
                      mozc:keyCode="@integer/uchar_tilde"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__03_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__so" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__so" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
+    <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="right" mozc:isRepeatable="true"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+    <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left" mozc:isRepeatable="true"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_left">
         <Flick>
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_ta">
         <Flick>
@@ -247,7 +254,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_g"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__04_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__chi" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__chi" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -255,7 +262,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_h"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__04_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__tsu" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__tsu" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -263,7 +270,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_i"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__04_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__te" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__te" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -271,7 +278,7 @@
                      mozc:keyCode="@integer/uchar_dollar_sign"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__04_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__to" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__to" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -291,7 +298,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_j"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__05_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ni" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ni" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -299,7 +306,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_k"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__05_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__nu" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nu" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -307,7 +314,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_l"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__05_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ne" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ne" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -315,7 +322,7 @@
                      mozc:keyCode="@integer/uchar_percent_sign"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__05_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__no" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__no" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -335,7 +342,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_m"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__06_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__hi" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__hi" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -343,7 +350,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_n"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__06_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__fu" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fu" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -351,7 +358,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_o"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__06_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__he" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__he" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -359,37 +366,52 @@
                      mozc:keyCode="@integer/uchar_ampersand"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__06_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ho" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ho" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="right" mozc:isRepeatable="true"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_right">
         <Flick>
           <KeyEntity mozc:sourceId="34"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+    <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_symbol">
         <Flick>
           <KeyEntity mozc:sourceId="35"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <!-- When at least one touch events have been already active,
+           symbol key event shouldn't produce keycode.
+           Usually a user wants to show symbol picker by explicit (single-touch) operation. -->
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="77"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_ma">
         <Flick>
@@ -405,7 +427,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_p"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__07_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mi" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mi" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -413,7 +435,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__07_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mu" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mu" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -421,7 +443,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_r"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__07_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__me" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__me" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -429,7 +451,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_s"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__07_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mo" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mo" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -445,13 +467,11 @@
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
-          <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
-               which is required for rendering flick highlight. -->
           <KeyEntity mozc:sourceId="64"
                      mozc:keyCode="@integer/uchar_latin_small_letter_t"
-                     mozc:keyIcon="@raw/twelvekeys__kana__support__08_center"
-                     mozc:flickHighlight="false">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis" />
+                     mozc:keyIcon="@raw/twelvekeys__kana__support__08_left"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_parenthesis" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -459,16 +479,15 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_u"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__08_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__yu" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__yu" />
           </KeyEntity>
         </Flick>
-        <!-- c.f. flick left about flickHighlight=false -->
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="65"
                      mozc:keyCode="@integer/uchar_latin_small_letter_v"
-                     mozc:keyIcon="@raw/twelvekeys__kana__support__08_center"
-                     mozc:flickHighlight="false">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis" />
+                     mozc:keyIcon="@raw/twelvekeys__kana__support__08_right"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_parenthesis" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -476,7 +495,7 @@
                      mozc:keyCode="@integer/uchar_circumflex_accent"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__08_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__yo" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__yo" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -496,7 +515,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_w"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__09_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ri" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ri" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -504,7 +523,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_x"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__09_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ru" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ru" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -512,7 +531,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_y"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__09_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__re" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__re" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -520,46 +539,50 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_z"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__09_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ro" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ro" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="right"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="49"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="left"
+         mozc:keyHorizontalLayoutWeight="0">
       <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
         <Flick>
           <KeyEntity mozc:sourceId="50"
                      mozc:keyCode="@integer/key_chartype_to_abc"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__kana__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__alphabet__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
     <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier">
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
         <Flick>
           <KeyEntity mozc:sourceId="51"
                      mozc:keyCode="@integer/uchar_asterisk"
                      mozc:keyIcon="@raw/twelvekeys__kana__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__10" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="left">
@@ -587,6 +610,32 @@
           </KeyEntity>
         </Flick>
       </KeyState>
+      <!-- Transition status from empty composition to non-empty.
+           The look is kept Globe but the behavior becomes modifier key in advance.
+           This status has been introduced because when a user touch-down a key:
+           - If the behavior is unchanged (=Globe), quick typer might fire IME changing unexpectedly.
+           - If the look is changed (=Modifier), the look blinks unexpectedly (Press a key -> The look changes to modifier -> Release the key -> The look to globe -> Composition text is updated -> The look to modifier). -->
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+        <Flick>
+          <KeyEntity mozc:sourceId="76"
+                     mozc:keyCode="@integer/uchar_asterisk"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+        <Flick>
+          <KeyEntity mozc:sourceId="75"
+                     mozc:keyCode="@integer/key_globe"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+        </Flick>
+      </KeyState>
     </Key>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_wa">
@@ -603,7 +652,7 @@
                      mozc:keyCode="@integer/uchar_plus_sign"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__11_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__wo" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wo" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -611,7 +660,7 @@
                      mozc:keyCode="@integer/uchar_solidus"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__11_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__nn" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nn" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -619,17 +668,15 @@
                      mozc:keyCode="@integer/uchar_hyphen_minus"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__11_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__prolonged_sound_mark" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__prolonged_sound_mark" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
-          <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
-               which is required for rendering flick highlight. -->
           <KeyEntity mozc:sourceId="67"
                      mozc:keyCode="@integer/uchar_less_than_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__wave_dash"
-                     mozc:flickHighlight="false">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__wave_dash" />
+                     mozc:keyIcon="@raw/twelvekeys__kana__support__11_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wave_dash" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -649,7 +696,7 @@
                      mozc:keyCode="@integer/uchar_comma"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__12_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ideographic_period" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_period" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -657,7 +704,7 @@
                      mozc:keyCode="@integer/uchar_question_mark"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__12_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__question_mark" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__question_mark" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -665,33 +712,129 @@
                      mozc:keyCode="@integer/uchar_exclamation_mark"
                      mozc:keyIcon="@raw/twelvekeys__kana__support__12_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__exclamation_mark" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__exclamation_mark" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
-          <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
-               which is required for rendering flick highlight. -->
           <KeyEntity mozc:sourceId="66"
                      mozc:keyCode="@integer/uchar_greater_than_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__horizontal_ellipsis"
-                     mozc:flickHighlight="false">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__horizontal_ellipsis" />
+                     mozc:keyIcon="@raw/twelvekeys__kana__support__12_down"
+                     mozc:flickHighlight="true">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__horizontal_ellipsis" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="right"
+         mozc:keyHorizontalLayoutWeight="0"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="60"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="68"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="69"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="70"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="71"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="72"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="73"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="74"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 68 -->
+  <!-- Next sourceId: 78 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
index fc61cf7..ae69ea9 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
@@ -33,31 +33,34 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_kana"
     mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
     mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_undo">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_a">
         <Flick>
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_digit_one"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__a">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__a" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__a" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -68,7 +71,7 @@
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_digit_two"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ka">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ka" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ka" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -79,44 +82,48 @@
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_digit_three"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__sa">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__sa" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__sa" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/uchar_backspace"
-                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_left">
         <Flick>
           <KeyEntity mozc:sourceId="6"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_ta">
         <Flick>
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_digit_four"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ta">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ta" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ta" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -127,7 +134,7 @@
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_digit_five"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__na">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__na" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__na" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -138,44 +145,56 @@
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_digit_six"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ha">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ha" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ha" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_right">
         <Flick>
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_symbol">
         <Flick>
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="30"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_ma">
         <Flick>
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_digit_seven"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ma">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ma" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ma" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -186,7 +205,7 @@
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_digit_eight"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ya">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ya" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ya" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -197,49 +216,74 @@
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/uchar_digit_nine"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ra">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ra" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ra" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
         <Flick>
           <KeyEntity mozc:sourceId="16"
                      mozc:keyCode="@integer/key_chartype_to_abc"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__kana__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__alphabet__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
     <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier">
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
         <Flick>
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_asterisk"
                      mozc:keyIcon="@raw/twelvekeys__kana__10">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__10" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
           </KeyEntity>
         </Flick>
       </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+        <Flick>
+          <KeyEntity mozc:sourceId="29"
+                     mozc:keyCode="@integer/uchar_asterisk"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height">
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+        <Flick>
+          <KeyEntity mozc:sourceId="28"
+                     mozc:keyCode="@integer/key_globe"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+        </Flick>
+      </KeyState>
     </Key>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_kana_line_wa">
@@ -247,7 +291,7 @@
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_digit_zero"
                      mozc:keyIcon="@raw/twelvekeys__kana__keyicon__wa">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__wa" />
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wa" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -263,18 +307,116 @@
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="21"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="22"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="23"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="24"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="25"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="26"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="27"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 21 -->
+  <!-- Next sourceId: 31 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml
deleted file mode 100644
index 4df7101..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml
+++ /dev/null
@@ -1,1265 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
-    xmlns:mozc="http://schemas.android.com/apk/res-auto"
-    mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
-    mozc:keyBackground="qwertyRegular"
-    mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
-    mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
-  <Row>
-    <Key mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
-        <Flick>
-          <KeyEntity mozc:sourceId="1"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_q"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="121"
-                     mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="69"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_q"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_q"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="2"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_q"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="122"
-                     mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="70"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_q"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_w">
-        <Flick>
-          <KeyEntity mozc:sourceId="3"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_w"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="123"
-                     mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="71"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_w"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_w"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="4"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_w"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="124"
-                     mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="72"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_w"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_e">
-        <Flick>
-          <KeyEntity mozc:sourceId="5"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_e"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="125"
-                     mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="73"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_e"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_e"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="6"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_e"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="126"
-                     mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="74"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_e"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_r">
-        <Flick>
-          <KeyEntity mozc:sourceId="7"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_r"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="127"
-                     mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="75"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_r"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_r"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="8"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_r"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="128"
-                     mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="76"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_r"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_t">
-        <Flick>
-          <KeyEntity mozc:sourceId="9"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_t"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="129"
-                     mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="77"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_t"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_t"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="10"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_t"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="130"
-                     mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="78"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_t"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_y">
-        <Flick>
-          <KeyEntity mozc:sourceId="11"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_y"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="131"
-                     mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="79"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_y"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_y"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="12"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_y"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="132"
-                     mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="80"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_y"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_u">
-        <Flick>
-          <KeyEntity mozc:sourceId="13"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_u"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="133"
-                     mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="81"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_u"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_u"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="14"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_u"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="134"
-                     mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="82"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_u"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_i">
-        <Flick>
-          <KeyEntity mozc:sourceId="15"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_i"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="135"
-                     mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="83"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_i"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_i"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="16"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_i"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="136"
-                     mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="84"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_i"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_o">
-        <Flick>
-          <KeyEntity mozc:sourceId="17"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_o"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="137"
-                     mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="85"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_o"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_o"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="18"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_o"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="138"
-                     mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="86"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_o"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyEdgeFlags="right">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_p">
-        <Flick>
-          <KeyEntity mozc:sourceId="19"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_p"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="139"
-                     mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="87"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_p"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_p"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="20"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_p"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="up">
-          <KeyEntity mozc:sourceId="140"
-                     mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="88"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_p"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Spacer mozc:horizontalGap="5%p" />
-    <Key mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
-        <Flick>
-          <KeyEntity mozc:sourceId="21"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_a"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="89"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_a"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_a"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="22"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_a"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="90"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_a"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_s">
-        <Flick>
-          <KeyEntity mozc:sourceId="23"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_s"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="91"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_s"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_s"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="24"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_s"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="92"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_s"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_d">
-        <Flick>
-          <KeyEntity mozc:sourceId="25"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_d"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="93"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_d"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_d"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="26"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_d"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="94"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_d"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_f">
-        <Flick>
-          <KeyEntity mozc:sourceId="27"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_f"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="95"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_f"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_f"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="28"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_f"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="96"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_f"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_g">
-        <Flick>
-          <KeyEntity mozc:sourceId="29"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_g"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="97"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_g"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_g"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="30"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_g"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="98"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_g"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_h">
-        <Flick>
-          <KeyEntity mozc:sourceId="31"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_h"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="99"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_h"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_h"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="32"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_h"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="100"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_h"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_j">
-        <Flick>
-          <KeyEntity mozc:sourceId="33"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_j"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="101"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_j"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_j"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="34"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_j"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="102"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_j"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_k">
-        <Flick>
-          <KeyEntity mozc:sourceId="35"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_k"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="103"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_k"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_k"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="36"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_k"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="104"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_k"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyEdgeFlags="right">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_l">
-        <Flick>
-          <KeyEntity mozc:sourceId="37"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_l"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="105"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_l"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_l"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="38"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_l"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="106"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_l"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="5%p" />
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
-         mozc:isSticky="true" mozc:isModifier="true">
-      <KeyState mozc:contentDescription="@string/cd_key_shift"
-                mozc:nextMetaState="shift">
-        <Flick>
-          <KeyEntity mozc:sourceId="39"
-                     mozc:keyCode="@integer/key_capslock"
-                     mozc:keyIcon="@raw/qwerty__shift_off" />
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_capslock"
-                mozc:metaState="shift" mozc:nextMetaState="capsLock"
-                mozc:nextRemovedMetaStates="shift">
-        <Flick>
-          <KeyEntity mozc:sourceId="40"
-                     mozc:keyCode="@integer/key_capslock"
-                     mozc:keyIcon="@raw/qwerty__shift_on" />
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_capsunlock"
-                mozc:metaState="capsLock" mozc:nextRemovedMetaStates="capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="41"
-                     mozc:keyCode="@integer/key_capslock"
-                     mozc:keyIcon="@raw/qwerty__caps_on" />
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
-        <Flick>
-          <KeyEntity mozc:sourceId="42"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_z"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="107"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_z"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_z"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="43"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_z"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="108"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_z"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_x">
-        <Flick>
-          <KeyEntity mozc:sourceId="44"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_x"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="109"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_x"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_x"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="45"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_x"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="110"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_x"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_c">
-        <Flick>
-          <KeyEntity mozc:sourceId="46"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_c"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="111"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_c"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_c"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="47"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_c"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="112"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_c"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_v">
-        <Flick>
-          <KeyEntity mozc:sourceId="48"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_v"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="113"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_v"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_v"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="49"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_v"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="114"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_v"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_b">
-        <Flick>
-          <KeyEntity mozc:sourceId="50"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_b"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="115"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_b"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_b"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="51"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_b"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="116"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_b"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_n">
-        <Flick>
-          <KeyEntity mozc:sourceId="52"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_n"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="117"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_n"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_n"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="53"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_n"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="118"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_n"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_m">
-        <Flick>
-          <KeyEntity mozc:sourceId="54"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_m"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="119"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_m"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_m"
-                mozc:metaState="shift|capsLock">
-        <Flick>
-          <KeyEntity mozc:sourceId="55"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_m"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
-          </KeyEntity>
-        </Flick>
-        <Flick mozc:direction="down">
-          <KeyEntity mozc:sourceId="120"
-                     mozc:keyCode="@integer/uchar_latin_small_letter_m"
-                     mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
-        <Flick>
-          <KeyEntity mozc:sourceId="56"
-                     mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/qwerty__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
-        <Flick>
-          <KeyEntity mozc:sourceId="57"
-                     mozc:keyCode="@integer/key_chartype_to_123"
-                     mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc_123">
-        <Flick>
-          <KeyEntity mozc:sourceId="58"
-                     mozc:keyCode="@integer/key_chartype_to_abc_123"
-                     mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__number_alphabet__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
-        <Flick>
-          <KeyEntity mozc:sourceId="59"
-                     mozc:keyCode="@integer/uchar_comma"
-                     mozc:keyIcon="@raw/qwerty__function__comma">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus"
-                mozc:metaState="variation_uri" >
-        <Flick>
-          <KeyEntity mozc:sourceId="141"
-                     mozc:keyCode="@integer/uchar_solidus"
-                     mozc:keyIcon="@raw/qwerty__function__solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__solidus" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at"
-                mozc:metaState="variation_email_address" >
-        <Flick>
-          <KeyEntity mozc:sourceId="142"
-                     mozc:keyCode="@integer/uchar_commercial_at"
-                     mozc:keyIcon="@raw/qwerty__function__commercial_at">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__commercial_at" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
-         mozc:keyWidth="21%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
-        <Flick>
-          <KeyEntity mozc:sourceId="60"
-                     mozc:keyCode="@integer/uchar_space"
-                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
-        <Flick>
-          <KeyEntity mozc:sourceId="61"
-                     mozc:keyCode="@integer/uchar_full_stop"
-                     mozc:keyIcon="@raw/qwerty__function__full_stop">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p"
-         mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_left">
-        <Flick>
-          <KeyEntity mozc:sourceId="66"
-                     mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p"
-         mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_right">
-        <Flick>
-          <KeyEntity mozc:sourceId="67"
-                     mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
-        <Flick>
-          <KeyEntity mozc:sourceId="63"
-                     mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/qwerty__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <!-- Next sourceId: 143 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
index 192852b..b83c468 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
@@ -58,24 +58,27 @@
     mozc:keyboardContentDescription="@string/cd_keyboard_kana"
     mozc:flickThreshold="32dip"
     mozc:keyBackground="twelvekeysRegular"
-    mozc:keyWidth="21.8%p" mozc:keyHeight="19.2%p"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="20%p" mozc:keyHorizontalLayoutWeight="1"
     mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p"/>
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_godan_default_height">
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_undo">
         <Flick>
           <KeyEntity mozc:sourceId="101"
                      mozc:keyCode="@integer/key_undo"
-                     mozc:keyIcon="@raw/godan__function__undo__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
         <Flick>
@@ -115,7 +118,7 @@
                      mozc:keyCode="@integer/uchar_digit_one"
                      mozc:keyIcon="@raw/godan__kana__support__01_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__one"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -135,7 +138,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
                      mozc:keyIcon="@raw/godan__kana__support__02_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_q"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -143,7 +146,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_g"
                      mozc:keyIcon="@raw/godan__kana__support__02_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_g"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -151,7 +154,7 @@
                      mozc:keyCode="@integer/uchar_digit_two"
                      mozc:keyIcon="@raw/godan__kana__support__02_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__two"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -171,7 +174,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_p"
                      mozc:keyIcon="@raw/godan__kana__support__03_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_p"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -179,7 +182,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_f"
                      mozc:keyIcon="@raw/godan__kana__support__03_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_f"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -187,7 +190,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_b"
                      mozc:keyIcon="@raw/godan__kana__support__03_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_b"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -195,37 +198,41 @@
                      mozc:keyCode="@integer/uchar_digit_three"
                      mozc:keyIcon="@raw/godan__kana__support__03_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__three"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="102"
                      mozc:keyCode="@integer/uchar_backspace"
-                     mozc:keyIcon="@raw/godan__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_left">
         <Flick>
           <KeyEntity mozc:sourceId="103"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/godan__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_i">
         <Flick>
@@ -265,7 +272,7 @@
                      mozc:keyCode="@integer/uchar_digit_four"
                      mozc:keyIcon="@raw/godan__kana__support__04_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__four"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -285,7 +292,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_j"
                      mozc:keyIcon="@raw/godan__kana__support__05_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_j"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -293,7 +300,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_z"
                      mozc:keyIcon="@raw/godan__kana__support__05_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_z"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -301,7 +308,7 @@
                      mozc:keyCode="@integer/uchar_digit_five"
                      mozc:keyIcon="@raw/godan__kana__support__05_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__five"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -319,9 +326,9 @@
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="27"
                      mozc:keyCode="@integer/uchar_solidus"
-                     mozc:keyIcon="@raw/godan__kana__support__06_center"
+                     mozc:keyIcon="@raw/godan__kana__support__06_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_solidus"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fullwidth_solidus"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -329,7 +336,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_l"
                      mozc:keyIcon="@raw/godan__kana__support__06_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_l"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -345,37 +352,49 @@
                      mozc:keyCode="@integer/uchar_digit_six"
                      mozc:keyIcon="@raw/godan__kana__support__06_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__six"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_right">
         <Flick>
           <KeyEntity mozc:sourceId="104"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/godan__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_symbol">
         <Flick>
           <KeyEntity mozc:sourceId="105"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/godan__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="118"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_u">
         <Flick>
@@ -415,7 +434,7 @@
                      mozc:keyCode="@integer/uchar_digit_seven"
                      mozc:keyIcon="@raw/godan__kana__support__07_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__seven"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -435,7 +454,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_c"
                      mozc:keyIcon="@raw/godan__kana__support__08_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_c"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
@@ -443,7 +462,7 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_d"
                      mozc:keyIcon="@raw/godan__kana__support__08_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_d"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -451,7 +470,7 @@
                      mozc:keyCode="@integer/uchar_digit_eight"
                      mozc:keyIcon="@raw/godan__kana__support__08_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__eight"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -469,9 +488,9 @@
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="42"
                      mozc:keyCode="@integer/uchar_left_parenthesis"
-                     mozc:keyIcon="@raw/godan__kana__support__09_center"
+                     mozc:keyIcon="@raw/godan__kana__support__09_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_parenthesis"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_parenthesis"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -479,15 +498,15 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_x"
                      mozc:keyIcon="@raw/godan__kana__support__09_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_x"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="44"
                      mozc:keyCode="@integer/uchar_right_parenthesis"
-                     mozc:keyIcon="@raw/godan__kana__support__09_center"
+                     mozc:keyIcon="@raw/godan__kana__support__09_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_parenthesis"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_parenthesis"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -495,40 +514,44 @@
                      mozc:keyCode="@integer/uchar_digit_nine"
                      mozc:keyIcon="@raw/godan__kana__support__09_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nine"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="106"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/godan__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
-         mozc:keyWidth="17.3%p" mozc:keyHeight="38.4%p"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyHeight="40%p"
          mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
         <Flick>
           <KeyEntity mozc:sourceId="107"
                      mozc:keyCode="@integer/key_chartype_to_abc"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/godan__function__kana__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__alphabet__popup"/>
-          </KeyEntity>
+                     mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_e">
         <Flick>
@@ -578,9 +601,9 @@
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="52"
                      mozc:keyCode="@integer/uchar_colon"
-                     mozc:keyIcon="@raw/godan__kana__support__11_center"
+                     mozc:keyIcon="@raw/godan__kana__support__11_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_colon"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fullwidth_colon"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -594,9 +617,9 @@
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="54"
                      mozc:keyCode="@integer/uchar_semicolon"
-                     mozc:keyIcon="@raw/godan__kana__support__11_center"
+                     mozc:keyIcon="@raw/godan__kana__support__11_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__katakana_middle_dot"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__katakana_middle_dot"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -604,7 +627,7 @@
                      mozc:keyCode="@integer/uchar_digit_zero"
                      mozc:keyIcon="@raw/godan__kana__support__11_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__zero"/>
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -624,7 +647,7 @@
                      mozc:keyCode="@integer/uchar_full_stop"
                      mozc:keyIcon="@raw/godan__kana__support__12_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_full_stop"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_full_stop"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -648,27 +671,127 @@
                      mozc:keyCode="@integer/uchar_comma"
                      mozc:keyIcon="@raw/godan__kana__support__12_down"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_comma"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_comma"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="twelvekeysFunction"
-         mozc:keyWidth="17.3%p" mozc:keyHeight="38.4%p"
-         mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyHeight="40%p"
+         mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="108"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/godan__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup"/>
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="109"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="110"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="111"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="112"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="113"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="114"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="115"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Spacer mozc:horizontalGap="17.3%p"/>
+    <Spacer mozc:keyHorizontalLayoutWeight="0" mozc:keyBackground="transparent"/>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_o">
         <Flick>
@@ -706,7 +829,7 @@
       </KeyState>
     </Key>
     <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
         <Flick>
           <KeyEntity mozc:sourceId="66"
                      mozc:keyCode="@integer/uchar_asterisk"
@@ -739,6 +862,27 @@
           </KeyEntity>
         </Flick>
       </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+        <Flick>
+          <KeyEntity mozc:sourceId="117"
+                     mozc:keyCode="@integer/uchar_asterisk"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height">
+            <PopUp mozc:popUpIcon="@raw/godan__kana__14"/>
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+        <Flick>
+          <KeyEntity mozc:sourceId="116"
+                     mozc:keyCode="@integer/key_globe"
+                     mozc:keyIcon="@raw/globe_keyicon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+        </Flick>
+      </KeyState>
     </Key>
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_w">
@@ -753,9 +897,9 @@
         <Flick mozc:direction="left">
           <KeyEntity mozc:sourceId="72"
                      mozc:keyCode="@integer/uchar_left_square_bracket"
-                     mozc:keyIcon="@raw/godan__kana__support__15_center"
+                     mozc:keyIcon="@raw/godan__kana__support__15_left"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_corner_bracket"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_corner_bracket"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -763,19 +907,22 @@
                      mozc:keyCode="@integer/uchar_latin_small_letter_v"
                      mozc:keyIcon="@raw/godan__kana__support__15_up"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_v"/>
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="right">
           <KeyEntity mozc:sourceId="74"
                      mozc:keyCode="@integer/uchar_right_square_bracket"
-                     mozc:keyIcon="@raw/godan__kana__support__15_center"
+                     mozc:keyIcon="@raw/godan__kana__support__15_right"
                      mozc:flickHighlight="true">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_corner_bracket"/>
+            <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_corner_bracket"/>
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="17.3%p"/>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Spacer mozc:keyHorizontalLayoutWeight="0" mozc:keyBackground="transparent"/>
   </Row>
+  <!-- Next sourceId: 119 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
index fd0753f..5cd3bfb 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
@@ -33,19 +33,27 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
     mozc:keyBackground="qwertyRegular"
-    mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
+    mozc:keyWidth="10%p" mozc:keyHeight="21%p"
     mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited"
+    mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+    mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+    mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
   <Row>
     <Key mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
+                     mozc:longPressKeyCode="@integer/uchar_digit_one"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_q"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -59,7 +67,7 @@
           <KeyEntity mozc:sourceId="69"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_q"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_q" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -68,8 +76,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_q"
+                     mozc:longPressKeyCode="@integer/uchar_digit_one"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_q"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -83,7 +94,7 @@
           <KeyEntity mozc:sourceId="70"
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_q" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -93,8 +104,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_latin_small_letter_w"
+                     mozc:longPressKeyCode="@integer/uchar_digit_two"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_w"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -108,7 +122,7 @@
           <KeyEntity mozc:sourceId="71"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_w"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_w" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -117,8 +131,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_w"
+                     mozc:longPressKeyCode="@integer/uchar_digit_two"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_w"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -132,7 +149,7 @@
           <KeyEntity mozc:sourceId="72"
                      mozc:keyCode="@integer/uchar_latin_small_letter_w"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_w" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -142,8 +159,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/uchar_latin_small_letter_e"
+                     mozc:longPressKeyCode="@integer/uchar_digit_three"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_e"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -157,7 +177,7 @@
           <KeyEntity mozc:sourceId="73"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_e"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_e" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -166,8 +186,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="6"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_e"
+                     mozc:longPressKeyCode="@integer/uchar_digit_three"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_e"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -181,7 +204,7 @@
           <KeyEntity mozc:sourceId="74"
                      mozc:keyCode="@integer/uchar_latin_small_letter_e"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_e" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -191,8 +214,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_latin_small_letter_r"
+                     mozc:longPressKeyCode="@integer/uchar_digit_four"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_r"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -206,7 +232,7 @@
           <KeyEntity mozc:sourceId="75"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_r"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_r" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -215,8 +241,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_r"
+                     mozc:longPressKeyCode="@integer/uchar_digit_four"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_r"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -230,7 +259,7 @@
           <KeyEntity mozc:sourceId="76"
                      mozc:keyCode="@integer/uchar_latin_small_letter_r"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_r" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -240,8 +269,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_latin_small_letter_t"
+                     mozc:longPressKeyCode="@integer/uchar_digit_five"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_t"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -255,7 +287,7 @@
           <KeyEntity mozc:sourceId="77"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_t"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_t" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -264,8 +296,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_t"
+                     mozc:longPressKeyCode="@integer/uchar_digit_five"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_t"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -279,7 +314,7 @@
           <KeyEntity mozc:sourceId="78"
                      mozc:keyCode="@integer/uchar_latin_small_letter_t"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_t" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -289,8 +324,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/uchar_latin_small_letter_y"
+                     mozc:longPressKeyCode="@integer/uchar_digit_six"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_y"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -304,7 +342,7 @@
           <KeyEntity mozc:sourceId="79"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_y"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_y" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -313,8 +351,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_y"
+                     mozc:longPressKeyCode="@integer/uchar_digit_six"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_y"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -328,7 +369,7 @@
           <KeyEntity mozc:sourceId="80"
                      mozc:keyCode="@integer/uchar_latin_small_letter_y"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_y" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -338,8 +379,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_latin_small_letter_u"
+                     mozc:longPressKeyCode="@integer/uchar_digit_seven"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_u"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -353,7 +397,7 @@
           <KeyEntity mozc:sourceId="81"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_u"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_u" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -362,8 +406,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_u"
+                     mozc:longPressKeyCode="@integer/uchar_digit_seven"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_u"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -377,7 +424,7 @@
           <KeyEntity mozc:sourceId="82"
                      mozc:keyCode="@integer/uchar_latin_small_letter_u"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_u" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -387,8 +434,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_latin_small_letter_i"
+                     mozc:longPressKeyCode="@integer/uchar_digit_eight"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_i"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -402,7 +452,7 @@
           <KeyEntity mozc:sourceId="83"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_i"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_i" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -411,8 +461,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="16"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_i"
+                     mozc:longPressKeyCode="@integer/uchar_digit_eight"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_i"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -426,7 +479,7 @@
           <KeyEntity mozc:sourceId="84"
                      mozc:keyCode="@integer/uchar_latin_small_letter_i"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_i" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -436,8 +489,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_latin_small_letter_o"
+                     mozc:longPressKeyCode="@integer/uchar_digit_nine"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_o"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -451,7 +507,7 @@
           <KeyEntity mozc:sourceId="85"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_o"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_o" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -460,8 +516,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_o"
+                     mozc:longPressKeyCode="@integer/uchar_digit_nine"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_o"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -475,7 +534,7 @@
           <KeyEntity mozc:sourceId="86"
                      mozc:keyCode="@integer/uchar_latin_small_letter_o"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_o" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -485,8 +544,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="19"
                      mozc:keyCode="@integer/uchar_latin_small_letter_p"
+                     mozc:longPressKeyCode="@integer/uchar_digit_zero"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_p"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -500,7 +562,7 @@
           <KeyEntity mozc:sourceId="87"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_p"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_p" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -509,8 +571,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_p"
+                     mozc:longPressKeyCode="@integer/uchar_digit_zero"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_p"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -524,21 +589,21 @@
           <KeyEntity mozc:sourceId="88"
                      mozc:keyCode="@integer/uchar_latin_small_letter_p"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
+            <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_p" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Spacer mozc:horizontalGap="5%p" />
+    <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
     <Key mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
         <Flick>
           <KeyEntity mozc:sourceId="21"
                      mozc:keyCode="@integer/uchar_latin_small_letter_a"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_a" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -555,7 +620,7 @@
           <KeyEntity mozc:sourceId="22"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_a"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_a" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -573,7 +638,7 @@
           <KeyEntity mozc:sourceId="23"
                      mozc:keyCode="@integer/uchar_latin_small_letter_s"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_s" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -590,7 +655,7 @@
           <KeyEntity mozc:sourceId="24"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_s"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_s" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -608,7 +673,7 @@
           <KeyEntity mozc:sourceId="25"
                      mozc:keyCode="@integer/uchar_latin_small_letter_d"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_d" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -625,7 +690,7 @@
           <KeyEntity mozc:sourceId="26"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_d"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_d" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -643,7 +708,7 @@
           <KeyEntity mozc:sourceId="27"
                      mozc:keyCode="@integer/uchar_latin_small_letter_f"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_f" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -660,7 +725,7 @@
           <KeyEntity mozc:sourceId="28"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_f"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_f" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -678,7 +743,7 @@
           <KeyEntity mozc:sourceId="29"
                      mozc:keyCode="@integer/uchar_latin_small_letter_g"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_g" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -695,7 +760,7 @@
           <KeyEntity mozc:sourceId="30"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_g"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_g" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -713,7 +778,7 @@
           <KeyEntity mozc:sourceId="31"
                      mozc:keyCode="@integer/uchar_latin_small_letter_h"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_h" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -730,7 +795,7 @@
           <KeyEntity mozc:sourceId="32"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_h"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_h" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -748,7 +813,7 @@
           <KeyEntity mozc:sourceId="33"
                      mozc:keyCode="@integer/uchar_latin_small_letter_j"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_j" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -765,7 +830,7 @@
           <KeyEntity mozc:sourceId="34"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_j"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_j" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -783,7 +848,7 @@
           <KeyEntity mozc:sourceId="35"
                      mozc:keyCode="@integer/uchar_latin_small_letter_k"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_k" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -800,7 +865,7 @@
           <KeyEntity mozc:sourceId="36"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_k"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_k" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -818,7 +883,7 @@
           <KeyEntity mozc:sourceId="37"
                      mozc:keyCode="@integer/uchar_latin_small_letter_l"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_l" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -835,7 +900,7 @@
           <KeyEntity mozc:sourceId="38"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_l"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_l" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -847,12 +912,13 @@
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="5%p" />
+    <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
   </Row>
   <Row>
     <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
-         mozc:isSticky="true" mozc:isModifier="true">
+         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left" mozc:isModifier="true"
+         mozc:defaultIconWidth="@dimen/unlimited"
+         mozc:defaultIconHeight="@dimen/default_function_icon_height">
       <KeyState mozc:contentDescription="@string/cd_key_shift"
                 mozc:nextMetaState="shift">
         <Flick>
@@ -879,14 +945,14 @@
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
+    <Spacer mozc:keyWidth="2%" mozc:stick="right" mozc:keyBackground="transparent" />
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
         <Flick>
           <KeyEntity mozc:sourceId="42"
                      mozc:keyCode="@integer/uchar_latin_small_letter_z"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_z" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -903,7 +969,7 @@
           <KeyEntity mozc:sourceId="43"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_z"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_z" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -921,7 +987,7 @@
           <KeyEntity mozc:sourceId="44"
                      mozc:keyCode="@integer/uchar_latin_small_letter_x"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_x" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -938,7 +1004,7 @@
           <KeyEntity mozc:sourceId="45"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_x"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_x" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -956,7 +1022,7 @@
           <KeyEntity mozc:sourceId="46"
                      mozc:keyCode="@integer/uchar_latin_small_letter_c"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_c" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -973,7 +1039,7 @@
           <KeyEntity mozc:sourceId="47"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_c"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_c" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -991,7 +1057,7 @@
           <KeyEntity mozc:sourceId="48"
                      mozc:keyCode="@integer/uchar_latin_small_letter_v"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_v" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1008,7 +1074,7 @@
           <KeyEntity mozc:sourceId="49"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_v"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_v" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1026,7 +1092,7 @@
           <KeyEntity mozc:sourceId="50"
                      mozc:keyCode="@integer/uchar_latin_small_letter_b"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_b" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1043,7 +1109,7 @@
           <KeyEntity mozc:sourceId="51"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_b"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_b" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1061,7 +1127,7 @@
           <KeyEntity mozc:sourceId="52"
                      mozc:keyCode="@integer/uchar_latin_small_letter_n"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_n" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1078,7 +1144,7 @@
           <KeyEntity mozc:sourceId="53"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_n"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_n" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1096,7 +1162,7 @@
           <KeyEntity mozc:sourceId="54"
                      mozc:keyCode="@integer/uchar_latin_small_letter_m"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_m" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1113,7 +1179,7 @@
           <KeyEntity mozc:sourceId="55"
                      mozc:keyCode="@integer/uchar_latin_capital_letter_m"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_m" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="down">
@@ -1125,15 +1191,16 @@
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
+    <Spacer mozc:keyWidth="2%" mozc:stick="left" mozc:keyBackground="transparent" />
     <Key mozc:keyBackground="qwertyFunction"
          mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="56"
                      mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/qwerty__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
+                     mozc:keyIcon="@raw/qwerty__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height">
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -1147,21 +1214,21 @@
           <KeyEntity mozc:sourceId="57"
                      mozc:keyCode="@integer/key_chartype_to_kana"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__kana__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__alphabet__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
     <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p">
+         mozc:keyHorizontalLayoutWeight="1" >
       <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc_123">
         <Flick>
           <KeyEntity mozc:sourceId="58"
                      mozc:keyCode="@integer/key_chartype_to_abc_123"
-                     mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__number_alphabet__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -1172,7 +1239,7 @@
           <KeyEntity mozc:sourceId="59"
                      mozc:keyCode="@integer/uchar_comma"
                      mozc:keyIcon="@raw/qwerty__function__comma">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__comma" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -1182,7 +1249,7 @@
           <KeyEntity mozc:sourceId="141"
                      mozc:keyCode="@integer/uchar_solidus"
                      mozc:keyIcon="@raw/qwerty__function__solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__solidus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -1192,21 +1259,31 @@
           <KeyEntity mozc:sourceId="142"
                      mozc:keyCode="@integer/uchar_commercial_at"
                      mozc:keyIcon="@raw/qwerty__function__commercial_at">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__commercial_at" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__commercial_at" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+    <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
          mozc:keyWidth="21%p">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="60"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+        <Flick>
+          <KeyEntity mozc:sourceId="150"
+                     mozc:keyCode="@integer/uchar_space"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+                     mozc:keyIcon="@null"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -1217,7 +1294,7 @@
           <KeyEntity mozc:sourceId="61"
                      mozc:keyCode="@integer/uchar_full_stop"
                      mozc:keyIcon="@raw/qwerty__function__full_stop">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__full_stop" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -1229,9 +1306,9 @@
         <Flick>
           <KeyEntity mozc:sourceId="66"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -1242,24 +1319,120 @@
         <Flick>
           <KeyEntity mozc:sourceId="67"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="63"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/qwerty__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon" >
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="143"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="144"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="145"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="146"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon" >
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="147"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="148"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="149"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 143 -->
+  <!-- Next sourceId: 151 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
index ddbed9f..19b14ea 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
@@ -33,11 +33,16 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_number"
     mozc:keyBackground="qwertyRegular"
-    mozc:keyWidth="10%p" mozc:keyHeight="20.5%"
-    mozc:horizontalGap="0.3%p" mozc:verticalGap="4%"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:keyWidth="10%p" mozc:keyHeight="21%p"
+    mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited"
+    mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+    mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+    mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
   <Row>
     <Key mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
@@ -45,7 +50,7 @@
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/uchar_digit_one"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_one" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -55,7 +60,7 @@
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_grave_accent"
                      mozc:keyIcon="@raw/qwerty__keyicon__grave_accent">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__grave_accent" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__grave_accent" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -66,7 +71,7 @@
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_digit_two"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_two" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -76,7 +81,7 @@
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_tilde"
                      mozc:keyIcon="@raw/qwerty__keyicon__tilde">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__tilde" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__tilde" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -87,7 +92,7 @@
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/uchar_digit_three"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_three" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -97,7 +102,7 @@
           <KeyEntity mozc:sourceId="6"
                      mozc:keyCode="@integer/uchar_ampersand"
                      mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ampersand" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -108,7 +113,7 @@
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_digit_four"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_four" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -118,7 +123,7 @@
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_vertical_line"
                      mozc:keyIcon="@raw/qwerty__keyicon__vertical_line">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__vertical_line" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__vertical_line" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -129,7 +134,7 @@
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_digit_five"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_five" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -139,7 +144,7 @@
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/uchar_circumflex_accent"
                      mozc:keyIcon="@raw/qwerty__keyicon__circumflex_accent">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__circumflex_accent" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__circumflex_accent" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -150,7 +155,7 @@
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/uchar_digit_six"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_six" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -160,7 +165,7 @@
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_plus_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__plus_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__plus_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__plus_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -171,7 +176,7 @@
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_digit_seven"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_seven" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -181,7 +186,7 @@
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/uchar_hyphen_minus"
                      mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__hyphen_minus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -192,7 +197,7 @@
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_digit_eight"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_eight" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -202,7 +207,7 @@
           <KeyEntity mozc:sourceId="16"
                      mozc:keyCode="@integer/uchar_asterisk"
                      mozc:keyIcon="@raw/qwerty__keyicon__asterisk">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__asterisk" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__asterisk" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -213,7 +218,7 @@
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_digit_nine"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_nine" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -223,7 +228,7 @@
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_solidus"
                      mozc:keyIcon="@raw/qwerty__keyicon__solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -234,7 +239,7 @@
           <KeyEntity mozc:sourceId="19"
                      mozc:keyCode="@integer/uchar_digit_zero"
                      mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_zero" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -244,21 +249,21 @@
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_equals_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__equals_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__equals_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__equals_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
-    <Spacer mozc:horizontalGap="5%p" />
+    <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
     <Key mozc:keyEdgeFlags="left" >
       <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
         <Flick>
           <KeyEntity mozc:sourceId="21"
                      mozc:keyCode="@integer/uchar_commercial_at"
                      mozc:keyIcon="@raw/qwerty__keyicon__commercial_at">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__commercial_at" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__commercial_at" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -268,7 +273,7 @@
           <KeyEntity mozc:sourceId="22"
                      mozc:keyCode="@integer/uchar_reverse_solidus"
                      mozc:keyIcon="@raw/qwerty__keyicon__reverse_solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__reverse_solidus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__reverse_solidus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -279,7 +284,7 @@
           <KeyEntity mozc:sourceId="23"
                      mozc:keyCode="@integer/uchar_number_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__number_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__number_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -289,7 +294,7 @@
           <KeyEntity mozc:sourceId="24"
                      mozc:keyCode="@integer/uchar_less_than_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__less_than_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__less_than_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__less_than_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -300,7 +305,7 @@
           <KeyEntity mozc:sourceId="25"
                      mozc:keyCode="@integer/uchar_ampersand"
                      mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ampersand" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -310,7 +315,7 @@
           <KeyEntity mozc:sourceId="26"
                      mozc:keyCode="@integer/uchar_greater_than_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__greater_than_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__greater_than_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__greater_than_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -321,7 +326,7 @@
           <KeyEntity mozc:sourceId="27"
                      mozc:keyCode="@integer/uchar_hyphen_minus"
                      mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__hyphen_minus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -331,7 +336,7 @@
           <KeyEntity mozc:sourceId="28"
                      mozc:keyCode="@integer/uchar_left_square_bracket"
                      mozc:keyIcon="@raw/qwerty__keyicon__left_square_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_square_bracket" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_square_bracket" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -342,7 +347,7 @@
           <KeyEntity mozc:sourceId="29"
                      mozc:keyCode="@integer/uchar_solidus"
                      mozc:keyIcon="@raw/qwerty__keyicon__solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -352,7 +357,7 @@
           <KeyEntity mozc:sourceId="30"
                      mozc:keyCode="@integer/uchar_right_square_bracket"
                      mozc:keyIcon="@raw/qwerty__keyicon__right_square_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_square_bracket" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_square_bracket" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -363,7 +368,7 @@
           <KeyEntity mozc:sourceId="31"
                      mozc:keyCode="@integer/uchar_dollar_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__dollar_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__dollar_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__dollar_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -373,7 +378,7 @@
           <KeyEntity mozc:sourceId="32"
                      mozc:keyCode="@integer/uchar_left_curly_bracket"
                      mozc:keyIcon="@raw/qwerty__keyicon__left_curly_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_curly_bracket" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_curly_bracket" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -384,7 +389,7 @@
           <KeyEntity mozc:sourceId="33"
                      mozc:keyCode="@integer/uchar_percent_sign"
                      mozc:keyIcon="@raw/qwerty__keyicon__percent_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__percent_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__percent_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -394,7 +399,7 @@
           <KeyEntity mozc:sourceId="34"
                      mozc:keyCode="@integer/uchar_right_curly_bracket"
                      mozc:keyIcon="@raw/qwerty__keyicon__right_curly_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_curly_bracket" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_curly_bracket" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -405,7 +410,7 @@
           <KeyEntity mozc:sourceId="35"
                      mozc:keyCode="@integer/uchar_left_parenthesis"
                      mozc:keyIcon="@raw/qwerty__keyicon__left_parenthesis">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_parenthesis" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_parenthesis" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -416,44 +421,43 @@
           <KeyEntity mozc:sourceId="36"
                      mozc:keyCode="@integer/uchar_right_parenthesis"
                      mozc:keyIcon="@raw/qwerty__keyicon__right_parenthesis">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_parenthesis" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_parenthesis" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="5%p" />
+    <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
   </Row>
   <Row>
-    <Key
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
-         mozc:isModifier="true" mozc:isSticky="true">
+    <Key mozc:keyWidth="13%p" mozc:keyEdgeFlags="left" mozc:isModifier="true"
+         mozc:keyBackground="qwertyFunction"
+         mozc:defaultIconWidth="@dimen/unlimited"
+         mozc:defaultIconHeight="@dimen/default_function_icon_height">
       <KeyState mozc:contentDescription="@string/cd_key_alt"
-                mozc:nextMetaState="alt"
-                mozc:keyBackground="qwertyFunctionLightOff" >
+                mozc:nextMetaState="alt" >
         <Flick>
           <KeyEntity mozc:sourceId="37"
                      mozc:keyCode="@integer/key_alt"
-                     mozc:keyIcon="@raw/qwerty__function__alt__icon" />
+                     mozc:keyIcon="@raw/qwerty__function__alt__base_icon" />
         </Flick>
       </KeyState>
       <KeyState mozc:contentDescription="@string/cd_key_alt_unmodified"
-                mozc:metaState="alt" mozc:nextRemovedMetaStates="alt"
-                mozc:keyBackground="qwertyFunctionLightOn" >
+                mozc:metaState="alt" mozc:nextRemovedMetaStates="alt" >
         <Flick>
           <KeyEntity mozc:sourceId="38"
                      mozc:keyCode="@integer/key_alt"
-                     mozc:keyIcon="@raw/qwerty__function__alt__icon" />
+                     mozc:keyIcon="@raw/qwerty__function__alt__alted_icon" />
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%p" mozc:stick="right" />
+    <Spacer mozc:keyWidth="2%p" mozc:stick="right" mozc:keyBackground="transparent" />
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_exclamation_mark">
         <Flick>
           <KeyEntity mozc:sourceId="39"
                      mozc:keyCode="@integer/uchar_exclamation_mark"
                      mozc:keyIcon="@raw/qwerty__keyicon__exclamation_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__exclamation_mark" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -464,7 +468,7 @@
           <KeyEntity mozc:sourceId="40"
                      mozc:keyCode="@integer/uchar_question_mark"
                      mozc:keyIcon="@raw/qwerty__keyicon__question_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__question_mark" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__question_mark" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -475,7 +479,7 @@
           <KeyEntity mozc:sourceId="41"
                      mozc:keyCode="@integer/uchar_apostrophe"
                      mozc:keyIcon="@raw/qwerty__keyicon__apostrophe">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__apostrophe" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__apostrophe" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -486,7 +490,7 @@
           <KeyEntity mozc:sourceId="42"
                      mozc:keyCode="@integer/uchar_quotation_mark"
                      mozc:keyIcon="@raw/qwerty__keyicon__quotation_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__quotation_mark" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__quotation_mark" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -497,7 +501,7 @@
           <KeyEntity mozc:sourceId="43"
                      mozc:keyCode="@integer/uchar_colon"
                      mozc:keyIcon="@raw/qwerty__keyicon__colon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__colon" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__colon" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -508,7 +512,7 @@
           <KeyEntity mozc:sourceId="44"
                      mozc:keyCode="@integer/uchar_semicolon"
                      mozc:keyIcon="@raw/qwerty__keyicon__semicolon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__semicolon" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__semicolon" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -519,36 +523,36 @@
           <KeyEntity mozc:sourceId="45"
                      mozc:keyCode="@integer/uchar_low_line"
                      mozc:keyIcon="@raw/qwerty__keyicon__low_line">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__low_line" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__low_line" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%p" mozc:stick="left" />
+    <Spacer mozc:keyWidth="2%p" mozc:stick="left" mozc:keyBackground="transparent" />
     <Key mozc:keyBackground="qwertyFunction"
          mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="46"
                      mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/qwerty__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
   </Row>
   <Row>
     <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
-         mozc:keyWidth="26%p" mozc:keyEdgeFlags="left">
+         mozc:keyHorizontalLayoutWeight="1" mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
         <Flick>
           <KeyEntity mozc:sourceId="47"
                      mozc:keyCode="@integer/key_chartype_to_abc"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__text_alphabet__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__text_alphabet__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__text_alphabet__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -559,21 +563,31 @@
           <KeyEntity mozc:sourceId="48"
                      mozc:keyCode="@integer/uchar_comma"
                      mozc:keyIcon="@raw/qwerty__function__comma">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__comma" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+    <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
          mozc:keyWidth="21%p">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="49"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+        <Flick>
+          <KeyEntity mozc:sourceId="64"
+                     mozc:keyCode="@integer/uchar_space"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+                     mozc:keyIcon="@null"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -584,7 +598,7 @@
           <KeyEntity mozc:sourceId="50"
                      mozc:keyCode="@integer/uchar_full_stop"
                      mozc:keyIcon="@raw/qwerty__function__full_stop">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__full_stop" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -596,9 +610,9 @@
         <Flick>
           <KeyEntity mozc:sourceId="55"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -609,24 +623,120 @@
         <Flick>
           <KeyEntity mozc:sourceId="56"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="52"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/qwerty__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon" >
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="57"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="58"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="59"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="60"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon" >
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="61"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="62"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="63"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon" >
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 57 -->
+  <!-- Next sourceId: 65 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
index 6f41993..acc50ec 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
@@ -33,19 +33,27 @@
     xmlns:mozc="http://schemas.android.com/apk/res-auto"
     mozc:keyboardContentDescription="@string/cd_keyboard_kana"
     mozc:keyBackground="qwertyRegular"
-    mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
+    mozc:keyWidth="10%p" mozc:keyHeight="21%p"
     mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+    mozc:defaultIconWidth="@dimen/unlimited"
+    mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+    mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+    mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
   <Row>
     <Key mozc:keyEdgeFlags="left">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
         <Flick>
           <KeyEntity mozc:sourceId="1"
                      mozc:keyCode="@integer/uchar_latin_small_letter_q"
+                     mozc:longPressKeyCode="@integer/uchar_digit_one"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_q"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -62,8 +70,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="2"
                      mozc:keyCode="@integer/uchar_latin_small_letter_w"
+                     mozc:longPressKeyCode="@integer/uchar_digit_two"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_w"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -80,8 +91,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="3"
                      mozc:keyCode="@integer/uchar_latin_small_letter_e"
+                     mozc:longPressKeyCode="@integer/uchar_digit_three"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_e"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -98,8 +112,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="4"
                      mozc:keyCode="@integer/uchar_latin_small_letter_r"
+                     mozc:longPressKeyCode="@integer/uchar_digit_four"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_r"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -116,8 +133,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="5"
                      mozc:keyCode="@integer/uchar_latin_small_letter_t"
+                     mozc:longPressKeyCode="@integer/uchar_digit_five"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_t"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -134,8 +154,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="6"
                      mozc:keyCode="@integer/uchar_latin_small_letter_y"
+                     mozc:longPressKeyCode="@integer/uchar_digit_six"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_y"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -152,8 +175,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="7"
                      mozc:keyCode="@integer/uchar_latin_small_letter_u"
+                     mozc:longPressKeyCode="@integer/uchar_digit_seven"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_u"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -170,8 +196,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="8"
                      mozc:keyCode="@integer/uchar_latin_small_letter_i"
+                     mozc:longPressKeyCode="@integer/uchar_digit_eight"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_i"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -188,8 +217,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="9"
                      mozc:keyCode="@integer/uchar_latin_small_letter_o"
+                     mozc:longPressKeyCode="@integer/uchar_digit_nine"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_o"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -206,8 +238,11 @@
         <Flick>
           <KeyEntity mozc:sourceId="10"
                      mozc:keyCode="@integer/uchar_latin_small_letter_p"
+                     mozc:longPressKeyCode="@integer/uchar_digit_zero"
+                     mozc:longPressTimeoutTrigger="false"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_p"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
           </KeyEntity>
         </Flick>
         <Flick mozc:direction="up">
@@ -227,7 +262,7 @@
           <KeyEntity mozc:sourceId="11"
                      mozc:keyCode="@integer/uchar_latin_small_letter_a"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_a" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -238,7 +273,7 @@
           <KeyEntity mozc:sourceId="12"
                      mozc:keyCode="@integer/uchar_latin_small_letter_s"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_s" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -249,7 +284,7 @@
           <KeyEntity mozc:sourceId="13"
                      mozc:keyCode="@integer/uchar_latin_small_letter_d"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_d" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -260,7 +295,7 @@
           <KeyEntity mozc:sourceId="14"
                      mozc:keyCode="@integer/uchar_latin_small_letter_f"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_f" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -271,7 +306,7 @@
           <KeyEntity mozc:sourceId="15"
                      mozc:keyCode="@integer/uchar_latin_small_letter_g"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_g" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -282,7 +317,7 @@
           <KeyEntity mozc:sourceId="16"
                      mozc:keyCode="@integer/uchar_latin_small_letter_h"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_h" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -293,7 +328,7 @@
           <KeyEntity mozc:sourceId="17"
                      mozc:keyCode="@integer/uchar_latin_small_letter_j"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_j" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -304,7 +339,7 @@
           <KeyEntity mozc:sourceId="18"
                      mozc:keyCode="@integer/uchar_latin_small_letter_k"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_k" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -315,7 +350,7 @@
           <KeyEntity mozc:sourceId="19"
                      mozc:keyCode="@integer/uchar_latin_small_letter_l"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_l" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -326,7 +361,7 @@
           <KeyEntity mozc:sourceId="20"
                      mozc:keyCode="@integer/uchar_hyphen_minus"
                      mozc:keyIcon="@raw/qwerty__keyicon__minus_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__minus_sign" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -339,20 +374,28 @@
         <Flick>
           <KeyEntity mozc:sourceId="21"
                      mozc:keyCode="@integer/key_symbol"
-                     mozc:keyIcon="@raw/qwerty__function__symbol__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+        <Flick>
+          <KeyEntity mozc:sourceId="60"
+                     mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
+    <Spacer mozc:keyWidth="2%" mozc:stick="right" mozc:keyBackground="transparent" />
     <Key>
       <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
         <Flick>
           <KeyEntity mozc:sourceId="22"
                      mozc:keyCode="@integer/uchar_latin_small_letter_z"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_z" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -363,7 +406,7 @@
           <KeyEntity mozc:sourceId="23"
                      mozc:keyCode="@integer/uchar_latin_small_letter_x" 
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_x" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -374,7 +417,7 @@
           <KeyEntity mozc:sourceId="24"
                      mozc:keyCode="@integer/uchar_latin_small_letter_c"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_c" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -385,7 +428,7 @@
           <KeyEntity mozc:sourceId="25"
                      mozc:keyCode="@integer/uchar_latin_small_letter_v"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_v" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -396,7 +439,7 @@
           <KeyEntity mozc:sourceId="26"
                      mozc:keyCode="@integer/uchar_latin_small_letter_b"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_b" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -407,7 +450,7 @@
           <KeyEntity mozc:sourceId="27"
                      mozc:keyCode="@integer/uchar_latin_small_letter_n"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_n" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -418,21 +461,21 @@
           <KeyEntity mozc:sourceId="28"
                      mozc:keyCode="@integer/uchar_latin_small_letter_m"
                      mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_m" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
-    <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
+    <Spacer mozc:keyWidth="2%" mozc:stick="left" mozc:keyBackground="transparent" />
     <Key mozc:keyBackground="qwertyFunction"
          mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
         <Flick>
           <KeyEntity mozc:sourceId="29"
                      mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/qwerty__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -445,46 +488,76 @@
           <KeyEntity mozc:sourceId="30"
                      mozc:keyCode="@integer/key_chartype_to_abc"
                      mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__kana__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__alphabet__popup" />
+                     mozc:keyIcon="@raw/qwerty__function__kana__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key mozc:keyBackground="qwertyFunction"
+         mozc:keyHorizontalLayoutWeight="1">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
+        <Flick>
+          <KeyEntity mozc:sourceId="32"
+                     mozc:keyCode="@integer/uchar_comma"
+                     mozc:keyIcon="@raw/qwerty__function__ideographic_comma">
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ideographic_comma" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
     <Key mozc:keyBackground="qwertyFunction"
          mozc:keyWidth="13%p">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana_123">
+      <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="fallback|composing">
         <Flick>
           <KeyEntity mozc:sourceId="31"
-                     mozc:keyCode="@integer/key_chartype_to_kana_123"
-                     mozc:keyIcon="@raw/qwerty__function__number_kana__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__number_kana__popup" />
+                     mozc:keyCode="@integer/uchar_question_mark"
+                     mozc:longPressKeyCode="@integer/uchar_exclamation_mark"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/qwerty__function__question_mark">
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__question_mark"
+                   mozc:popUpLongPressIcon="@raw/qwerty__keyicon__exclamation_mark" />
+          </KeyEntity>
+        </Flick>
+        <Flick mozc:direction="up">
+          <KeyEntity mozc:sourceId="59"
+                     mozc:keyCode="@integer/uchar_exclamation_mark"
+                     mozc:keyIcon="@raw/qwerty__function__exclamation_mark">
+            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
           </KeyEntity>
         </Flick>
       </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
+      <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
         <Flick>
-          <KeyEntity mozc:sourceId="32"
-                     mozc:keyCode="@integer/uchar_comma"
-                     mozc:keyIcon="@raw/qwerty__function__ideographic_comma">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_comma" />
-          </KeyEntity>
+          <KeyEntity mozc:sourceId="58"
+                     mozc:keyCode="@integer/key_globe"
+                     mozc:keyIcon="@raw/globe_qwerty_function"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+    <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
          mozc:keyWidth="21%p">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
         <Flick>
           <KeyEntity mozc:sourceId="33"
                      mozc:keyCode="@integer/uchar_space"
                      mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+        <Flick>
+          <KeyEntity mozc:sourceId="61"
+                     mozc:keyCode="@integer/uchar_space"
+                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+                     mozc:keyIcon="@null"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -495,7 +568,7 @@
           <KeyEntity mozc:sourceId="34"
                      mozc:keyCode="@integer/uchar_full_stop"
                      mozc:keyIcon="@raw/qwerty__function__ideographic_full_stop">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_full_stop" />
+            <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ideographic_full_stop" />
           </KeyEntity>
         </Flick>
       </KeyState>
@@ -507,9 +580,9 @@
         <Flick>
           <KeyEntity mozc:sourceId="39"
                      mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
@@ -520,24 +593,120 @@
         <Flick>
           <KeyEntity mozc:sourceId="40"
                      mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
+                     mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
         </Flick>
       </KeyState>
     </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+         mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+         mozc:defaultIconHeight="@dimen/unlimited">
       <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
         <Flick>
           <KeyEntity mozc:sourceId="36"
                      mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/qwerty__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+                mozc:metaState="composing">
+        <Flick>
+          <KeyEntity mozc:sourceId="51"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__enter__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_done"
+                mozc:metaState="action_done">
+        <Flick>
+          <KeyEntity mozc:sourceId="52"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_done__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_go"
+                mozc:metaState="action_go">
+        <Flick>
+          <KeyEntity mozc:sourceId="53"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_go__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_next"
+                mozc:metaState="action_next">
+        <Flick>
+          <KeyEntity mozc:sourceId="54"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_next__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+                mozc:metaState="action_previous">
+        <Flick>
+          <KeyEntity mozc:sourceId="55"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_previous__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_search"
+                mozc:metaState="action_search">
+        <Flick>
+          <KeyEntity mozc:sourceId="56"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_search__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+      <KeyState mozc:contentDescription="@string/cd_key_action_send"
+                mozc:metaState="action_send">
+        <Flick>
+          <KeyEntity mozc:sourceId="57"
+                     mozc:keyCode="@integer/uchar_linefeed"
+                     mozc:longPressKeyCode="@integer/key_symbol_emoji"
+                     mozc:longPressTimeoutTrigger="false"
+                     mozc:keyIcon="@raw/function__action_send__icon">
+            <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+                   mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
           </KeyEntity>
         </Flick>
       </KeyState>
     </Key>
   </Row>
-  <!-- Next sourceId: 41 -->
+  <!-- Next sourceId: 62 -->
 </Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml
deleted file mode 100644
index 3f37e92..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml
+++ /dev/null
@@ -1,720 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
-    xmlns:mozc="http://schemas.android.com/apk/res-auto"
-    mozc:keyboardContentDescription="@string/cd_keyboard_number"
-    mozc:keyBackground="qwertyRegular"
-    mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
-    mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
-    mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
-    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
-  <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
-  <Row>
-    <Key mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
-        <Flick>
-          <KeyEntity mozc:sourceId="1"
-                     mozc:keyCode="@integer/uchar_digit_one"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_black_star"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="2"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_q"
-                     mozc:keyIcon="@raw/qwerty__keyicon__black_star">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__black_star" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
-        <Flick>
-          <KeyEntity mozc:sourceId="3"
-                     mozc:keyCode="@integer/uchar_digit_two"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_black_heart_suit"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="4"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_w"
-                     mozc:keyIcon="@raw/qwerty__keyicon__black_heart_suit">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__black_heart_suit" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
-        <Flick>
-          <KeyEntity mozc:sourceId="5"
-                     mozc:keyCode="@integer/uchar_digit_three"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_eighth_note"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="6"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_e"
-                     mozc:keyIcon="@raw/qwerty__keyicon__eighth_note">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__eighth_note" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
-        <Flick>
-          <KeyEntity mozc:sourceId="7"
-                     mozc:keyCode="@integer/uchar_digit_four"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_reference_mark"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="8"
-                     mozc:keyCode="@integer/uchar_percent_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__reference_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__reference_mark" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
-        <Flick>
-          <KeyEntity mozc:sourceId="9"
-                     mozc:keyCode="@integer/uchar_digit_five"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_postal_mark"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="10"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_t"
-                     mozc:keyIcon="@raw/qwerty__keyicon__postal_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__postal_mark" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
-        <Flick>
-          <KeyEntity mozc:sourceId="11"
-                     mozc:keyCode="@integer/uchar_digit_six"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="12"
-                     mozc:keyCode="@integer/uchar_plus_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_plus_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_plus_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
-        <Flick>
-          <KeyEntity mozc:sourceId="13"
-                     mozc:keyCode="@integer/uchar_digit_seven"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="14"
-                     mozc:keyCode="@integer/uchar_hyphen_minus"
-                     mozc:keyIcon="@raw/qwerty__keyicon__minus_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
-        <Flick>
-          <KeyEntity mozc:sourceId="15"
-                     mozc:keyCode="@integer/uchar_digit_eight"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_multiplication_sign"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="16"
-                     mozc:keyCode="@integer/uchar_asterisk"
-                     mozc:keyIcon="@raw/qwerty__keyicon__multiplication_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__multiplication_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
-        <Flick>
-          <KeyEntity mozc:sourceId="17"
-                     mozc:keyCode="@integer/uchar_digit_nine"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_division_sign"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="18"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_i"
-                     mozc:keyIcon="@raw/qwerty__keyicon__division_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__division_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyEdgeFlags="right">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
-        <Flick>
-          <KeyEntity mozc:sourceId="19"
-                     mozc:keyCode="@integer/uchar_digit_zero"
-                     mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_equals_sign"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="20"
-                     mozc:keyCode="@integer/uchar_equals_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_equals_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_equals_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Spacer mozc:horizontalGap="5%p" />
-    <Key mozc:keyEdgeFlags="left" >
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
-        <Flick>
-          <KeyEntity mozc:sourceId="21"
-                     mozc:keyCode="@integer/uchar_commercial_at"
-                     mozc:keyIcon="@raw/qwerty__keyicon__commercial_at">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__commercial_at" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_katakana_middle_dot"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="22"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_a"
-                     mozc:keyIcon="@raw/qwerty__keyicon__katakana_middle_dot">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__katakana_middle_dot" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
-        <Flick>
-          <KeyEntity mozc:sourceId="23"
-                     mozc:keyCode="@integer/uchar_number_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__number_sign">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_two_dot_leader"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="24"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_s"
-                     mozc:keyIcon="@raw/qwerty__keyicon__two_dot_leader">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__two_dot_leader" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_ampersand">
-        <Flick>
-          <KeyEntity mozc:sourceId="25"
-                     mozc:keyCode="@integer/uchar_ampersand"
-                     mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_three_dot_leader"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="26"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_d"
-                     mozc:keyIcon="@raw/qwerty__keyicon__horizontal_ellipsis">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__horizontal_ellipsis" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
-        <Flick>
-          <KeyEntity mozc:sourceId="27"
-                     mozc:keyCode="@integer/uchar_hyphen_minus"
-                     mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_colon"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="28"
-                     mozc:keyCode="@integer/uchar_colon"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_colon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_colon" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
-        <Flick>
-          <KeyEntity mozc:sourceId="29"
-                     mozc:keyCode="@integer/uchar_solidus"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_solidus">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_solidus" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_semicolon"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="30"
-                     mozc:keyCode="@integer/uchar_semicolon"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_semicolon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_semicolon" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_left_corner_bracket">
-        <Flick>
-          <KeyEntity mozc:sourceId="31"
-                     mozc:keyCode="@integer/uchar_left_square_bracket"
-                     mozc:keyIcon="@raw/qwerty__keyicon__left_corner_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_corner_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_left_black_lenticular_bracket"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="32"
-                     mozc:keyCode="@integer/uchar_less_than_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__left_black_lenticular_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_black_lenticular_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_right_corner_bracket">
-        <Flick>
-          <KeyEntity mozc:sourceId="33"
-                     mozc:keyCode="@integer/uchar_right_square_bracket"
-                     mozc:keyIcon="@raw/qwerty__keyicon__right_corner_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_corner_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_right_black_lenticular_bracket"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="34"
-                     mozc:keyCode="@integer/uchar_greater_than_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__right_black_lenticular_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_black_lenticular_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState>
-        <Flick>
-          <KeyEntity mozc:sourceId="35"
-                     mozc:keyCode="@integer/uchar_left_parenthesis"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="36"
-                     mozc:keyCode="@integer/uchar_left_curly_bracket"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_left_curly_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_curly_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyEdgeFlags="right" >
-      <KeyState>
-        <Flick>
-          <KeyEntity mozc:sourceId="37"
-                     mozc:keyCode="@integer/uchar_right_parenthesis"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="38"
-                     mozc:keyCode="@integer/uchar_right_curly_bracket"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_right_curly_bracket">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_curly_bracket" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="5%p" />
-  </Row>
-  <Row>
-    <Key
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
-         mozc:isModifier="true" mozc:isSticky="true">
-      <KeyState mozc:contentDescription="@string/cd_key_alt"
-                mozc:nextMetaState="alt"
-                mozc:keyBackground="qwertyFunctionLightOff" >
-        <Flick>
-          <KeyEntity mozc:sourceId="39"
-                     mozc:keyCode="@integer/key_alt"
-                     mozc:keyIcon="@raw/qwerty__function__alt__icon" />
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_alt_unmodified"
-                mozc:metaState="alt" mozc:nextRemovedMetaStates="alt"
-                mozc:keyBackground="qwertyFunctionLightOn" >
-        <Flick>
-          <KeyEntity mozc:sourceId="40"
-                     mozc:keyCode="@integer/key_alt"
-                     mozc:keyIcon="@raw/qwerty__function__alt__icon" />
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="2%p" mozc:stick="right" />
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_exclamation_mark">
-        <Flick>
-          <KeyEntity mozc:sourceId="41"
-                     mozc:keyCode="@integer/uchar_exclamation_mark"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_exclamation_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_exclamation_mark" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_monday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="42"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_z"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_monday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_monday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_question_mark">
-        <Flick>
-          <KeyEntity mozc:sourceId="43"
-                     mozc:keyCode="@integer/uchar_question_mark"
-                     mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_question_mark">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_question_mark" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_tuesday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="44"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_x"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_tuesday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_tuesday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_u6642">
-        <Flick>
-          <KeyEntity mozc:sourceId="45"
-                     mozc:keyCode="@integer/uchar_apostrophe"
-                     mozc:keyIcon="@raw/qwerty__keyicon__cjk_hour">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_hour" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_wednesday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="46"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_c"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_wednesday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_wednesday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_u5206">
-        <Flick>
-          <KeyEntity mozc:sourceId="47"
-                     mozc:keyCode="@integer/uchar_quotation_mark"
-                     mozc:keyIcon="@raw/qwerty__keyicon__cjk_minute">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_minute" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_thursday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="48"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_v"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_thursday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_thursday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_u6708">
-        <Flick>
-          <KeyEntity mozc:sourceId="49"
-                     mozc:keyCode="@integer/uchar_dollar_sign"
-                     mozc:keyIcon="@raw/qwerty__keyicon__cjk_month">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_month" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_friday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="50"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_b"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_friday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_friday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_u65e5">
-        <Flick>
-          <KeyEntity mozc:sourceId="51"
-                     mozc:keyCode="@integer/uchar_vertical_line"
-                     mozc:keyIcon="@raw/qwerty__keyicon__cjk_day">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_day" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_saturday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="52"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_n"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_saturday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_saturday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key>
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_wave_dash">
-        <Flick>
-          <KeyEntity mozc:sourceId="53"
-                     mozc:keyCode="@integer/uchar_tilde"
-                     mozc:keyIcon="@raw/qwerty__keyicon__wave_dash">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__wave_dash" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-      <KeyState mozc:contentDescription="@string/cd_key_compound_sunday"
-                mozc:metaState="alt">
-        <Flick>
-          <KeyEntity mozc:sourceId="54"
-                     mozc:keyCode="@integer/uchar_latin_capital_letter_m"
-                     mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_sunday">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_sunday" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Spacer mozc:horizontalGap="2%p" mozc:stick="left" />
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
-        <Flick>
-          <KeyEntity mozc:sourceId="55"
-                     mozc:keyCode="@integer/key_backspace"
-                     mozc:keyIcon="@raw/qwerty__function__delete__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <Row>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
-         mozc:keyWidth="26%p" mozc:keyEdgeFlags="left">
-      <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
-        <Flick>
-          <KeyEntity mozc:sourceId="56"
-                     mozc:keyCode="@integer/key_chartype_to_kana"
-                     mozc:longPressKeyCode="@integer/key_menu_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__text_kana__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__text_kana__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
-        <Flick>
-          <KeyEntity mozc:sourceId="57"
-                     mozc:keyCode="@integer/uchar_comma"
-                     mozc:keyIcon="@raw/qwerty__function__comma">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
-         mozc:keyWidth="21%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
-        <Flick>
-          <KeyEntity mozc:sourceId="58"
-                     mozc:keyCode="@integer/uchar_space"
-                     mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
-                     mozc:keyIcon="@raw/qwerty__function__space__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_full_stop">
-        <Flick>
-          <KeyEntity mozc:sourceId="59"
-                     mozc:keyCode="@integer/uchar_full_stop"
-                     mozc:keyIcon="@raw/qwerty__function__full_stop">
-            <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p"
-         mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_left">
-        <Flick>
-          <KeyEntity mozc:sourceId="64"
-                     mozc:keyCode="@integer/key_left"
-                     mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="10%p"
-         mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_right">
-        <Flick>
-          <KeyEntity mozc:sourceId="65"
-                     mozc:keyCode="@integer/key_right"
-                     mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
-            <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-    <Key mozc:keyBackground="qwertyFunction"
-         mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
-      <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
-        <Flick>
-          <KeyEntity mozc:sourceId="61"
-                     mozc:keyCode="@integer/uchar_linefeed"
-                     mozc:keyIcon="@raw/qwerty__function__enter__icon">
-            <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
-          </KeyEntity>
-        </Flick>
-      </KeyState>
-    </Key>
-  </Row>
-  <!-- Next sourceId: 66 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml
new file mode 100644
index 0000000..c382b6b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+  <!--
+    The current keycode mapping to flick direction and tapping action is as follows;
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '+'  |    '1'    |    '2'    |    '3'    | 'BS'  |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '-'  |    '4'    |    '5'    |    '6'    |  '/'  |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======|
+     |       |           |           |           |       |
+     |  ','  |    '7'    |    '8'    |    '9'    |  '='  |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+     |       |           |           |           |       |
+     |  '.'  |    '*'    |    '0'    |    '#'    | 'SPC' |
+     |       |           |           |           |       |
+     +=======+===========+===========+===========+=======+
+   -->
+<Keyboard
+    xmlns:mozc="http://schemas.android.com/apk/res-auto"
+    mozc:keyboardContentDescription="@string/cd_keyboard_number"
+    mozc:keyBackground="twelvekeysRegular"
+    mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
+    mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
+    mozc:popUpHeight="@dimen/key_preview_height"
+    mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+    mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
+        <Flick>
+          <KeyEntity mozc:sourceId="1"
+                     mozc:keyCode="@integer/uchar_plus_sign"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__plus_sign">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__plus_sign" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
+        <Flick>
+          <KeyEntity mozc:sourceId="2"
+                     mozc:keyCode="@integer/uchar_digit_one"
+                     mozc:keyIcon="@raw/twelvekeys__number__one">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__one" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
+        <Flick>
+          <KeyEntity mozc:sourceId="3"
+                     mozc:keyCode="@integer/uchar_digit_two"
+                     mozc:keyIcon="@raw/twelvekeys__number__two">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__two" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
+        <Flick>
+          <KeyEntity mozc:sourceId="4"
+                     mozc:keyCode="@integer/uchar_digit_three"
+                     mozc:keyIcon="@raw/twelvekeys__number__three">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__three" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorTop"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0"
+         mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
+        <Flick>
+          <KeyEntity mozc:sourceId="5"
+                     mozc:keyCode="@integer/key_backspace"
+                     mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
+        <Flick>
+          <KeyEntity mozc:sourceId="6"
+                     mozc:keyCode="@integer/uchar_hyphen_minus"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__hyphen_minus">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__hyphen_minus" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
+        <Flick>
+          <KeyEntity mozc:sourceId="7"
+                     mozc:keyCode="@integer/uchar_digit_four"
+                     mozc:keyIcon="@raw/twelvekeys__number__four">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__four" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
+        <Flick>
+          <KeyEntity mozc:sourceId="8"
+                     mozc:keyCode="@integer/uchar_digit_five"
+                     mozc:keyIcon="@raw/twelvekeys__number__five">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__five" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
+        <Flick>
+          <KeyEntity mozc:sourceId="9"
+                     mozc:keyCode="@integer/uchar_digit_six"
+                     mozc:keyIcon="@raw/twelvekeys__number__six">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__six" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
+        <Flick>
+          <KeyEntity mozc:sourceId="10"
+                     mozc:keyCode="@integer/uchar_solidus"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__solidus">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__solidus" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
+        <Flick>
+          <KeyEntity mozc:sourceId="11"
+                     mozc:keyCode="@integer/uchar_comma"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__comma">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__comma" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
+        <Flick>
+          <KeyEntity mozc:sourceId="12"
+                     mozc:keyCode="@integer/uchar_digit_seven"
+                     mozc:keyIcon="@raw/twelvekeys__number__seven">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__seven" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
+        <Flick>
+          <KeyEntity mozc:sourceId="13"
+                     mozc:keyCode="@integer/uchar_digit_eight"
+                     mozc:keyIcon="@raw/twelvekeys__number__eight">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__eight" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
+        <Flick>
+          <KeyEntity mozc:sourceId="14"
+                     mozc:keyCode="@integer/uchar_digit_nine"
+                     mozc:keyIcon="@raw/twelvekeys__number__nine">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__nine" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorCenter"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_equals_sign">
+        <Flick>
+          <KeyEntity mozc:sourceId="15"
+                     mozc:keyCode="@integer/uchar_equals_sign"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__equals_sign">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__equals_sign" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <Row>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
+        <Flick>
+          <KeyEntity mozc:sourceId="16"
+                     mozc:keyCode="@integer/uchar_full_stop"
+                     mozc:keyIcon="@raw/twelvekeys__number__function__full_stop">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__full_stop" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+        <Flick>
+          <KeyEntity mozc:sourceId="17"
+                     mozc:keyCode="@integer/uchar_asterisk"
+                     mozc:keyIcon="@raw/twelvekeys__number__asterisk">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__asterisk" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
+        <Flick>
+          <KeyEntity mozc:sourceId="18"
+                     mozc:keyCode="@integer/uchar_digit_zero"
+                     mozc:keyIcon="@raw/twelvekeys__number__zero">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__zero" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Key>
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
+        <Flick>
+          <KeyEntity mozc:sourceId="19"
+                     mozc:keyCode="@integer/uchar_number_sign"
+                     mozc:keyIcon="@raw/twelvekeys__number__number_sign">
+            <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__number_sign" />
+          </KeyEntity>
+        </Flick>
+      </KeyState>
+    </Key>
+    <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+            mozc:keyBackground="keyboardSeparatorBottom"/>
+    <Key mozc:keyBackground="twelvekeysFunction"
+         mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+      <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
+        <Flick>
+          <KeyEntity mozc:sourceId="20"
+                     mozc:keyCode="@integer/uchar_space"
+                     mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+                     mozc:iconWidth="@dimen/unlimited"
+                     mozc:iconHeight="@dimen/default_function_icon_height" />
+        </Flick>
+      </KeyState>
+    </Key>
+  </Row>
+  <!-- Next sourceId: 21 -->
+</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml b/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml
new file mode 100644
index 0000000..887e6a0
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
+  <keyboard-layout android:name="keyboard_layout_japanese109"
+                   android:label="@string/pref_hardware_keymap_japanese109A"
+                   android:keyboardLayout="@raw/keyboard_layout_japanese109a" />
+</keyboard-layouts>
\ No newline at end of file
diff --git a/src/android/static_resources/resources_oss/res/xml/method.xml b/src/android/static_resources/resources_oss/res/xml/method.xml
index 2a0cfa4..5d191b3 100644
--- a/src/android/static_resources/resources_oss/res/xml/method.xml
+++ b/src/android/static_resources/resources_oss/res/xml/method.xml
@@ -32,7 +32,8 @@
 
 <input-method xmlns:android="http://schemas.android.com/apk/res/android"
     android:isDefault="@bool/im_is_default"
-    android:settingsActivity="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity" >
+    android:settingsActivity="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity"
+    android:supportsSwitchingToNextInputMethod="true" >
 
     <subtype
         android:icon="@drawable/application_icon"
diff --git a/src/android/static_resources/resources_oss/res/xml/pref_about.xml b/src/android/static_resources/resources_oss/res/xml/pref_about.xml
index 6184fe8..a009ce0 100644
--- a/src/android/static_resources/resources_oss/res/xml/pref_about.xml
+++ b/src/android/static_resources/resources_oss/res/xml/pref_about.xml
@@ -72,6 +72,12 @@
           android:targetClass="org.mozc.android.inputmethod.japanese.preference.MiniBrowserActivity"
           android:data="@string/pref_oss_credits_url" />
     </Preference>
+
+    <CheckBoxPreference
+        android:defaultValue="@bool/show_launcher_icon"
+        android:key="pref_launcher_icon_visibility"
+        android:summary="@string/pref_launcher_icon_visibility_description"
+        android:title="@string/pref_launcher_icon_visibility_title" />
   </PreferenceCategory>
 </PreferenceScreen>
 
diff --git a/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml b/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
index 5e94fd2..458872f 100644
--- a/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
+++ b/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
@@ -39,7 +39,7 @@
         android:title="@string/pref_haptic_feedback_title" />
 
     <org.mozc.android.inputmethod.japanese.preference.SeekbarPreference
-        android:defaultValue="30"
+        android:defaultValue="5"
         android:key="pref_haptic_feedback_duration_key"
         android:title="@string/pref_haptic_feedback_duration_title"
         android:max="250"
@@ -82,19 +82,25 @@
         android:title="@string/pref_fullscreen_title" />
 
     <ListPreference
-        android:defaultValue="BLUE_LIGHTGRAY"
+        android:defaultValue="@string/pref_skin_type_default"
         android:entries="@array/pref_skin_type_entries"
         android:entryValues="@array/pref_skin_type_values"
-        android:key="pref_skin_type_key"
+        android:key="@string/pref_skin_type_key"
         android:summary="@string/pref_skin_type_description"
         android:title="@string/pref_skin_type_title" />
 
     <ListPreference
-        android:defaultValue="JAPANESE109A"
+        android:defaultValue="DEFAULT"
         android:entries="@array/pref_hardware_keymap_entries"
         android:entryValues="@array/pref_hardware_keymap_values"
         android:key="pref_hardware_keymap"
         android:summary="@string/pref_hardware_keymap_description"
         android:title="@string/pref_hardware_title" />
+
+    <CheckBoxPreference
+        android:defaultValue="true"
+        android:key="pref_voice_input_key"
+        android:summary="@string/pref_voice_input_description"
+        android:title="@string/pref_voice_input_title" />
   </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml
new file mode 100644
index 0000000..64ed64d
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+    <Color
+        android:name="keyboardSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyTopColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyBottomColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+        android:color="#FF8E8E8E" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+        android:color="#FF535353" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+        android:color="#FF535353" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#FF535353" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyTopColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyBottomColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyHighlightColor"
+        android:color="#FF8E8E8E" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedKeyTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="qwertyLayoutPressedKeyBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="qwertyLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#FF535353" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+        android:color="#FF222222" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+        android:color="#FF535353" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="flickBaseColor"
+        android:color="#FF1B78A3" />
+    <Color
+        android:name="flickShadeColor"
+        android:color="#FF145A7A" />
+    <Color
+        android:name="popupFrameWindowTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="popupFrameWindowBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="popupFrameWindowShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="candidateScrollBarTopColor"
+        android:color="#FF73DAF7" />
+    <Color
+        android:name="candidateScrollBarBottomColor"
+        android:color="#FF3393E5" />
+    <Color
+        android:name="candidateBackgroundTopColor"
+        android:color="#FFE8E8E8" />
+    <Color
+        android:name="candidateBackgroundBottomColor"
+        android:color="#FFDCDCDC" />
+    <Color
+        android:name="candidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="candidateBackgroundBorderColor"
+        android:color="#FF8C8C8C" />
+    <Color
+        android:name="candidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="candidateBackgroundFocusedTopColor"
+        android:color="#FFA5DDF6" />
+    <Color
+        android:name="candidateBackgroundFocusedBottomColor"
+        android:color="#FFC1E9F5" />
+    <Color
+        android:name="candidateBackgroundFocusedShadowColor"
+        android:color="#40000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyTopColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="symbolReleasedFunctionKeyBottomColor"
+        android:color="#FF656565" />
+    <Color
+        android:name="symbolReleasedFunctionKeyHighlightColor"
+        android:color="#FF8E8E8E" />
+    <Color
+        android:name="symbolReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolPressedFunctionKeyTopColor"
+        android:color="#FF066696" />
+    <Color
+        android:name="symbolPressedFunctionKeyBottomColor"
+        android:color="#DD066696" />
+    <Color
+        android:name="symbolPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolScrollBarTopColor"
+        android:color="#FF73DAF7" />
+    <Color
+        android:name="symbolScrollBarBottomColor"
+        android:color="#FF53B6EE" />
+    <Color
+        android:name="symbolMinorCategoryTabSelectedColor"
+        android:color="#FF33B5E5" />
+    <Color
+        android:name="symbolMinorCategoryTabPressedColor"
+        android:color="#8033B5E5" />
+    <Color
+        android:name="symbolCandidateBackgroundTopColor"
+        android:color="#FFFEFEFE" />
+    <Color
+        android:name="symbolCandidateBackgroundBottomColor"
+        android:color="#FFECECEC" />
+    <Color
+        android:name="symbolCandidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolCandidateBackgroundBorderColor"
+        android:color="#7C666666" />
+    <Color
+        android:name="symbolCandidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="threeDotsColor"
+        android:color="#FFF7F7F7" />
+    <Color
+        android:name="keyIconMainColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconGuideColor"
+        android:color="#FFBEBEBE" />
+    <Color
+        android:name="keyIconGuideLightColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconMainHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconGuideHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconBoundColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconTwelvekeysFunctionColor"
+        android:color="#FFF7F7F7" />
+    <Color
+        android:name="keyIconTwelvekeysGlobeColor"
+        android:color="#99FFFFFF" />
+    <Color
+        android:name="keyIconQwertyFunctionColor"
+        android:color="#FFF7F7F7" />
+    <Color
+        android:name="keyIconFunctionDarkColor"
+        android:color="#FF868686" />
+    <Color
+        android:name="keyIconEnterColor"
+        android:color="#FFF7F7F7" />
+    <Color
+        android:name="keyIconEnterCircleColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyIconQwertyShiftOnArrowColor"
+        android:color="#FF55C6EE" />
+    <Color
+        android:name="keyPopupHighlightColor"
+        android:color="#FF4DA7CF" />
+    <Color
+        android:name="symbolMajorColor"
+        android:color="#FF333333" />
+    <Color
+        android:name="symbolMajorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="symbolMajorButtonBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="symbolMajorButtonPressedTopColor"
+        android:color="#FF959595" />
+    <Color
+        android:name="symbolMajorButtonPressedBottomColor"
+        android:color="#FF727272" />
+    <Color
+        android:name="symbolMajorButtonSelectedTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="symbolMajorButtonSelectedBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="symbolMajorButtonShadowColor"
+        android:color="#57000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundDefaultColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundScrolledColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="candidateValueTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateValueFocusedTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateDescriptionTextColor"
+        android:color="#FF888888" />
+    <Color
+        android:name="buttonFrameButtonPressedColor"
+        android:color="#8033B5E5" />
+
+    <Dimension
+        android:name="twelvekeysLeftOffsetDimension"
+        mozc:dimension="0.5dip" />
+    <Dimension
+        android:name="twelvekeysTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysRightOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyLeftOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="qwertyRightOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyBottomOffsetDimension"
+        mozc:dimension="3dip" />
+    <Dimension
+        android:name="qwertyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHeightDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHorizontalOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMajorButtonRoundDimension"
+        mozc:dimension="3.5dip" />
+    <Dimension
+        android:name="symbolMajorButtonPaddingDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMinorIndicatorHeightDimension"
+        mozc:dimension="5dip" />
+
+    <Drawable android:name="buttonFrameBackgroundDrawable" >
+        <inset android:drawable="@drawable/window_background_black" />
+    </Drawable>
+    <Drawable android:name="narrowFrameBackgroundDrawable" >
+        <color android:color="#524C51" />
+    </Drawable>
+    <Drawable
+        android:name="keyboardFrameSeparatorBackgroundDrawable" >
+        <inset android:drawable="@drawable/window_background_black" />
+    </Drawable>
+    <Drawable
+        android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+        <inset android:drawable="@drawable/window_background_black" />
+    </Drawable>
+    <Drawable android:name="windowBackgroundDrawable" >
+        <inset android:drawable="@drawable/window_background_black" />
+    </Drawable>
+    <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+        <inset android:drawable="@drawable/window_background_black" />
+    </Drawable>
+    <Drawable android:name="scrollBarBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/candidate__slidebar_background"
+            android:tileMode="repeat" />
+    </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml
new file mode 100644
index 0000000..635cd78
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+    <Color
+        android:name="keyboardSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+        android:color="#FFFAFAFA" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+        android:color="#FFAFAFAF" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+        android:color="#FF909090" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#FF898588" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+        android:color="#FF5C5759" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+        android:color="#FF555555" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+        android:color="#FFBFBFBD" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+        android:color="#FFF7F5EC" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedKeyTopColor"
+        android:color="#FFCCCCCC" />
+    <Color
+        android:name="qwertyLayoutPressedKeyBottomColor"
+        android:color="#FF797979" />
+    <Color
+        android:name="qwertyLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="flickBaseColor"
+        android:color="#FF55C6EE" />
+    <Color
+        android:name="flickShadeColor"
+        android:color="#FF3F94B2" />
+    <Color
+        android:name="popupFrameWindowTopColor"
+        android:color="#FFFBFBFB" />
+    <Color
+        android:name="popupFrameWindowBottomColor"
+        android:color="#FFEAEAEA" />
+    <Color
+        android:name="popupFrameWindowShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="candidateScrollBarTopColor"
+        android:color="#FF73DAF7" />
+    <Color
+        android:name="candidateScrollBarBottomColor"
+        android:color="#FF3393E5" />
+    <Color
+        android:name="candidateBackgroundTopColor"
+        android:color="#FFE8E8E8" />
+    <Color
+        android:name="candidateBackgroundBottomColor"
+        android:color="#FFDCDCDC" />
+    <Color
+        android:name="candidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="candidateBackgroundBorderColor"
+        android:color="#FF8C8C8C" />
+    <Color
+        android:name="candidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="candidateBackgroundFocusedTopColor"
+        android:color="#FFA5DDF6" />
+    <Color
+        android:name="candidateBackgroundFocusedBottomColor"
+        android:color="#FFC1E9F5" />
+    <Color
+        android:name="candidateBackgroundFocusedShadowColor"
+        android:color="#40000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="symbolReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="symbolReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolPressedFunctionKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="symbolPressedFunctionKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="symbolPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolScrollBarTopColor"
+        android:color="#FF73DAF7" />
+    <Color
+        android:name="symbolScrollBarBottomColor"
+        android:color="#FF53B6EE" />
+    <Color
+        android:name="symbolMinorCategoryTabSelectedColor"
+        android:color="#FF33B5E5" />
+    <Color
+        android:name="symbolMinorCategoryTabPressedColor"
+        android:color="#8033B5E5" />
+    <Color
+        android:name="symbolCandidateBackgroundTopColor"
+        android:color="#FFFEFEFE" />
+    <Color
+        android:name="symbolCandidateBackgroundBottomColor"
+        android:color="#FFECECEC" />
+    <Color
+        android:name="symbolCandidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolCandidateBackgroundBorderColor"
+        android:color="#7C666666" />
+    <Color
+        android:name="symbolCandidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="threeDotsColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconMainColor"
+        android:color="#FF272727" />
+    <Color
+        android:name="keyIconGuideColor"
+        android:color="#FF333333" />
+    <Color
+        android:name="keyIconGuideLightColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconMainHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconGuideHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconBoundColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconTwelvekeysFunctionColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconTwelvekeysGlobeColor"
+        android:color="#99272727" />
+    <Color
+        android:name="keyIconQwertyFunctionColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconFunctionDarkColor"
+        android:color="#FF272727" />
+    <Color
+        android:name="keyIconEnterColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconEnterCircleColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyIconQwertyShiftOnArrowColor"
+        android:color="#FF55C6EE" />
+    <Color
+        android:name="keyPopupHighlightColor"
+        android:color="#FF57B8E5" />
+    <Color
+        android:name="symbolMajorColor"
+        android:color="#FF333333" />
+    <Color
+        android:name="symbolMajorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="symbolMajorButtonBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="symbolMajorButtonPressedTopColor"
+        android:color="#FF959595" />
+    <Color
+        android:name="symbolMajorButtonPressedBottomColor"
+        android:color="#FF727272" />
+    <Color
+        android:name="symbolMajorButtonSelectedTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="symbolMajorButtonSelectedBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="symbolMajorButtonShadowColor"
+        android:color="#57000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundDefaultColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundScrolledColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="candidateValueTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateValueFocusedTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateDescriptionTextColor"
+        android:color="#FF888888" />
+    <Color
+        android:name="buttonFrameButtonPressedColor"
+        android:color="#8033B5E5" />
+
+    <Dimension
+        android:name="twelvekeysLeftOffsetDimension"
+        mozc:dimension="0.5dip" />
+    <Dimension
+        android:name="twelvekeysTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysRightOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyLeftOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="qwertyRightOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyBottomOffsetDimension"
+        mozc:dimension="3dip" />
+    <Dimension
+        android:name="qwertyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHeightDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHorizontalOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMajorButtonRoundDimension"
+        mozc:dimension="3.5dip" />
+    <Dimension
+        android:name="symbolMajorButtonPaddingDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMinorIndicatorHeightDimension"
+        mozc:dimension="5dip" />
+
+    <Drawable android:name="buttonFrameBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background_dark"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="narrowFrameBackgroundDrawable" >
+        <color android:color="#524C51" />
+    </Drawable>
+    <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+        <color android:color="#19FFFFFF" />
+    </Drawable>
+    <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="windowBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="scrollBarBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/candidate__slidebar_background"
+            android:tileMode="repeat" />
+    </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml b/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml
new file mode 100644
index 0000000..68c32b1
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml
@@ -0,0 +1,451 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+    <Color
+        android:name="keyboardSeparatorColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyTopColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyBottomColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyShadowColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyTopColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyBottomColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyTopColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyBottomColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyTopColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="qwertyLayoutPressedKeyBottomColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="qwertyLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF263238" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyTopColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+        android:color="#1ACFD8DC" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+        android:color="#1ACFD8DC" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyTopColor"
+        android:color="#33CFD8DC" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+        android:color="#33CFD8DC" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="flickBaseColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="flickShadeColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="popupFrameWindowTopColor"
+        android:color="#FF404C52" />
+    <Color
+        android:name="popupFrameWindowBottomColor"
+        android:color="#FF404C52" />
+    <Color
+        android:name="popupFrameWindowShadowColor"
+        android:color="#CC000000" />
+    <Color
+        android:name="candidateScrollBarTopColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="candidateScrollBarBottomColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="candidateBackgroundTopColor"
+        android:color="#FF21272B" />
+    <Color
+        android:name="candidateBackgroundBottomColor"
+        android:color="#FF21272B" />
+    <Color
+        android:name="candidateBackgroundHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="candidateBackgroundBorderColor"
+        android:color="#FF21272B" />
+    <Color
+        android:name="candidateBackgroundSeparatorColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="candidateBackgroundFocusedTopColor"
+        android:color="#FF383D41" />
+    <Color
+        android:name="candidateBackgroundFocusedBottomColor"
+        android:color="#FF383D41" />
+    <Color
+        android:name="candidateBackgroundFocusedShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyTopColor"
+        android:color="#26FFFFFF" />
+    <Color
+        android:name="symbolPressedFunctionKeyBottomColor"
+        android:color="#26FFFFFF" />
+    <Color
+        android:name="symbolPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolScrollBarTopColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="symbolScrollBarBottomColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="symbolMinorCategoryTabSelectedColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="symbolMinorCategoryTabPressedColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="symbolCandidateBackgroundTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundBorderColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolSeparatorColor"
+        android:color="#1AFFFFFF" />
+    <Color
+        android:name="threeDotsColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyIconMainColor"
+        android:color="#CCFFFFFF" />
+    <Color
+        android:name="keyIconGuideColor"
+        android:color="#99FFFFFF" />
+    <Color
+        android:name="keyIconGuideLightColor"
+        android:color="#66FFFFFF" />
+    <Color
+        android:name="keyIconMainHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconGuideHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconBoundColor"
+        android:color="#66FFFFFF" />
+    <Color
+        android:name="keyIconTwelvekeysFunctionColor"
+        android:color="#99FFFFFF" />
+    <Color
+        android:name="keyIconTwelvekeysGlobeColor"
+        android:color="#99FFFFFF" />
+    <Color
+        android:name="keyIconQwertyFunctionColor"
+        android:color="#99FFFFFF" />
+    <Color
+        android:name="keyIconFunctionDarkColor"
+        android:color="#33FFFFFF" />
+    <Color
+        android:name="keyIconEnterColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconEnterCircleColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="keyIconQwertyShiftOnArrowColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="keyPopupHighlightColor"
+        android:color="#FF80CBC4" />
+    <Color
+        android:name="symbolMajorColor"
+        android:color="#4CFFFFFF" />
+    <Color
+        android:name="symbolMajorSelectedColor"
+        android:color="#CCFFFFFF" />
+    <Color
+        android:name="symbolMinorColor"
+        android:color="#4CFFFFFF" />
+    <Color
+        android:name="symbolMinorSelectedColor"
+        android:color="#CCFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolMajorButtonBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolMajorButtonPressedTopColor"
+        android:color="#4CFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonPressedBottomColor"
+        android:color="#4CFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonSelectedTopColor"
+        android:color="#26FFFFFF" />
+    <Color
+        android:name="symbolMajorButtonSelectedBottomColor"
+        android:color="#26FFFFFF" />
+    <Color
+        android:name="symbolMajorButtonShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundDefaultColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundScrolledColor"
+        android:color="#CC384248" />
+    <Color
+        android:name="candidateValueTextColor"
+        android:color="#B3FFFFFF" />
+    <Color
+        android:name="candidateValueFocusedTextColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="candidateDescriptionTextColor"
+        android:color="#66FFFFFF" />
+    <Color
+        android:name="buttonFrameButtonPressedColor"
+        android:color="#1AFFFFFF" />
+
+    <Dimension
+        android:name="twelvekeysLeftOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysTopOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysRightOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyLeftOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyTopOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyRightOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHeightDimension"
+        mozc:dimension="24dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHorizontalOffsetDimension"
+        mozc:dimension="5dip" />
+    <Dimension
+        android:name="qwertySpaceKeyRoundRadiusDimension"
+        mozc:dimension="4dip" />
+    <Dimension
+        android:name="symbolMajorButtonRoundDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="symbolMajorButtonPaddingDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="symbolMinorIndicatorHeightDimension"
+        mozc:dimension="2dip" />
+
+    <Drawable android:name="buttonFrameBackgroundDrawable" >
+        <color android:color="#FF21272B" />
+    </Drawable>
+    <Drawable android:name="narrowFrameBackgroundDrawable" >
+        <color android:color="#FF21272B" />
+    </Drawable>
+    <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+        <color android:color="#0CFFFFFF" />
+    </Drawable>
+    <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+        <color android:color="#CC21272B" />
+    </Drawable>
+    <Drawable android:name="windowBackgroundDrawable" >
+        <color android:color="#FF263238" />
+    </Drawable>
+    <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+        <color android:color="#FF21272B" />
+    </Drawable>
+    <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+        <color android:color="#FF263238" />
+    </Drawable>
+    <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+        <color android:color="#FF263238" />
+    </Drawable>
+    <Drawable android:name="scrollBarBackgroundDrawable" >
+        <color android:color="#FF21272B" />
+    </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml b/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml
new file mode 100644
index 0000000..2b5ffd6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml
@@ -0,0 +1,451 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+    <Color
+        android:name="keyboardSeparatorColor"
+        android:color="#FFD1D6D9" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyTopColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyBottomColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyShadowColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyTopColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyBottomColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutPressedKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FFECEFF1" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyTopColor"
+        android:color="#4D37474F" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+        android:color="#4D37474F" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="flickBaseColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="flickShadeColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="popupFrameWindowTopColor"
+        android:color="#FFD0D6D9" />
+    <Color
+        android:name="popupFrameWindowBottomColor"
+        android:color="#FFD0D6D9" />
+    <Color
+        android:name="popupFrameWindowShadowColor"
+        android:color="#66000000" />
+    <Color
+        android:name="candidateScrollBarTopColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="candidateScrollBarBottomColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="candidateBackgroundTopColor"
+        android:color="#FFE4E7E9" />
+    <Color
+        android:name="candidateBackgroundBottomColor"
+        android:color="#FFE4E7E9" />
+    <Color
+        android:name="candidateBackgroundHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="candidateBackgroundBorderColor"
+        android:color="#FFE4E7E9" />
+    <Color
+        android:name="candidateBackgroundSeparatorColor"
+        android:color="#FFD1D6D9" />
+    <Color
+        android:name="candidateBackgroundFocusedTopColor"
+        android:color="#FFD3D7DA" />
+    <Color
+        android:name="candidateBackgroundFocusedBottomColor"
+        android:color="#FFD3D7DA" />
+    <Color
+        android:name="candidateBackgroundFocusedShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="symbolPressedFunctionKeyBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="symbolPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolScrollBarTopColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="symbolScrollBarBottomColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="symbolMinorCategoryTabSelectedColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="symbolMinorCategoryTabPressedColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="symbolCandidateBackgroundTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundBorderColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolCandidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolSeparatorColor"
+        android:color="#FFD1D6D9" />
+    <Color
+        android:name="threeDotsColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyIconMainColor"
+        android:color="#FF37474F" />
+    <Color
+        android:name="keyIconGuideColor"
+        android:color="#CC37474F" />
+    <Color
+        android:name="keyIconGuideLightColor"
+        android:color="#6637474F" />
+    <Color
+        android:name="keyIconMainHighlightColor"
+        android:color="#FF37474F" />
+    <Color
+        android:name="keyIconGuideHighlightColor"
+        android:color="#FF37474F" />
+    <Color
+        android:name="keyIconBoundColor"
+        android:color="#6637474F" />
+    <Color
+        android:name="keyIconTwelvekeysFunctionColor"
+        android:color="#9937474F" />
+    <Color
+        android:name="keyIconTwelvekeysGlobeColor"
+        android:color="#9937474F" />
+    <Color
+        android:name="keyIconQwertyFunctionColor"
+        android:color="#9937474F" />
+    <Color
+        android:name="keyIconFunctionDarkColor"
+        android:color="#3337474F" />
+    <Color
+        android:name="keyIconEnterColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconEnterCircleColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="keyIconQwertyShiftOnArrowColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="keyPopupHighlightColor"
+        android:color="#FF4DB6AC" />
+    <Color
+        android:name="symbolMajorColor"
+        android:color="#8037474F" />
+    <Color
+        android:name="symbolMajorSelectedColor"
+        android:color="#FF37474F" />
+    <Color
+        android:name="symbolMinorColor"
+        android:color="#8037474F" />
+    <Color
+        android:name="symbolMinorSelectedColor"
+        android:color="#FF37474F" />
+    <Color
+        android:name="symbolMajorButtonTopColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolMajorButtonBottomColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolMajorButtonPressedTopColor"
+        android:color="#4C37474F" />
+    <Color
+        android:name="symbolMajorButtonPressedBottomColor"
+        android:color="#4C37474F" />
+    <Color
+        android:name="symbolMajorButtonSelectedTopColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="symbolMajorButtonSelectedBottomColor"
+        android:color="#2637474F" />
+    <Color
+        android:name="symbolMajorButtonShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundDefaultColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundScrolledColor"
+        android:color="#CCFFFFFF" />
+    <Color
+        android:name="candidateValueTextColor"
+        android:color="#CC37474F" />
+    <Color
+        android:name="candidateValueFocusedTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateDescriptionTextColor"
+        android:color="#6637474F" />
+    <Color
+        android:name="buttonFrameButtonPressedColor"
+        android:color="#2637474F" />
+
+    <Dimension
+        android:name="twelvekeysLeftOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysTopOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysRightOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="twelvekeysBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyLeftOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyTopOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyRightOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHeightDimension"
+        mozc:dimension="24dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHorizontalOffsetDimension"
+        mozc:dimension="5dip" />
+    <Dimension
+        android:name="qwertySpaceKeyRoundRadiusDimension"
+        mozc:dimension="4dip" />
+    <Dimension
+        android:name="symbolMajorButtonRoundDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="symbolMajorButtonPaddingDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="symbolMinorIndicatorHeightDimension"
+        mozc:dimension="2dip" />
+
+    <Drawable android:name="buttonFrameBackgroundDrawable" >
+        <color android:color="#FFE4E7E9" />
+    </Drawable>
+    <Drawable android:name="narrowFrameBackgroundDrawable" >
+        <color android:color="#FFE4E7E9" />
+    </Drawable>
+    <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+        <color android:color="#99FFFFFF" />
+    </Drawable>
+    <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+        <color android:color="#1A37474F" />
+    </Drawable>
+    <Drawable android:name="windowBackgroundDrawable" >
+        <color android:color="#FFECEFF1" />
+    </Drawable>
+    <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE4E7E9" />
+    </Drawable>
+    <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+        <color android:color="#FFECEFF1" />
+    </Drawable>
+    <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+        <color android:color="#FFECEFF1" />
+    </Drawable>
+    <Drawable android:name="scrollBarBackgroundDrawable" >
+        <color android:color="#FFE4E7E9" />
+    </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml
new file mode 100644
index 0000000..35a5523
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+    <Color
+        android:name="keyboardSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+        android:color="#FFFAFAFA" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+        android:color="#FFAFAFAF" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+        android:color="#FF909090" />
+    <Color
+        android:name="twelvekeysLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#FF898588" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+        android:color="#FF5C5759" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+        android:color="#FF555555" />
+    <Color
+        android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+        android:color="#FFBFBFBD" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+        android:color="#FFF7F5EC" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+        android:color="#00000000" />
+    <Color
+        android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedKeyTopColor"
+        android:color="#FFCCCCCC" />
+    <Color
+        android:name="qwertyLayoutPressedKeyBottomColor"
+        android:color="#FF797979" />
+    <Color
+        android:name="qwertyLayoutPressedKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="flickBaseColor"
+        android:color="#FFFF9A28" />
+    <Color
+        android:name="flickShadeColor"
+        android:color="#FFC0741e" />
+    <Color
+        android:name="popupFrameWindowTopColor"
+        android:color="#FFFBFBFB" />
+    <Color
+        android:name="popupFrameWindowBottomColor"
+        android:color="#FFEAEAEA" />
+    <Color
+        android:name="popupFrameWindowShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="candidateScrollBarTopColor"
+        android:color="#FFFFE39D" />
+    <Color
+        android:name="candidateScrollBarBottomColor"
+        android:color="#FFFFCC33" />
+    <Color
+        android:name="candidateBackgroundTopColor"
+        android:color="#FFE8E8E8" />
+    <Color
+        android:name="candidateBackgroundBottomColor"
+        android:color="#FFDCDCDC" />
+    <Color
+        android:name="candidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="candidateBackgroundBorderColor"
+        android:color="#FF8C8C8C" />
+    <Color
+        android:name="candidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="candidateBackgroundFocusedTopColor"
+        android:color="#FFFFC142" />
+    <Color
+        android:name="candidateBackgroundFocusedBottomColor"
+        android:color="#FFFFe096" />
+    <Color
+        android:name="candidateBackgroundFocusedShadowColor"
+        android:color="#40000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyTopColor"
+        android:color="#FF858087" />
+    <Color
+        android:name="symbolReleasedFunctionKeyBottomColor"
+        android:color="#FF67645F" />
+    <Color
+        android:name="symbolReleasedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolReleasedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolPressedFunctionKeyTopColor"
+        android:color="#FFE9E4E4" />
+    <Color
+        android:name="symbolPressedFunctionKeyBottomColor"
+        android:color="#FFB2ADAD" />
+    <Color
+        android:name="symbolPressedFunctionKeyHighlightColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolPressedFunctionKeyShadowColor"
+        android:color="#FF1E1E1E" />
+    <Color
+        android:name="symbolScrollBarTopColor"
+        android:color="#FFFFCC00" />
+    <Color
+        android:name="symbolScrollBarBottomColor"
+        android:color="#FFFF9C00" />
+    <Color
+        android:name="symbolMinorCategoryTabSelectedColor"
+        android:color="#FFFF9200" />
+    <Color
+        android:name="symbolMinorCategoryTabPressedColor"
+        android:color="#80FF9200" />
+    <Color
+        android:name="symbolCandidateBackgroundTopColor"
+        android:color="#FFFEFEFE" />
+    <Color
+        android:name="symbolCandidateBackgroundBottomColor"
+        android:color="#FFECECEC" />
+    <Color
+        android:name="symbolCandidateBackgroundHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolCandidateBackgroundBorderColor"
+        android:color="#7C666666" />
+    <Color
+        android:name="symbolCandidateBackgroundSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="symbolSeparatorColor"
+        android:color="#00000000" />
+    <Color
+        android:name="threeDotsColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconMainColor"
+        android:color="#FF272727" />
+    <Color
+        android:name="keyIconGuideColor"
+        android:color="#FF333333" />
+    <Color
+        android:name="keyIconGuideLightColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconMainHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconGuideHighlightColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="keyIconBoundColor"
+        android:color="#FF999999" />
+    <Color
+        android:name="keyIconTwelvekeysFunctionColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconTwelvekeysGlobeColor"
+        android:color="#99272727" />
+    <Color
+        android:name="keyIconQwertyFunctionColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconFunctionDarkColor"
+        android:color="#FF272727" />
+    <Color
+        android:name="keyIconEnterColor"
+        android:color="#FFDDDDDD" />
+    <Color
+        android:name="keyIconEnterCircleColor"
+        android:color="#00000000" />
+    <Color
+        android:name="keyIconQwertyShiftOnArrowColor"
+        android:color="#FFFFB005" />
+    <Color
+        android:name="keyPopupHighlightColor"
+        android:color="#FFF7982d" />
+    <Color
+        android:name="symbolMajorColor"
+        android:color="#FF333333" />
+    <Color
+        android:name="symbolMajorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMinorSelectedColor"
+        android:color="#FFFFFFFF" />
+    <Color
+        android:name="symbolMajorButtonTopColor"
+        android:color="#FFF5F5F5" />
+    <Color
+        android:name="symbolMajorButtonBottomColor"
+        android:color="#FFD2D2D2" />
+    <Color
+        android:name="symbolMajorButtonPressedTopColor"
+        android:color="#FF959595" />
+    <Color
+        android:name="symbolMajorButtonPressedBottomColor"
+        android:color="#FF727272" />
+    <Color
+        android:name="symbolMajorButtonSelectedTopColor"
+        android:color="#FFAAAAAA" />
+    <Color
+        android:name="symbolMajorButtonSelectedBottomColor"
+        android:color="#FF828282" />
+    <Color
+        android:name="symbolMajorButtonShadowColor"
+        android:color="#57000000" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundDefaultColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="keyboardFoldingButtonBackgroundScrolledColor"
+        android:color="#8C676767" />
+    <Color
+        android:name="candidateValueTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateValueFocusedTextColor"
+        android:color="#FF000000" />
+    <Color
+        android:name="candidateDescriptionTextColor"
+        android:color="#FF888888" />
+    <Color
+        android:name="buttonFrameButtonPressedColor"
+        android:color="#80FF9200" />
+
+    <Dimension
+        android:name="twelvekeysLeftOffsetDimension"
+        mozc:dimension="0.5dip" />
+    <Dimension
+        android:name="twelvekeysTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysRightOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="twelvekeysBottomOffsetDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertyLeftOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyTopOffsetDimension"
+        mozc:dimension="1dip" />
+    <Dimension
+        android:name="qwertyRightOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertyBottomOffsetDimension"
+        mozc:dimension="3dip" />
+    <Dimension
+        android:name="qwertyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHeightDimension"
+        mozc:dimension="0dip" />
+    <Dimension
+        android:name="qwertySpaceKeyHorizontalOffsetDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="qwertySpaceKeyRoundRadiusDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMajorButtonRoundDimension"
+        mozc:dimension="3.5dip" />
+    <Dimension
+        android:name="symbolMajorButtonPaddingDimension"
+        mozc:dimension="2dip" />
+    <Dimension
+        android:name="symbolMinorIndicatorHeightDimension"
+        mozc:dimension="5dip" />
+
+    <Drawable android:name="buttonFrameBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background_dark"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="narrowFrameBackgroundDrawable" >
+        <color android:color="#524C51" />
+    </Drawable>
+    <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+        <color android:color="#19FFFFFF" />
+    </Drawable>
+    <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="windowBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+        <color android:color="#FFE5E5E5" />
+    </Drawable>
+    <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/window__background"
+            android:tileMode="repeat" />
+    </Drawable>
+    <Drawable android:name="scrollBarBackgroundDrawable" >
+        <bitmap
+            android:src="@drawable/candidate__slidebar_background"
+            android:tileMode="repeat" />
+    </Drawable>
+</Skin>
diff --git a/src/android/tests/AndroidManifest_template.xml b/src/android/tests/AndroidManifest_template.xml
index a5e92d1..7f3acc6 100644
--- a/src/android/tests/AndroidManifest_template.xml
+++ b/src/android/tests/AndroidManifest_template.xml
@@ -57,7 +57,7 @@
                    android:targetPackage="@ANDROID_APPLICATION_ID@"
                    android:label="Tests for org.mozc.android.inputmethod.japanese"/>
 
-  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
+  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
   <!-- Google Japanese Input (the main code) requires the following permissions. -->
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission android:name="android.permission.INTERNET" />
diff --git a/src/android/tests/project.properties b/src/android/tests/project.properties
index 2d6f3af..5430b63 100644
--- a/src/android/tests/project.properties
+++ b/src/android/tests/project.properties
@@ -37,4 +37,4 @@
 # project structure.
 
 # Project target.
-target=android-19
+target=android-21
diff --git a/src/android/tests/res/values-land/dimens.xml b/src/android/tests/res/values-land/dimens.xml
new file mode 100644
index 0000000..ecb7a0f
--- /dev/null
+++ b/src/android/tests/res/values-land/dimens.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <dimen name="value_for_testing_port_1dip_land_2dip">2dip</dimen>
+
+</resources>
diff --git a/src/android/tests/res/values/dimens.xml b/src/android/tests/res/values/dimens.xml
new file mode 100644
index 0000000..3f8fafd
--- /dev/null
+++ b/src/android/tests/res/values/dimens.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <dimen name="value_for_testing_port_1dip_land_2dip">1dip</dimen>
+
+</resources>
diff --git a/src/android/tests/res/values/dummy.xml b/src/android/tests/res/values/dummy.xml
deleted file mode 100644
index f2315c0..0000000
--- a/src/android/tests/res/values/dummy.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- By placing this dummy file, res directory is generated by ADT and
-     build on Eclipse gets healthier. -->
-<resources/>
diff --git a/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml b/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml
new file mode 100644
index 0000000..8ff293a
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <Drawable android:name="windowBackgroundDrawable" >
+        <color android:color="#FFFFFFFF" />
+    </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml b/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml
new file mode 100644
index 0000000..4357794
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <Drawable android:name="windowBackgroundDrawable" >
+        <color android:color="#FFFFFFFF" />
+        <color android:color="#FFFFFFFF" />
+    </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_1.xml b/src/android/tests/res/xml/skinparser_test_1.xml
new file mode 100644
index 0000000..f346595
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_1.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<InvalidRootTag>
+</InvalidRootTag>
diff --git a/src/android/tests/res/xml/skinparser_test_2.xml b/src/android/tests/res/xml/skinparser_test_2.xml
new file mode 100644
index 0000000..730b1a0
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+    <Color android:name="no_such_field" android:color="#FFFFFFFF" />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_3.xml b/src/android/tests/res/xml/skinparser_test_3.xml
new file mode 100644
index 0000000..931cacd
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_3.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+    <Color />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_4.xml b/src/android/tests/res/xml/skinparser_test_4.xml
new file mode 100644
index 0000000..9a37f0d
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_4.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <Color android:name="mycolor" >
+        <InvalidInnerTag />
+    </Color>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_5.xml b/src/android/tests/res/xml/skinparser_test_5.xml
new file mode 100644
index 0000000..a207dbb
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_5.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+    <Drawable />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_6.xml b/src/android/tests/res/xml/skinparser_test_6.xml
new file mode 100644
index 0000000..eb939bf
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_6.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <Drawable android:name="mydrawable" >
+        <InvalidInnerTag />
+    </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_7.xml b/src/android/tests/res/xml/skinparser_test_7.xml
new file mode 100644
index 0000000..0ee8aab
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_7.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <UnknownTag />
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
index c714306..2e3c1a4 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
@@ -33,11 +33,15 @@
 import org.mozc.android.inputmethod.japanese.ApplicationInitializerFactory.ApplicationInitializer;
 import org.mozc.android.inputmethod.japanese.MozcUtil.TelephonyManagerInterface;
 import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil.PreferenceManagerStaticInterface;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockContext;
+import org.mozc.android.inputmethod.japanese.testing.MockPackageManager;
 import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory.LauncherIconManager;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -53,125 +57,309 @@
  */
 public class ApplicationInitializerFactoryTest extends InstrumentationTestCaseWithMock {
 
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    MozcUtil.setDebug(Optional.of(false));
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    MozcUtil.setDebug(Optional.<Boolean>absent());
+    super.tearDown();
+  }
+
+  @SmallTest
+  public void testInitialize() {
+    SharedPreferences sharedPreferences = MozcPreferenceUtil.getSharedPreferences(
+        getInstrumentation().getContext(), "1ST_TIME_LAUNCH");
+
+    class TestData extends Parameter {
+      final boolean isSystemApplication;
+      final boolean isLaunchedAtLeastOnce;
+      final boolean isWelcomeActivityShown;
+      final boolean isWelcomeActivityPreferred;
+      final Optional<Integer> lastLaunchVersionCode;
+      final int versionCode;
+      final boolean expectedStartActivity;
+      final boolean expectedPreferenceUpdate;
+      TestData(boolean isSystemApplication,
+               boolean isFirstLaunch,
+               boolean isWelcomeActivityShown,
+               boolean isWelcomeActivityPreferred,
+               Optional<Integer> lastLaunchVersionCode,
+               int versionCode,
+               boolean expectedStartActivity,
+               boolean expectedPreferenceUpdate) {
+        this.isSystemApplication = isSystemApplication;
+        this.isLaunchedAtLeastOnce = isFirstLaunch;
+        this.isWelcomeActivityShown = isWelcomeActivityShown;
+        this.isWelcomeActivityPreferred = isWelcomeActivityPreferred;
+        this.lastLaunchVersionCode = lastLaunchVersionCode;
+        this.versionCode = versionCode;
+        this.expectedStartActivity = expectedStartActivity;
+        this.expectedPreferenceUpdate = expectedPreferenceUpdate;
+      }
+    }
+
+    // Expect false if isSystemApplication is true or isFirstLaunch is false.
+    Optional<Integer> absentInt = Optional.<Integer>absent();
+    TestData[] testDataList = {
+        // Non-sys-app
+        new TestData(false, false, true, true, Optional.of(100), 100, false, false),
+        new TestData(false, false, true, true, absentInt, 100, false, true),
+
+        new TestData(false, false, false, true, Optional.of(100), 100, true, false),
+        new TestData(false, false, false, true, absentInt, 100, true, true),
+
+        new TestData(false, true, true, true, Optional.of(100), 100, false, false),
+        new TestData(false, true, true, true, absentInt, 100, false, false),
+
+        new TestData(false, true, false, true, Optional.of(100), 100, false, false),
+        new TestData(false, true, false, true, absentInt, 100, false, false),
+
+        // Sys-app
+        new TestData(true, false, true, true, Optional.of(100), 100, false, false),
+        new TestData(true, false, true, true, absentInt, 100, false, true),
+
+        new TestData(true, false, false, true, Optional.of(100), 100, false, false),
+        new TestData(true, false, false, true, absentInt, 100, false, true),
+
+        new TestData(true, true, true, true, Optional.of(100), 100, false, false),
+        new TestData(true, true, true, true, absentInt, 100, false, false),
+
+        new TestData(true, true, false, true, Optional.of(100), 100, false, false),
+        new TestData(true, true, false, true, absentInt, 100, false, false),
+
+        // Non-sys-app, Welcome acvitity shouldn't be shown
+        new TestData(false, false, true, false, Optional.of(100), 100, false, false),
+        new TestData(false, false, true, false, absentInt, 100, false, true),
+
+        new TestData(false, false, false, false, Optional.of(100), 100, false, false),
+        new TestData(false, false, false, false, absentInt, 100, false, true),
+
+        new TestData(false, true, true, false, Optional.of(100), 100, false, false),
+        new TestData(false, true, true, false, absentInt, 100, false, false),
+
+        new TestData(false, true, false, false, Optional.of(100), 100, false, false),
+        new TestData(false, true, false, false, absentInt, 100, false, false),
+
+        // Sys-app, Welcome acvitity shouldn't be shown
+        new TestData(true, false, true, false, Optional.of(100), 100, false, false),
+        new TestData(true, false, true, false, absentInt, 100, false, true),
+
+        new TestData(true, false, false, false, Optional.of(100), 100, false, false),
+        new TestData(true, false, false, false, absentInt, 100, false, true),
+
+        new TestData(true, true, true, false, Optional.of(100), 100, false, false),
+        new TestData(true, true, true, false, absentInt, 100, false, false),
+
+        new TestData(true, true, false, false, Optional.of(100), 100, false, false),
+        new TestData(true, true, false, false, absentInt, 100, false, false),
+
+    };
+
+    TelephonyManagerInterface telephonyManager = new TelephonyManagerInterface() {
+      @Override
+      public String getNetworkOperator() {
+        return "INVALID NETWORK OPERATOR";
+      }
+    };
+    LauncherIconManager launcherIconManager = new LauncherIconManager() {
+      @Override
+      public void updateLauncherIconVisibility(Context context) {}
+    };
+    PreferenceManagerStaticInterface preferenceManager = new PreferenceManagerStaticInterface() {
+      @Override
+      public void setDefaultValues(Context context, int id, boolean readAgain) {}
+    };
+
+    Context targetContext = getInstrumentation().getTargetContext();
+    Context context = createNiceMock(MockContext.class);
+    EasyMock.expect(context.getPackageName())
+        .andStubReturn(getInstrumentation().getTargetContext().getPackageName());
+    EasyMock.expect(context.getResources())
+        .andStubReturn(targetContext.getResources());
+    EasyMock.expect(context.getContentResolver())
+        .andStubReturn(targetContext.getContentResolver());
+    EasyMock.expect(context.getCacheDir())
+        .andStubReturn(targetContext.getCacheDir());
+    EasyMock.expect(context.getApplicationInfo())
+        .andStubReturn(targetContext.getApplicationInfo());
+    EasyMock.expect(context.getSystemService(Context.USER_SERVICE))
+        .andStubReturn(targetContext.getSystemService(Context.USER_SERVICE));
+    EasyMock.expect(context.getPackageManager()).andStubReturn(new MockPackageManager());
+
+    replayAll();
+    for (final TestData testData : testDataList) {
+      for (final boolean isDevChannel : new boolean[] {true, false}) {
+        sharedPreferences.edit().clear().commit();
+        ApplicationInitializationStatus initializationStatus =
+            new ApplicationInitializationStatus() {
+          @Deprecated
+          @Override
+          public boolean isLaunchedAtLeastOnce() {
+            return testData.isLaunchedAtLeastOnce;
+          }
+          @Override
+          public Optional<Integer> getLastLaunchAbiIndependentVersionCode() {
+            return testData.lastLaunchVersionCode;
+          }
+          @Override
+          public boolean isWelcomeActivityShownAtLeastOnce() {
+            return testData.isWelcomeActivityShown;
+          }
+        };
+        assertEquals(testData.toString(),
+                     testData.expectedStartActivity,
+                     ApplicationInitializerFactory.createInstance(
+                         initializationStatus,
+                         context,
+                         sharedPreferences,
+                         telephonyManager)
+                             .initialize(testData.isSystemApplication,
+                                         isDevChannel,
+                                         testData.isWelcomeActivityPreferred,
+                                         testData.versionCode,
+                                         launcherIconManager,
+                                         preferenceManager).isPresent());
+        assertEquals(testData.toString(),
+                     testData.versionCode,
+                     sharedPreferences.getInt(
+                         PreferenceUtil
+                             .PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE,
+                         Integer.MIN_VALUE));
+        if (testData.expectedStartActivity) {
+          assertTrue(testData.toString(),
+                     sharedPreferences.getBoolean(
+                         ApplicationInitializerFactory.PREF_WELCOME_ACTIVITY_SHOWN, false));
+        }
+        assertEquals(testData.toString(),
+            testData.expectedPreferenceUpdate,
+            sharedPreferences.contains("pref_portrait_fullscreen_key"));
+        assertEquals(testData.toString(),
+            testData.expectedPreferenceUpdate,
+            sharedPreferences.contains(PreferenceUtil.PREF_EMOJI_PROVIDER_TYPE));
+        assertFalse(testData.toString(),
+                    sharedPreferences.contains(
+                        ApplicationInitializerFactory.PREF_LAUNCHED_AT_LEAST_ONCE));
+        // TODO(matsuzakit): Using android:defaultValue attribute is more preferable than using
+        //                   contains method. Do it on another CL.
+        if (isDevChannel) {
+          assertTrue(testData.toString(),
+                     sharedPreferences.getBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY,
+                                                  false));
+        } else {
+          assertTrue(testData.toString(),
+                     !sharedPreferences.contains(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY) ||
+                         !sharedPreferences.getBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY,
+                             true));
+        }
+      }
+    }
+  }
+
+  @SmallTest
+  public void testGetDimensionForOrientation() {
+    float portraitValue = ApplicationInitializer.getDimensionForOrientation(
+        getInstrumentation().getContext().getResources(),
+        org.mozc.android.inputmethod.japanese.tests.R.dimen.value_for_testing_port_1dip_land_2dip,
+        Configuration.ORIENTATION_PORTRAIT);
+    float landscapeValue = ApplicationInitializer.getDimensionForOrientation(
+        getInstrumentation().getContext().getResources(),
+        org.mozc.android.inputmethod.japanese.tests.R.dimen.value_for_testing_port_1dip_land_2dip,
+        Configuration.ORIENTATION_LANDSCAPE);
+
+    assertTrue("portrait:" + portraitValue + ", landscape:" + landscapeValue,
+               portraitValue != landscapeValue);
+  }
 
   @SmallTest
   public void testStoreDefaultFullscreenMode() throws IllegalArgumentException {
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-    float currentDisplayDensity = resources.getDisplayMetrics().density;
-    Configuration defaultConfiguration = new Configuration();
-    defaultConfiguration.setToDefaults();
-    defaultConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT;
-    float portraitNormalImeHeightInDip =
-        resources.getDimension(R.dimen.ime_window_height_portrait_normal) / currentDisplayDensity;
-    float landscapeNormalImeHeightInDip =
-        resources.getDimension(R.dimen.ime_window_height_landscape_normal) / currentDisplayDensity;
-    float portraitXlargeImeHeightInDip =
-        resources.getDimension(R.dimen.ime_window_height_portrait_xlarge) / currentDisplayDensity;
-    float landscapeXlargeImeHeightInDip =
-        resources.getDimension(R.dimen.ime_window_height_landscape_xlarge) / currentDisplayDensity;
-    float productionFullscreenThresholdInDip =
-        resources.getDimension(R.dimen.fullscreen_threshold) / currentDisplayDensity;
     class TestParameter extends Parameter {
-      final int displayWidthPixels;
-      final int displayHeightPixels;
+      final int displayHeightInPixels;
+      final int displayWidthInPixels;
       final float displayDensity;
-      final float portraitImeHeight;
-      final float landscapeImeHeight;
-      final float fullscreenThreshold;
       final boolean expectPortraitFullscreen;
       final boolean expectLandscapeFullscreen;
-      TestParameter(int displayWidthPixels,
-                    int displayHeightPixels,
+      TestParameter(int displayHeightInPixels,
+                    int displayWidthInPixels,
                     float displayDensity,
-                    float portraitImeHeight,
-                    float landscapeImeHeight,
-                    float fullscreenThreshold,
                     boolean expectPortraitFullscreen,
                     boolean expectLandscapeFullscreen) {
-        this.displayWidthPixels = displayWidthPixels;
-        this.displayHeightPixels = displayHeightPixels;
+        Preconditions.checkArgument(displayHeightInPixels >= displayWidthInPixels);
+        this.displayHeightInPixels = displayHeightInPixels;
+        this.displayWidthInPixels = displayWidthInPixels;
         this.displayDensity = displayDensity;
-        this.portraitImeHeight = portraitImeHeight;
-        this.landscapeImeHeight = landscapeImeHeight;
-        this.fullscreenThreshold = fullscreenThreshold;
         this.expectPortraitFullscreen = expectPortraitFullscreen;
         this.expectLandscapeFullscreen = expectLandscapeFullscreen;
       }
     }
     TestParameter[] parameters = {
-        new TestParameter(100, 100, 1f, 50, 80, 40, false, true),
-        new TestParameter(100, 100, 2f, 50, 80, 40, true, true),
+        new TestParameter(300, 300, 1.0f, true, true),
         // Galaxy S
-        new TestParameter(480, 800, 1.5f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          false, true),
+        new TestParameter(800, 480, 1.5f, false, true),
         // HTC ARIA
-        new TestParameter(320, 480, 1.0f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          true, true),
+        new TestParameter(480, 320, 1.0f, false, true),
         // IS03
-        new TestParameter(640, 960, 2.0f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          true, true),
+        new TestParameter(960, 640, 2.0f, false, true),
         // IS01
-        new TestParameter(854, 480, 1.5f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          true, false),
+        new TestParameter(854, 480, 1.5f, false, true),
         // Optimus Pad
-        new TestParameter(1280, 768, 1.0f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          false, false),
+        new TestParameter(1280, 768, 1.0f, false, false),
         // Galaxy Nexus
-        new TestParameter(720, 1280, 2.0f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          false, true),
+        new TestParameter(1280, 720, 2.0f, false, true),
         // Nexus 7
-        new TestParameter(1280, 800, 1.33f,
-                          portraitNormalImeHeightInDip,
-                          landscapeNormalImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          false, false),
+        new TestParameter(1280, 800, 1.33f, false, false),
         // Nexus 10
-        new TestParameter(2464, 1600, 2.0f,
-                          portraitXlargeImeHeightInDip,
-                          landscapeXlargeImeHeightInDip,
-                          productionFullscreenThresholdInDip,
-                          false, false),
+        new TestParameter(2464, 1600, 2.0f, false, false),
     };
 
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+
     for (TestParameter testParameter : parameters) {
       SharedPreferences sharedPreferences =
           MozcPreferenceUtil.getSharedPreferences(
               getInstrumentation().getTargetContext(), "DEFAULT_FULLSCREEN");
       sharedPreferences.edit().clear().commit();
+
+      DisplayMetrics originalMetrics = new DisplayMetrics();
+      originalMetrics.setTo(resources.getDisplayMetrics());
+      Configuration originalConfiguration = new Configuration(resources.getConfiguration());
+
       DisplayMetrics metrics = new DisplayMetrics();
-      metrics.widthPixels = testParameter.displayWidthPixels;
-      metrics.heightPixels = testParameter.displayHeightPixels;
+      metrics.heightPixels = testParameter.displayHeightInPixels;
+      metrics.widthPixels = testParameter.displayWidthInPixels;
       metrics.density = testParameter.displayDensity;
-      ApplicationInitializer.storeDefaultFullscreenMode(
-          sharedPreferences,
-          metrics,
-          testParameter.fullscreenThreshold * testParameter.displayDensity,
-          testParameter.portraitImeHeight * testParameter.displayDensity,
-          testParameter.landscapeImeHeight * testParameter.displayDensity);
-      assertEquals(testParameter.toString(),
-                   testParameter.expectPortraitFullscreen,
-                   sharedPreferences.getBoolean("pref_portrait_fullscreen_key", false));
-      assertEquals(testParameter.toString(),
-                   testParameter.expectLandscapeFullscreen,
-                   sharedPreferences.getBoolean("pref_landscape_fullscreen_key", false));
+
+      Configuration configuration = new Configuration(resources.getConfiguration());
+      configuration.orientation = Configuration.ORIENTATION_PORTRAIT;
+      configuration.densityDpi = Math.round(160f * testParameter.displayDensity);
+      configuration.screenHeightDp =
+          Math.round(testParameter.displayHeightInPixels / testParameter.displayDensity);
+      configuration.screenWidthDp =
+          Math.round(testParameter.displayWidthInPixels / testParameter.displayDensity);
+
+      try {
+        resources.updateConfiguration(configuration, metrics);
+
+        ApplicationInitializer.storeDefaultFullscreenMode(
+            sharedPreferences,
+            testParameter.displayHeightInPixels,
+            testParameter.displayWidthInPixels,
+            resources.getDimensionPixelOffset(R.dimen.input_frame_height),
+            (int) Math.ceil(ApplicationInitializer.getDimensionForOrientation(
+                resources, R.dimen.input_frame_height, Configuration.ORIENTATION_LANDSCAPE)),
+                resources.getDimensionPixelOffset(R.dimen.fullscreen_threshold));
+        assertEquals("portrait check failed: " + testParameter.toString(),
+                     testParameter.expectPortraitFullscreen,
+                     sharedPreferences.getBoolean("pref_portrait_fullscreen_key", false));
+        assertEquals("landscape check failed: " + testParameter.toString(),
+                     testParameter.expectLandscapeFullscreen,
+                     sharedPreferences.getBoolean("pref_landscape_fullscreen_key", false));
+      } finally {
+        resources.updateConfiguration(originalConfiguration, originalMetrics);
+      }
     }
   }
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java
new file mode 100644
index 0000000..d23feb3
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java
@@ -0,0 +1,386 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import static org.easymock.EasyMock.isA;
+
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Optional;
+
+import android.annotation.TargetApi;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+
+/**
+ * Test for CandidateViewManager.
+ */
+public class CandidateViewManagerTest extends InstrumentationTestCaseWithMock {
+
+  private Command createCommand(int candidateNum) {
+    CandidateList.Builder candidateListBuilder = CandidateList.newBuilder();
+    for (int i = 0; i < candidateNum; ++i) {
+      candidateListBuilder.addCandidates(CandidateWord.getDefaultInstance());
+    }
+
+    return Command.newBuilder()
+        .setOutput(Output.newBuilder()
+            .setAllCandidateWords(candidateListBuilder.buildPartial())
+            .buildPartial())
+        .buildPartial();
+  }
+
+  @SmallTest
+  public void testUpdateForKeyboardCandidateView() {
+    CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+    FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+    CandidateViewManager candidateViewManager =
+        new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+    assertFalse(candidateViewManager.isFloatingMode());
+
+    {
+      Command emptyCommand = createCommand(0);
+      resetAll();
+      keyboardCandidateView.startOutAnimation();
+      replayAll();
+      candidateViewManager.update(emptyCommand);
+      verifyAll();
+    }
+
+    {
+      Command nonEmptyCommand = createCommand(1);
+      resetAll();
+      keyboardCandidateView.update(nonEmptyCommand);
+      keyboardCandidateView.startInAnimation();
+      replayAll();
+      candidateViewManager.update(nonEmptyCommand);
+      verifyAll();
+    }
+  }
+
+  @ApiLevel(21)
+  @TargetApi(21)
+  @SmallTest
+  public void testUpdateForFloatingCandidateView() {
+    CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+    FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+    CandidateViewManager candidateViewManager =
+        new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+    resetAll();
+    keyboardCandidateView.enableFoldButton(false);
+    keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+    keyboardCandidateView.setVisibility(View.GONE);
+    floatingCandidateView.setEditorInfo(isA(EditorInfo.class));
+    floatingCandidateView.setCursorAnchorInfo(isA(CursorAnchorInfo.class));
+    floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+    floatingCandidateView.setVisibility(View.VISIBLE);
+    replayAll();
+    candidateViewManager.setNarrowMode(true);
+    candidateViewManager.setAllowFloatingMode(true);
+    candidateViewManager.setExtractedMode(false);
+    verifyAll();
+    assertTrue(candidateViewManager.isFloatingMode());
+
+    {
+      Command emptyCommand = createCommand(0);
+      resetAll();
+      floatingCandidateView.setCandidates(emptyCommand);
+      replayAll();
+      candidateViewManager.update(emptyCommand);
+      verifyAll();
+    }
+
+    {
+      Command nonEmptyCommand = createCommand(1);
+      resetAll();
+      floatingCandidateView.setCandidates(nonEmptyCommand);
+      replayAll();
+      candidateViewManager.update(nonEmptyCommand);
+      verifyAll();
+    }
+  }
+
+  @SmallTest
+  public void testNarrowMode() {
+    CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+    FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+    CandidateViewManager candidateViewManager =
+        new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+    assertFalse(candidateViewManager.isFloatingMode());
+    EditorInfo editorInfo = new EditorInfo();
+    candidateViewManager.setEditorInfo(editorInfo);
+    CursorAnchorInfo cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+    candidateViewManager.setCursorAnchorInfo(cursorAnchorInfo);
+
+
+    resetAll();
+    keyboardCandidateView.enableFoldButton(false);
+    replayAll();
+    candidateViewManager.setNarrowMode(true);
+    candidateViewManager.setAllowFloatingMode(false);
+    verifyAll();
+    assertFalse(candidateViewManager.isFloatingMode());
+
+    resetAll();
+    keyboardCandidateView.enableFoldButton(true);
+    replayAll();
+    candidateViewManager.setNarrowMode(false);
+    candidateViewManager.setAllowFloatingMode(false);
+    verifyAll();
+    assertFalse(candidateViewManager.isFloatingMode());
+
+    // Sets candidates
+    Command command = createCommand(1);
+    resetAll();
+    keyboardCandidateView.update(command);
+    keyboardCandidateView.startInAnimation();
+    replayAll();
+    candidateViewManager.update(command);
+    verifyAll();
+
+    if (FloatingCandidateView.isAvailable()) {
+      resetAll();
+      keyboardCandidateView.enableFoldButton(false);
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+      floatingCandidateView.setCursorAnchorInfo(cursorAnchorInfo);
+      floatingCandidateView.setEditorInfo(editorInfo);
+      floatingCandidateView.setVisibility(View.VISIBLE);
+      replayAll();
+      candidateViewManager.setNarrowMode(true);
+      candidateViewManager.setAllowFloatingMode(true);
+      verifyAll();
+      assertTrue(candidateViewManager.isFloatingMode());
+
+      resetAll();
+      keyboardCandidateView.enableFoldButton(true);
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+      floatingCandidateView.setVisibility(View.GONE);
+      replayAll();
+      candidateViewManager.setNarrowMode(false);
+      candidateViewManager.setAllowFloatingMode(true);
+      verifyAll();
+      assertFalse(candidateViewManager.isFloatingMode());
+    }
+  }
+
+  @SmallTest
+  public void testKeyboardCandidateViewAnimationListener() {
+    CandidateView keyboardCandidateView = createViewMockBuilder(CandidateView.class)
+        .createNiceMock();
+    FloatingCandidateView floatingCandidateView = createViewMockBuilder(FloatingCandidateView.class)
+        .createNiceMock();
+    CandidateViewManager candidateViewManager =
+        new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+    ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
+    KeyboardCandidateViewHeightListener animationListener =
+        createMock(KeyboardCandidateViewHeightListener.class);
+
+    resetAll();
+    keyboardCandidateView.setViewEventListener(viewEventListener);
+    floatingCandidateView.setViewEventListener(viewEventListener);
+    replayAll();
+    candidateViewManager.setEventListener(viewEventListener, animationListener);
+    verifyAll();
+
+    Command nonEmptyCommand = createCommand(1);
+    assertFalse(candidateViewManager.isFloatingMode());
+    resetAll();
+    animationListener.onExpanded();
+    replayAll();
+    candidateViewManager.update(nonEmptyCommand);
+    verifyAll();
+
+    Command emptyCommand = createCommand(0);
+    resetAll();
+    animationListener.onCollapse();
+    replayAll();
+    candidateViewManager.update(emptyCommand);
+    verifyAll();
+
+    if (FloatingCandidateView.isAvailable()) {
+      candidateViewManager.setNarrowMode(true);
+      candidateViewManager.setAllowFloatingMode(true);
+      assertTrue(candidateViewManager.isFloatingMode());
+      resetAll();
+      replayAll();
+      candidateViewManager.update(nonEmptyCommand);
+      candidateViewManager.update(emptyCommand);
+      verifyAll();
+    }
+  }
+
+  @SmallTest
+  public void testShowNumberKeyboard() {
+    int candidateTextSize = 10;
+    int descriptionTextSize = 5;
+    ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
+    KeyboardCandidateViewHeightListener heightListener =
+        createNiceMock(KeyboardCandidateViewHeightListener.class);
+    InOutAnimatedFrameLayout.VisibilityChangeListener visibilityChangeListener =
+        createNiceMock(InOutAnimatedFrameLayout.VisibilityChangeListener.class);
+
+    Skin skin = new Skin();
+
+    {  // Set a view and update.
+      CandidateViewManager candidateViewManager = new CandidateViewManager(
+              createViewMockBuilder(CandidateView.class).createNiceMock(),
+              createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+      CandidateView view = createViewMock(CandidateView.class);
+
+      resetAll();
+      view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      view.setViewEventListener(viewEventListener);
+      view.setOnVisibilityChangeListener(visibilityChangeListener);
+      view.setSkin(skin);
+      view.enableFoldButton(true);
+      view.setInAnimation(isA(Animation.class));
+      view.setOutAnimation(isA(Animation.class));
+      view.setOutAnimationListener(isA(AnimationListener.class));
+      replayAll();
+
+      candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      candidateViewManager.setEventListener(viewEventListener, heightListener);
+      candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
+      candidateViewManager.setSkin(skin);
+      candidateViewManager.setNumberCandidateView(view);
+
+      verifyAll();
+    }
+
+    {  // Update and set a view.
+      CandidateViewManager candidateViewManager = new CandidateViewManager(
+              createViewMockBuilder(CandidateView.class).createNiceMock(),
+              createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+      CandidateView view = createViewMock(CandidateView.class);
+
+      resetAll();
+      // Set default values when number keyboard is set.
+      view.setSkin(Skin.getFallbackInstance());
+      view.setOnVisibilityChangeListener(null);
+      // Set actual values.
+      view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      view.setViewEventListener(viewEventListener);
+      view.enableFoldButton(true);
+      view.setOnVisibilityChangeListener(visibilityChangeListener);
+      view.setSkin(skin);
+      view.setInAnimation(isA(Animation.class));
+      view.setOutAnimation(isA(Animation.class));
+      view.setOutAnimationListener(isA(AnimationListener.class));
+      replayAll();
+
+      candidateViewManager.setNumberCandidateView(view);
+      candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+      candidateViewManager.setEventListener(viewEventListener, heightListener);
+      candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
+      candidateViewManager.setSkin(skin);
+
+      verifyAll();
+    }
+  }
+
+  @SmallTest
+  public void testSwitchNumberKeyboard() {
+    CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+    CandidateView numberCandidateView = createViewMock(CandidateView.class);
+    CandidateViewManager candidateViewManager = new CandidateViewManager(
+        keyboardCandidateView, createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+    candidateViewManager.setNumberCandidateView(numberCandidateView);
+
+    Command command = createCommand(1);
+
+    {
+      resetAll();
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      numberCandidateView.setVisibility(View.GONE);
+      replayAll();
+      candidateViewManager.setNumberMode(true);
+      verifyAll();
+
+      resetAll();
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      replayAll();
+      candidateViewManager.setNumberMode(false);
+      verifyAll();
+    }
+
+    {
+      resetAll();
+      keyboardCandidateView.update(command);
+      keyboardCandidateView.startInAnimation();
+      replayAll();
+      candidateViewManager.update(command);
+      verifyAll();
+
+      resetAll();
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      numberCandidateView.setVisibility(View.GONE);
+      replayAll();
+      candidateViewManager.setNumberMode(true);
+      verifyAll();
+
+      resetAll();
+      numberCandidateView.update(command);
+      numberCandidateView.startInAnimation();
+      replayAll();
+      candidateViewManager.update(command);
+      verifyAll();
+
+      resetAll();
+      keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+      keyboardCandidateView.setVisibility(View.GONE);
+      replayAll();
+      candidateViewManager.setNumberMode(false);
+      verifyAll();
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
index d446bb0..2850be6 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
@@ -29,6 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
 
@@ -41,12 +42,16 @@
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
+import org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView;
 import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.base.Optional;
 
-import android.graphics.drawable.Drawable;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.widget.ToggleButton;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import org.easymock.EasyMock;
 
 import java.util.Collections;
 
@@ -73,19 +78,20 @@
     ConversionCandidateWordView mockCandidateWordView =
         new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
     ScrollGuideView mockScrollGuideView = createViewMock(ScrollGuideView.class);
-    ToggleButton mockInputFrameFoldButton = createViewMockBuilder(ToggleButton.class)
-        .addMockedMethod("setBackgroundDrawable")
-        .createMock();
+    InputFrameFoldButtonView mockInputFrameFoldButtonView =
+        createViewMock(InputFrameFoldButtonView.class);
     CandidateView candidateView = createViewMockBuilder(CandidateView.class)
         .addMockedMethods(
             "getConversionCandidateWordView", "getScrollGuideView", "getInputFrameFoldButton")
         .createMock();
+
     expect(candidateView.getConversionCandidateWordView()).andStubReturn(mockCandidateWordView);
     expect(candidateView.getScrollGuideView()).andStubReturn(mockScrollGuideView);
-    expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButton);
+    expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButtonView);
 
     mockScrollGuideView.setScroller(mockCandidateWordView.scroller);
-    mockInputFrameFoldButton.setBackgroundDrawable(isA(Drawable.class));
+    mockInputFrameFoldButtonView.setChecked(false);
+    mockInputFrameFoldButtonView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
     replayAll();
 
     candidateView.onFinishInflate();
@@ -171,4 +177,102 @@
     assertEquals(0, candidateWordView.getScrollY());
     assertNull(candidateWordView.calculatedLayout);
   }
+
+  @SmallTest
+  public void testConversionCandidateWordView_inputFrameFoldButtonVisibility() {
+    ConversionCandidateWordView conversionCandidateWordView =
+        new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
+    InputFrameFoldButtonView mockInputFrameFoldButtonView =
+        createViewMock(InputFrameFoldButtonView.class);
+    conversionCandidateWordView.inputFrameFoldButtonView = mockInputFrameFoldButtonView;
+    conversionCandidateWordView.foldButtonBackgroundVisibilityThreshold = 50;
+    conversionCandidateWordView.layout(0, 0, 320, 240);
+    conversionCandidateWordView.update(CandidateList.getDefaultInstance());
+
+    conversionCandidateWordView.scrollTo(0, 0);
+
+    // Background should be invisible in [0, 50].
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+    replayAll();
+    conversionCandidateWordView.scrollTo(10, 10);
+    verifyAll();
+
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+    replayAll();
+    conversionCandidateWordView.scrollTo(50, 50);
+    verifyAll();
+
+    // Background becomes visible after 50 and stays invisible in (50, 100).
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+    replayAll();
+    conversionCandidateWordView.scrollTo(51, 51);
+    verifyAll();
+
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+    replayAll();
+    conversionCandidateWordView.scrollTo(90, 90);
+    verifyAll();
+
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+    replayAll();
+    conversionCandidateWordView.scrollTo(100, 100);
+    verifyAll();
+
+    // Test scrolling backward.
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+    replayAll();
+    conversionCandidateWordView.scrollTo(51, 51);
+    verifyAll();
+
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+    replayAll();
+    conversionCandidateWordView.scrollTo(50, 50);
+    verifyAll();
+
+    resetAll();
+    mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+    replayAll();
+    conversionCandidateWordView.scrollTo(0, 0);
+    verifyAll();
+  }
+
+  @SmallTest
+  public void testSetSkin() {
+    ConversionCandidateWordView mockCandidateWordView =
+        new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
+    ScrollGuideView mockScrollGuideView = createViewMock(ScrollGuideView.class);
+    InputFrameFoldButtonView mockInputFrameFoldButtonView =
+        createViewMockBuilder(InputFrameFoldButtonView.class)
+        .addMockedMethods("setSkin")
+        .createMock();
+    LinearLayout mockCandidateWordFrame = createViewMockBuilder(LinearLayout.class)
+        .addMockedMethods("setBackgroundColor")
+        .createMock();
+    CandidateView candidateView = createViewMockBuilder(CandidateView.class)
+        .addMockedMethods(
+            "getConversionCandidateWordView", "getScrollGuideView", "getInputFrameFoldButton",
+            "getCandidateWordFrame")
+        .createMock();
+    expect(candidateView.getConversionCandidateWordView()).andStubReturn(mockCandidateWordView);
+    expect(candidateView.getScrollGuideView()).andStubReturn(mockScrollGuideView);
+    expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButtonView);
+    expect(candidateView.getCandidateWordFrame()).andStubReturn(mockCandidateWordFrame);
+    Skin skin = new Skin();
+    mockCandidateWordView.setSkin(skin);
+    mockScrollGuideView.setSkin(skin);
+    mockInputFrameFoldButtonView.setSkin(skin);
+    mockCandidateWordFrame.setBackgroundColor(EasyMock.anyInt());
+    replayAll();
+
+    candidateView.setSkin(skin);
+
+    verifyAll();
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
index 2a2cc29..db96c05 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
@@ -48,10 +48,13 @@
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
 import org.mozc.android.inputmethod.japanese.ui.SnapScroller;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import com.google.common.base.Optional;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.MotionEvent;
 import android.view.View;
@@ -74,6 +77,11 @@
       // We are not willing to test rendering routine running background of event processing test.
       // So just ignore this method's invocation.
     }
+
+    @Override
+    protected Drawable getViewBackgroundDrawable(Skin skin) {
+      return DummyDrawable.getInstance();
+    }
   }
 
   public static Span createNullCandidateWordSpan(int left, int right) {
@@ -232,17 +240,31 @@
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
       verifyAll();
 
-      // Slide within a candidate.
+      // Slide within a candidate (top-left corner).
       resetAll();
       expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
       candidateSelectListener.onCandidateSelected(
           ROW_DATA.get(0).getSpanList().get(0).getCandidateWord().get(), Optional.<Integer>of(0));
       replayAll();
-      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 10, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
-      events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 29, 10, 0));
+      events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 12, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
-      events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 25, 10, 0));
+      events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 11, 10, 0));
+      assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+      verifyAll();
+
+      // Slide within a candidate (bottom-right corner).
+      resetAll();
+      expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
+      candidateSelectListener.onCandidateSelected(
+          ROW_DATA.get(0).getSpanList().get(0).getCandidateWord().get(), Optional.<Integer>of(0));
+      replayAll();
+      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 27, 0));
+      assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+      events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 29, 29, 0));
+      assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+      events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 29, 28, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
       verifyAll();
 
@@ -250,7 +272,7 @@
       resetAll();
       expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
       replayAll();
-      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
       events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 30, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
@@ -262,13 +284,13 @@
       resetAll();
       expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
       replayAll();
-      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+      events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
-      events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 31, 10, 0));
+      events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 30, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
-      events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_MOVE, 15, 10, 0));
+      events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_MOVE, 29, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
-      events.add(MotionEvent.obtain(0, 3000, MotionEvent.ACTION_UP, 15, 10, 0));
+      events.add(MotionEvent.obtain(0, 3000, MotionEvent.ACTION_UP, 29, 10, 0));
       assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
       verifyAll();
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java
new file mode 100644
index 0000000..8993913
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java
@@ -0,0 +1,351 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import org.mozc.android.inputmethod.japanese.ui.FloatingCandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.FloatingModeIndicator;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.InputType;
+import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+import android.widget.PopupWindow;
+
+/**
+ * Test for FloatingCandidateView.
+ */
+@ApiLevel(21)
+@TargetApi(21)
+public class FloatingCandidateViewTest extends InstrumentationTestCaseWithMock {
+
+  private class FloatingCandidateLayoutRendererMock extends FloatingCandidateLayoutRenderer {
+
+    private Optional<Rect> windowRect = Optional.absent();
+
+    public FloatingCandidateLayoutRendererMock(Resources resources) {
+      super(resources);
+    }
+
+    public void setWindowRect(Optional<Rect> rect) {
+      this.windowRect = Preconditions.checkNotNull(rect);
+    }
+
+    @Override
+    public Optional<Rect> getWindowRect() {
+      if (windowRect.isPresent()) {
+        return Optional.of(new Rect(windowRect.get()));
+      }
+      return Optional.absent();
+    }
+  }
+
+  private Command generateCommandsProto(
+      int candidatesNum, int highlightedPosition, Category category) {
+    Preconditions.checkArgument(0 <= candidatesNum && candidatesNum < 10);
+    Preconditions.checkNotNull(category);
+
+    Candidates.Builder candidatesBuilder = Candidates.newBuilder();
+    for (int i = 0; i < candidatesNum; ++i) {
+      candidatesBuilder.addCandidate(Candidate.newBuilder()
+          .setIndex(i)
+          .setValue("cand_" + Integer.toString(i))
+          .setId(i)
+          .setAnnotation(Annotation.newBuilder().setShortcut(Integer.toString(i + 1))));
+    }
+    candidatesBuilder.setSize(candidatesNum);
+    candidatesBuilder.setPosition(0);
+    candidatesBuilder.setCategory(category);
+
+    return Command.newBuilder()
+        .setOutput(Output.newBuilder()
+            .setCandidates(candidatesBuilder)
+            .setPreedit(Preedit.newBuilder()
+                .setHighlightedPosition(highlightedPosition)
+                .setCursor(0)))
+        .buildPartial();
+  }
+
+  /**
+   * Pop-up window mock to avoid BadTokenException on {@link PopupWindow#showAtLocation} on test.
+   */
+  private class PopupWindowMock extends PopupWindow {
+    private boolean isShowing;
+
+    @Override
+    public void showAtLocation(View parent, int gravity, int x, int y) {
+      isShowing = true;
+    }
+
+    @Override
+    public void update(int left, int top, int right, int bottom) {
+    }
+
+    @Override
+    public void dismiss() {
+      isShowing = false;
+    }
+
+    @Override
+    public boolean isShowing() {
+      return isShowing;
+    }
+  }
+
+  @SmallTest
+  public void testCandidateWindowPositionWithMock() {
+    Context context = getInstrumentation().getTargetContext();
+    Resources resources = context.getResources();
+    FloatingCandidateLayoutRendererMock layoutRendererMock =
+        new FloatingCandidateLayoutRendererMock(resources);
+    int windowVerticalMargin =
+        resources.getDimensionPixelSize(R.dimen.floating_candidate_window_vertical_margin);
+    int windowHorizontalMargin =
+        resources.getDimensionPixelSize(R.dimen.floating_candidate_window_horizontal_margin);
+
+    FloatingModeIndicator modeIndicatorMock = createMockBuilder(FloatingModeIndicator.class)
+        .withConstructor(createViewMockBuilder(View.class).createNiceMock())
+        .createNiceMock();
+    FloatingCandidateView view = new FloatingCandidateView(
+        context, new PopupWindowMock(), layoutRendererMock, modeIndicatorMock);
+
+    // A candidate window is invisible.
+    layoutRendererMock.setWindowRect(Optional.<Rect>absent());
+    view.layout(0, 0, 1000, 2000);
+    assertFalse(view.getVisibleRect().isPresent());
+
+    // A candidate window is visible.
+    Rect windowRect = new Rect(-10, 0, 90, 50);
+    layoutRendererMock.setWindowRect(Optional.of(windowRect));
+
+    Command command = generateCommandsProto(1, 0, Category.CONVERSION);
+    view.setCandidates(command);
+
+    // No composition. (insertion marker location only)
+    CursorAnchorInfo.Builder builder = new CursorAnchorInfo.Builder();
+    builder.setInsertionMarkerLocation(200, 1000, 250, 1020,
+                                       CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+    builder.setMatrix(new Matrix());
+    view.setCursorAnchorInfo(builder.build());
+    Rect rect = view.getVisibleRect().get();
+    assertEquals(190, rect.left);
+    assertEquals(1020 + windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+
+    // One composition character.
+    // The left corner of a candidate window touches view.
+    builder.addCharacterBounds(0, 0, 1000, 100, 1020,
+                               CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+    builder.setComposingText(0, "a");
+    view.setCursorAnchorInfo(builder.build());
+    rect = view.getVisibleRect().get();
+    assertEquals(windowHorizontalMargin, rect.left);
+    assertEquals(1020 + windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+
+    // Two composition characters. (1st character is highlighted)
+    // The left corner of a candidate window touches view.
+    builder.addCharacterBounds(1, 100, 1000, 150, 1020,
+                               CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+    view.setCursorAnchorInfo(builder.build());
+    rect = view.getVisibleRect().get();
+    assertEquals(windowHorizontalMargin, rect.left);
+    assertEquals(1020 + windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+
+    // Two composition characters (2nd character is highlighted)
+    command = generateCommandsProto(1, 1, Category.CONVERSION);
+    view.setCandidates(command);
+    rect = view.getVisibleRect().get();
+    assertEquals(90, rect.left);
+    assertEquals(1020 + windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+
+    // Change view width.
+    // The right corner of a candidate window touches view.
+    view.layout(0, 0, 50 + windowRect.width(), 2000);
+    rect = view.getVisibleRect().get();
+    assertEquals(50 - windowHorizontalMargin, rect.left);
+    assertEquals(1020 + windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+
+    // Change view height.
+    // A candidate window is over a composition text.
+    view.layout(0, 0, 50 + windowRect.width(), 1020);
+    rect = view.getVisibleRect().get();
+    assertEquals(50 - windowHorizontalMargin, rect.left);
+    assertEquals(1000 - windowRect.height() - windowVerticalMargin, rect.top);
+    assertEquals(windowRect.width(), rect.width());
+    assertEquals(windowRect.height(), rect.height());
+  }
+
+  @SmallTest
+  public void testCandidateWindowPositionWithoutMock() {
+    FloatingCandidateView view = new FloatingCandidateView(
+        getInstrumentation().getTargetContext(), new PopupWindowMock());
+    view.layout(0, 0, 1000, 2000);
+
+    assertFalse(view.getVisibleRect().isPresent());
+
+    view.setCandidates(generateCommandsProto(1, 0, Category.CONVERSION));
+    assertTrue(view.getVisibleRect().isPresent());
+
+    view.setCandidates(generateCommandsProto(0, 0, Category.CONVERSION));
+    assertFalse(view.getVisibleRect().isPresent());
+  }
+
+  @SmallTest
+  public void testSuppressSuggestion() {
+    FloatingCandidateView view = new FloatingCandidateView(
+        getInstrumentation().getTargetContext(), new PopupWindowMock());
+    view.layout(0, 0, 1000, 2000);
+
+    Command suggestionCommand = generateCommandsProto(1, 0, Category.SUGGESTION);
+    Command conversionCommand = generateCommandsProto(1, 0, Category.CONVERSION);
+
+    view.setCandidates(suggestionCommand);
+    assertTrue(view.getVisibleRect().isPresent());
+
+    class Data extends Parameter {
+      public final int inputClass;
+      public final int flags;
+      public final int variations;
+      public final boolean expectedSuppressSuggestions;
+      public Data(int inputClass, int flags, int variations, boolean expectedSuppressSuggestions) {
+        Preconditions.checkArgument(inputClass == (inputClass & InputType.TYPE_MASK_CLASS));
+        Preconditions.checkArgument(flags == (flags & InputType.TYPE_MASK_FLAGS));
+        Preconditions.checkArgument(variations == (variations & InputType.TYPE_MASK_VARIATION));
+        this.inputClass = inputClass;
+        this.flags = flags;
+        this.variations = variations;
+        this.expectedSuppressSuggestions = expectedSuppressSuggestions;
+      }
+    }
+
+    Data testDataArray[] = {
+        new Data(InputType.TYPE_CLASS_DATETIME, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_DATETIME, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+        new Data(InputType.TYPE_CLASS_DATETIME, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_DATETIME, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+        new Data(InputType.TYPE_CLASS_NUMBER, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_NUMBER, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+        new Data(InputType.TYPE_CLASS_NUMBER, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_NUMBER, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+        new Data(InputType.TYPE_CLASS_PHONE, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_PHONE, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+        new Data(InputType.TYPE_CLASS_PHONE, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_PHONE, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_AUTO_CORRECT,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_SENTENCES,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_WORDS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_MULTI_LINE,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+                 InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_FILTER, true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PERSON_NAME, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PHONETIC, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_URI, true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
+                 true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, false),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
+                 true),
+        new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD, true),
+    };
+
+    for (Data data : testDataArray) {
+    EditorInfo editorInfo = new EditorInfo();
+      editorInfo.inputType = data.inputClass | data.flags | data.variations;
+      view.setEditorInfo(editorInfo);
+      view.setCandidates(suggestionCommand);
+      assertEquals(data.toString(),
+                   data.expectedSuppressSuggestions, !view.getVisibleRect().isPresent());
+
+      view.setCandidates(conversionCommand);
+      assertTrue(view.getVisibleRect().isPresent());
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
index bae0a8b..ecfed59 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
@@ -159,7 +159,6 @@
 
     int[] nextVisibilities = {View.VISIBLE, View.INVISIBLE, View.GONE};
     for (int nextVisibility : nextVisibilities) {
-      int currentVisibility = view.getVisibility();
       resetAll();
       onVisibilityChangeListener.onVisibilityChange();
       replayAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java
deleted file mode 100644
index 09748df..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.test.InstrumentationTestCase;
-
-/**
- */
-public class JapaneseKeyboardFactoryTest extends InstrumentationTestCase {
-
-  public void testGet() {
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-    // With portrait/landscape keyboard size for HVGA display;
-    Rect portrait = new Rect(0, 0, 320, 480);
-    Rect landscape = new Rect(0, 0, 480, 320);
-
-    JapaneseKeyboardFactory factory = new JapaneseKeyboardFactory();
-
-    // Tests for portrait ones.
-    JapaneseKeyboard portraitTwelveKeyKeyboard =
-        factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, portrait.width(),
-                    portrait.height());
-    assertNotNull(portraitTwelveKeyKeyboard);
-
-    JapaneseKeyboard portraitQwertyKeyboard =
-        factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
-                    portrait.height());
-    assertNotNull(portraitQwertyKeyboard);
-
-    // Those instances should be different.
-    assertNotSame(portraitTwelveKeyKeyboard, portraitQwertyKeyboard);
-
-    // The same instance should be returned for same resource and specification.
-    assertSame(portraitTwelveKeyKeyboard,
-               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                           portrait.width(), portrait.height()));
-    assertSame(portraitQwertyKeyboard,
-               factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
-                           portrait.height()));
-
-    // Then tests for landscape ones. The keyboards for landscape should be different from portrait
-    // ones.
-    JapaneseKeyboard landscapeTwelveKeyKeyboard =
-        factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, landscape.width(),
-                    landscape.height());
-    assertNotNull(landscapeTwelveKeyKeyboard);
-    assertNotSame(portraitTwelveKeyKeyboard, landscapeTwelveKeyKeyboard);
-
-    JapaneseKeyboard landscapeQwertyKeyboard =
-        factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
-                    landscape.height());
-    assertNotNull(landscapeQwertyKeyboard);
-    assertNotSame(portraitQwertyKeyboard, landscapeQwertyKeyboard);
-
-    // Those instances should be different.
-    assertNotSame(landscapeTwelveKeyKeyboard, landscapeQwertyKeyboard);
-
-    // The same instance should be returned for same resource and specification.
-    assertSame(landscapeTwelveKeyKeyboard,
-               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, 
-                           landscape.width(), landscape.height()));
-    assertSame(landscapeQwertyKeyboard,
-               factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
-                           landscape.height()));
-
-    // Assuming the cache is large enough, the same instance should be used for portrait even after
-    // we load ones for landscape.
-    assertSame(portraitTwelveKeyKeyboard,
-               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                           portrait.width(), portrait.height()));
-    assertSame(portraitQwertyKeyboard,
-               factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
-                           portrait.height()));
-  }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java
deleted file mode 100644
index 4b7a0ad..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- */
-public class JapaneseKeyboardParserTest extends InstrumentationTestCase {
-  @SmallTest
-  public void testParseKeyboard()
-      throws NotFoundException, XmlPullParserException, IOException {
-    // The only diff from KeyboardParser, the base of this class, is
-    // that the result type is JapaneseKeyboard, and it has a corresponding
-    // specification.
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-    JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
-        resources, resources.getXml(R.xml.kbd_12keys_kana),
-        KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, 480, 200);
-
-    // ClassCastException shouldn't be raised.
-    JapaneseKeyboard keyboard = parser.parseKeyboard();
-
-    // The keyboard should have specified Specification.
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboard.getSpecification());
-  }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java
deleted file mode 100644
index 8f6e224..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.app.Instrumentation;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- */
-public class JapaneseKeyboardTest extends InstrumentationTestCase {
-  public static JapaneseKeyboard createJapaneseKeyboard(KeyboardSpecification spec,
-                                                        Instrumentation instrumentation) {
-    Resources resources = instrumentation.getTargetContext().getResources();
-    JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
-        resources, resources.getXml(spec.getXmlLayoutResourceId()), spec, 480, 200);
-    try {
-      return parser.parseKeyboard();
-    } catch (NotFoundException e) {
-      fail(e.getMessage());
-    } catch (XmlPullParserException e) {
-      fail(e.getMessage());
-    } catch (IOException e) {
-      fail(e.getMessage());
-    }
-
-    throw new AssertionError("Should never reach here");
-  }
-
-  @SmallTest
-  public void testConstructor() {
-    for (KeyboardSpecification specification : KeyboardSpecification.values()) {
-      // when ResourceId is 0, it means this specification has no Keyboard
-      if (specification.getXmlLayoutResourceId() == 0) {
-        continue;
-      }
-      // Make sure that all specification has corresponding JapaneseKeyboard instance,
-      // and it has the given specification.
-      JapaneseKeyboard keyboard = createJapaneseKeyboard(specification, getInstrumentation());
-      assertEquals(specification.toString(), specification, keyboard.getSpecification());
-    }
-  }
-
-  @SmallTest
-  public void testGetKeyboardName() {
-    Pattern pattern = Pattern.compile("^(\\w+)-(\\d+)\\.(\\d+)\\.(\\d+)-(\\w+)$");
-    Configuration configuration = new Configuration();
-    for (KeyboardSpecification specification : KeyboardSpecification.values()) {
-      for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
-                                        Configuration.ORIENTATION_LANDSCAPE}) {
-        configuration.orientation = orientation;
-        KeyboardSpecificationName keyboardSpecificationName =
-            specification.getKeyboardSpecificationName();
-        String name = keyboardSpecificationName.formattedKeyboardName(configuration);
-        Matcher matcher = pattern.matcher(name);
-        assertTrue(matcher.matches());
-        assertEquals(keyboardSpecificationName.baseName, matcher.group(1));
-        assertEquals(Integer.toString(keyboardSpecificationName.major), matcher.group(2));
-        assertEquals(Integer.toString(keyboardSpecificationName.minor), matcher.group(3));
-        assertEquals(Integer.toString(keyboardSpecificationName.revision), matcher.group(4));
-        assertEquals(KeyboardSpecificationName.getDeviceOrientationString(configuration),
-                     matcher.group(5));
-      }
-    }
-  }
-
-  @SmallTest
-  public void testGetKeycodeMapper() {
-    ProbableKeyEventGuesser guesser =
-        new ProbableKeyEventGuesser(getInstrumentation().getTargetContext().getAssets());
-    Configuration configuration = new Configuration();
-    configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
-    guesser.setConfiguration(configuration);
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-
-    JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
-        KeyboardSpecification.GODAN_KANA, getInstrumentation());
-    assertEquals(resources.getInteger(R.integer.uchar_digit_two), godanKana.getKeyCode(10));
-    assertEquals(Integer.MIN_VALUE, godanKana.getKeyCode(123456));  // No corresponding key,
-  }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java
deleted file mode 100644
index 6a7bf9b..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import static org.easymock.EasyMock.eq;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
-import org.mozc.android.inputmethod.japanese.resources.R;
-import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
-import org.mozc.android.inputmethod.japanese.testing.MainThreadRunner;
-import org.mozc.android.inputmethod.japanese.testing.Parameter;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.os.Looper;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-
-import org.easymock.EasyMock;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboardViewTest extends InstrumentationTestCaseWithMock {
-  private static final int STEP_COUNT = 20;
-  private static final int NUM_ROWS = 4;
-
-  // TODO(hidehiko): Get rid of hard coded parameter (21.8) and split the dependency to the real
-  //   resources from functional unittests (instead, we should have test cases for resources
-  //   or regression tests independently).
-  private static int getKeyWidth(Resources resources) {
-    DisplayMetrics displayMetrics = resources.getDisplayMetrics();
-    return (int) Math.round(displayMetrics.widthPixels * 21.8);
-  }
-
-  private static int getTwelveKeysLayoutKeyHeight(Resources resources) {
-    return resources.getDimensionPixelOffset(R.dimen.input_frame_height) / 4;
-  }
-
-  private static void drag(MainThreadRunner mainThreadRunner, JapaneseKeyboardView view,
-                           int fromX, int toX, int fromY, int toY) {
-    long downTime = MozcUtil.getUptimeMillis();
-    long eventTime = MozcUtil.getUptimeMillis();
-
-    mainThreadRunner.onTouchEvent(
-        view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, fromX, fromY, 0));
-
-    for (int i = 1; i < STEP_COUNT; ++i) {
-      int x = fromX + (toX - fromX) * i / STEP_COUNT;
-      int y = fromY + (toY - fromY) * i / STEP_COUNT;
-
-      eventTime = MozcUtil.getUptimeMillis();
-      mainThreadRunner.onTouchEvent(
-          view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0));
-    }
-
-    eventTime = MozcUtil.getUptimeMillis();
-    mainThreadRunner.onTouchEvent(
-        view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, toX, toY, 0));
-  }
-
-  private JapaneseKeyboard createJapaneseKeyboard(KeyboardSpecification spec,
-                                                  int width, int height) {
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-    JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
-        resources, resources.getXml(spec.getXmlLayoutResourceId()), spec, width, height);
-    try {
-      return parser.parseKeyboard();
-    } catch (NotFoundException e) {
-      fail(e.getMessage());
-    } catch (XmlPullParserException e) {
-      fail(e.getMessage());
-    } catch (IOException e) {
-      fail(e.getMessage());
-    }
-
-    throw new AssertionError("Should never reach here");
-  }
-
-  @SmallTest
-  public void testFlick() {
-    JapaneseKeyboardView view = new JapaneseKeyboardView(getInstrumentation().getTargetContext());
-    Activity activity = launchActivity(
-        getInstrumentation().getTargetContext().getPackageName(), Activity.class, null);
-    try {
-      MainThreadRunner mainThreadRunner = new MainThreadRunner(getInstrumentation());
-      mainThreadRunner.setContentView(activity, view);
-      Resources resources = getInstrumentation().getTargetContext().getResources();
-      int keyWidth = getKeyWidth(resources);
-      int keyHeight = getTwelveKeysLayoutKeyHeight(resources);
-      int width = resources.getDisplayMetrics().widthPixels;
-      int height = keyHeight * NUM_ROWS;
-      mainThreadRunner.setJapaneseKeyboard(
-          view, createJapaneseKeyboard(KeyboardSpecification.TWELVE_KEY_FLICK_KANA, width, height));
-      mainThreadRunner.layout(view, 0, 0, width, height);
-
-      // Move center to up.
-      int fromX = view.getWidth() / 2;
-      int fromY = view.getHeight() / 2 - keyHeight / 2;
-
-     class TestData extends Parameter {
-       final int toX;
-       final int toY;
-       final int expectedCode;
-       TestData(int toX, int toY, int expectedCode) {
-         this.toX = toX;
-         this.toY = toY;
-         this.expectedCode = expectedCode;
-       }
-     }
-     TestData[] testDataList = {
-         new TestData(fromX - keyWidth, fromY, 'j'),   // Left
-         new TestData(fromX + keyWidth, fromY, 'l'),   // Right
-         new TestData(fromX, fromY - keyWidth, 'k'),  // Up
-         new TestData(fromX, fromY + keyWidth, '%'),  // Down
-     };
-
-     KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
-     KeyEventHandler keyEventHandler =
-         new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
-     for (TestData testData : testDataList) {
-       resetAll();
-       keyboardActionListener.onPress('5');
-       keyboardActionListener.onKey(
-           eq(testData.expectedCode), EasyMock.<List<TouchEvent>>notNull());
-       keyboardActionListener.onRelease('5');
-       replayAll();
-
-       view.setKeyEventHandler(keyEventHandler);
-       drag(mainThreadRunner, view, fromX, testData.toX, fromY, testData.toY);
-       view.setKeyEventHandler(null);
-
-       verifyAll();
-     }
-    } finally {
-      if (activity != null) {
-        activity.finish();
-      }
-    }
-  }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
index 4652b80..8171ca4 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
@@ -33,6 +33,7 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
@@ -70,8 +71,9 @@
   }
 
   private KeyEventContext createKeyEventContextMock() {
-    Key key = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
-        Collections.<KeyState>emptyList());
+    Key key = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                      Collections.<KeyState>emptyList());
     return createMockBuilder(KeyEventContext.class)
         .withConstructor(Key.class, int.class, float.class, float.class,
                          int.class, int.class, float.class, Set.class)
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
index 1efb658..e4c2b0e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
@@ -30,9 +30,8 @@
 package org.mozc.android.inputmethod.japanese;
 
 import org.mozc.android.inputmethod.japanese.DependencyFactory.Dependency;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
@@ -76,7 +75,7 @@
 
   private void verifyKeyboardSpecificationInView(KeyboardSpecification specification) {
     waitForExecution();
-    assertEquals(specification, service.viewManager.getJapaneseKeyboardSpecification());
+    assertEquals(specification, service.viewManager.getKeyboardSpecification());
   }
 
   private void verifyKeyboardSpecificationInService(KeyboardSpecification specification) {
@@ -157,7 +156,7 @@
   }
 
   private void setHardwareKeyMap(HardwareKeyMap keyMap) {
-    service.hardwareKeyboard.setHardwareKeyMap(keyMap);
+    service.viewManager.setHardwareKeyMap(keyMap);
   }
 
   private void setKeyboardSpecification(KeyboardLayout layout, InputStyle inputStyle) {
@@ -165,10 +164,6 @@
     service.viewManager.setInputStyle(inputStyle);
   }
 
-  private void changeHardwareKeyboardCompositionMode(CompositionSwitchMode mode) {
-    service.getViewEventListener().onHardwareKeyboardCompositionModeChange(mode);
-  }
-
   // Waits for all the execution of the session executor.
   // Expected to be called from verify* methods.
   private void waitForExecution() {
@@ -283,85 +278,43 @@
   }
 
   /**
-   * If h/w keyboard sends some special keys, narrow mode is not shown.
+   * Even if h/w keyboard sends some special keys, transition to narrow mode happens.
    */
-  public void testHardwareSpecialKeyEvent_ShouldNotShowNarrowMode() {
+  public void testHardwareSpecialKeyEvent_TransitionToNarrowMode() {
     createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
     setHardwareKeyMap(HardwareKeyMap.DEFAULT);
-    verifyNarrowMode(false);
+    setKeyboardSpecification(KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE_FLICK);
     verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
     verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+
+    verifyNarrowMode(false);
     hardwareKeyEvent(KeyEvent.KEYCODE_ENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
+    verifyNarrowMode(true);
+
+    service.viewManager.setNarrowMode(false);
+    verifyNarrowMode(false);
     hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, 0, 0, InputDevice.SOURCE_KEYBOARD);
+    verifyNarrowMode(true);
+
+    service.viewManager.setNarrowMode(false);
+    verifyNarrowMode(false);
     hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0,
-                     InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.META_SHIFT_ON, 0,
-                     InputDevice.SOURCE_KEYBOARD);
+    verifyNarrowMode(true);
+
+    service.viewManager.setNarrowMode(false);
+    verifyNarrowMode(false);
+    hardwareKeyEvent(
+        KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0, InputDevice.SOURCE_KEYBOARD);
+    verifyNarrowMode(true);
+
+    service.viewManager.setNarrowMode(false);
+    verifyNarrowMode(false);
+    hardwareKeyEvent(
+        KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0, InputDevice.SOURCE_KEYBOARD);
+    verifyNarrowMode(true);
+
     // Nothing is input.
     verifyCompositionText("");
-    // No narrow mode.
-    verifyNarrowMode(false);
-  }
-
-  /**
-   * Normal case for h/w 12keys keyboard.
-   */
-  public void testHardwareTwelveKey_NormalCase() {
-    createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
-    setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
-    setKeyboardSpecification(KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE_FLICK);
-    verifyNarrowMode(false);
-    verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
-    verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_2, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_3, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_4, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_5, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_6, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_7, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_8, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_9, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_0, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    hardwareKeyEvent(KeyEvent.KEYCODE_STAR, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("あかさたなはまやらゎ");
-    verifyNarrowMode(true);
-    verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
-    verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
-    hardwareKeyEvent(KeyEvent.KEYCODE_ENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("");
-    verifySubmittedText("あかさたなはまやらゎ");
-  }
-
-  public void testHardwareTwelveKey_CompositionModeChange() {
-    createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
-    setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("あ");
-    changeHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("あ@");
-    changeHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("あ@あ");
-  }
-
-  public void testHardwareTwelveKey_SpecialKeysFor12Keys() {
-    createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
-    setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
-
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    // KEYCODE_POUND(#) behaves as KEYCODE_ENTER.
-    hardwareKeyEvent(KeyEvent.KEYCODE_POUND, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("");
-    verifySubmittedText("あ");
-
-    hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    // KEYCODE_DPAD_CENTER(#) behaves as KEYCODE_ENTER.
-    hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_CENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
-    verifyCompositionText("");
-    verifySubmittedText("あ");
   }
 
   /**
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
index 646f0ff..247ad1f 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
@@ -59,7 +59,6 @@
 public class MozcMenuDialogListenerImplTest extends InstrumentationTestCaseWithMock {
   private Context context;
   private InputMethodService inputMethodService;
-  private ImeSwitcher imeSwitcher;
   private MenuDialogListener listener;
 
   @Override
@@ -67,8 +66,7 @@
     super.setUp();
     context = createMock(MockContext.class);
     inputMethodService = createMock(InputMethodService.class);
-    imeSwitcher = createMock(ImeSwitcher.class);
-    listener = new MozcMenuDialogListenerImpl(inputMethodService, imeSwitcher);
+    listener = new MozcMenuDialogListenerImpl(inputMethodService);
   }
 
   @Override
@@ -112,7 +110,7 @@
     final ViewManagerInterface stubViewManager = createNiceMock(ViewManagerInterface.class);
     final Activity stubPreferenceActivity = createNiceMock(Activity.class);
 
-    Context context = createNiceMock(Context.class);
+    Context context = createNiceMock(MockContext.class);
     String packageName = "test.package.name";
 
     try {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
index 5c93851..a871616 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
@@ -30,6 +30,7 @@
 package org.mozc.android.inputmethod.japanese;
 
 import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesKeyEvent;
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
 import static org.easymock.EasyMock.anyBoolean;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.capture;
@@ -37,19 +38,17 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.isA;
-import static org.easymock.EasyMock.isNull;
 import static org.easymock.EasyMock.same;
 
 import org.mozc.android.inputmethod.japanese.DependencyFactory.Dependency;
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.MozcService.SymbolHistoryStorageImpl;
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
 import org.mozc.android.inputmethod.japanese.model.SelectionTracker;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
@@ -59,6 +58,8 @@
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
@@ -77,7 +78,6 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config.SelectionShortcut;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config.SessionKeymap;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor.EvaluationCallback;
 import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
@@ -86,6 +86,7 @@
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
 import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.base.Optional;
 import com.google.protobuf.ByteString;
@@ -96,6 +97,7 @@
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.media.AudioManager;
 import android.os.Build;
 import android.os.Handler;
@@ -181,13 +183,14 @@
 
   private MozcService createInitializedService(SessionExecutor sessionExecutor) {
     MozcService service = createService();
-    invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+    invokeOnCreateInternal(
+        service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
     return service;
   }
 
   private MozcService initializeMozcService(MozcService service,
                                             SessionExecutor sessionExecutor) {
-    invokeOnCreateInternal(initializeService(service), null, null,
+    invokeOnCreateInternal(initializeService(service), null, getSharedPreferences(),
                            getDefaultDeviceConfiguration(), sessionExecutor);
     return service;
   }
@@ -226,9 +229,7 @@
     ViewEventListener eventListener = service.new MozcEventListener();
     service.onCreateInternal(
         eventListener, viewManager, sharedPreferences, deviceConfiguration, sessionExecutor);
-    if (sharedPreferences != null) {
-      sharedPreferenceChangeListeners.add(service.sharedPreferenceChangeListener);
-    }
+    sharedPreferenceChangeListeners.add(service.sharedPreferenceChangeListener);
   }
 
   @SmallTest
@@ -236,7 +237,7 @@
   @UiThreadTest
   public void testOnCreate() {
     SharedPreferences preferences = getSharedPreferences();
-    // Client-side conifg
+    // Client-side config
     preferences.edit()
         .putBoolean("pref_haptic_feedback_key", true)
         .putBoolean("pref_other_anonimous_mode_key", true)
@@ -247,12 +248,14 @@
     sessionExecutor.setLogging(anyBoolean());
     sessionExecutor.setImposedConfig(isA(Config.class));
     sessionExecutor.setConfig(ConfigUtil.toConfig(preferences));
-    sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+                                    isA(CompositionMode.class),
                                     anyObject(EvaluationCallback.class));
     expectLastCall().asStub();
     sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
     expectLastCall().asStub();
-    sessionExecutor.preferenceUsageStatsEvent(anyObject(SharedPreferences.class));
+    sessionExecutor.preferenceUsageStatsEvent(
+        anyObject(SharedPreferences.class), anyObject(Resources.class));
 
     ViewManager viewManager = createMockBuilder(ViewManager.class)
         .withConstructor(Context.class, ViewEventListener.class,
@@ -306,7 +309,7 @@
   public void testOnCreate_viewManager() {
     MozcService service = createService();
     try {
-      invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(),
+      invokeOnCreateInternal(service, null, getSharedPreferences(), getDefaultDeviceConfiguration(),
                              createNiceMock(SessionExecutor.class));
       assertSame(ViewManager.class, service.viewManager.getClass());
 
@@ -322,7 +325,8 @@
     SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
     replayAll();
 
-    invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+    invokeOnCreateInternal(
+        service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
 
     verifyAll();
     assertNotNull(service.onCreateInputView());
@@ -335,17 +339,13 @@
     SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
     KeyboardSpecification defaultSpecification = service.currentKeyboardSpecification;
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            defaultSpecification.getKeyboardSpecificationName(),
-            Optional.of(defaultSpecification.getSpecialRomanjiTable()),
-            Optional.of(defaultSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(defaultSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(defaultSpecification.getCrossingEdgeBehavior()),
-            getDefaultDeviceConfiguration()),
+        MozcUtil.getRequestBuilder(
+            service.getResources(), defaultSpecification, getDefaultDeviceConfiguration()).build(),
         Collections.<TouchEvent>emptyList());
 
     replayAll();
-    invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+    invokeOnCreateInternal(
+        service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
     verifyAll();
   }
 
@@ -447,7 +447,8 @@
     // Exactly one message is issued to switch composition mode.
     // It should not render a result in order to preserve
     // the existent text. b/5181946
-    sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), eq(CompositionMode.HIRAGANA),
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+                                    eq(CompositionMode.HIRAGANA),
                                     anyObject(EvaluationCallback.class));
     replayAll();
 
@@ -509,20 +510,24 @@
         .addMockedMethods("isInputViewShown", "sendKeyWithKeyboardSpecification")
         .createMock();
     SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
-    HardwareKeyboard hardwareKeyboard = createNiceMock(HardwareKeyboard.class);
     ViewEventListener eventListener = createNiceMock(ViewEventListener.class);
     ViewManager viewManager = createMockBuilder(ViewManager.class)
         .withConstructor(Context.class, ViewEventListener.class,
                          SymbolHistoryStorage.class, ImeSwitcher.class, MenuDialogListener.class)
         .withArgs(context, eventListener, createNiceMock(SymbolHistoryStorage.class),
                   createNiceMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class))
+        .addMockedMethods("onHardwareKeyEvent")
         .createNiceMock();
+    service.sendKeyWithKeyboardSpecification(
+        same(ProtoCommands.KeyEvent.class.cast(null)), same(KeyEventInterface.class.cast(null)),
+        anyObject(KeyboardSpecification.class), anyObject(Configuration.class),
+        eq(Collections.<TouchEvent>emptyList()));
+    expectLastCall().asStub();
 
     // Before test, we need to setup mock instances with some method calls.
     // Because the calls is out of this test, we do it by NiceMock and replayAll.
     replayAll();
     initializeMozcService(service, sessionExecutor);
-    service.hardwareKeyboard = hardwareKeyboard;
     SharedPreferences sharedPreferences = getSharedPreferences();
     invokeOnCreateInternal(service, viewManager, sharedPreferences,
                            context.getResources().getConfiguration(), sessionExecutor);
@@ -533,54 +538,11 @@
     resetAll();
 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
-    ProtoCommands.KeyEvent mozcKeyEvent =
-        ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
-    KeyboardSpecification keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
-
     expect(service.isInputViewShown()).andStubReturn(true);
-
     ClientSidePreference clientSidePreference = service.propagatedClientSidePreference;
     assertNotNull(clientSidePreference);
-    assertNull(clientSidePreference.getHardwareKeyMap());
-    hardwareKeyboard.setHardwareKeyMap(anyObject(HardwareKeyMap.class));
-
-    expect(hardwareKeyboard.getCompositionMode()).andStubReturn(CompositionMode.HIRAGANA);
-
-    expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
-    expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
-    expect(hardwareKeyboard.getKeyEventInterface(event))
-        .andReturn(KeycodeConverter.getKeyEventInterface(event));
-    expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
-    service.sendKeyWithKeyboardSpecification(
-        same(mozcKeyEvent), matchesKeyEvent(event),
-        same(keyboardSpecification),
-        eq(getDefaultDeviceConfiguration()),
-        eq(Collections.<TouchEvent>emptyList()));
-
-    replayAll();
-
-    assertTrue(service.onKeyDownInternal(0, event, getDefaultDeviceConfiguration()));
-
-    verifyAll();
-
-    // Change CompositionMode.
-    resetAll();
-
-    expect(service.isInputViewShown()).andStubReturn(true);
-
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
-    expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
-    viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HALF_ASCII);
-    expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
-    expect(hardwareKeyboard.getKeyEventInterface(event))
-        .andReturn(KeycodeConverter.getKeyEventInterface(event));
-    expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
-    service.sendKeyWithKeyboardSpecification(
-        same(mozcKeyEvent), matchesKeyEvent(event),
-        same(keyboardSpecification),
-        eq(getDefaultDeviceConfiguration()),
-        eq(Collections.<TouchEvent>emptyList()));
+    assertEquals(HardwareKeyMap.DEFAULT, clientSidePreference.getHardwareKeyMap());
+    viewManager.onHardwareKeyEvent(event);
 
     replayAll();
 
@@ -620,20 +582,17 @@
     verifyAll();
 
     // Send "a" with keyboard specification change. [HARDWARE_QWERTY_KANA]
+    // This is transition from software to hardware keyboard, so submit() is called.
     resetAll();
 
     mozcKeyEvent = ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
     keyEvent = KeycodeConverter.getKeyEventInterface(KeyEvent.KEYCODE_A);
     keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
 
+    sessionExecutor.submit(same(service.renderResultCallback));
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            keyboardSpecification.getKeyboardSpecificationName(),
-            Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
-            Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
-            getDefaultDeviceConfiguration()),
+        MozcUtil.getRequestBuilder(
+            service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
         Collections.<TouchEvent>emptyList());
     sessionExecutor.sendKey(
         ProtoCommands.KeyEvent.newBuilder(mozcKeyEvent)
@@ -675,16 +634,12 @@
     keyboardSpecification = KeyboardSpecification.TWELVE_KEY_FLICK_KANA;
 
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            keyboardSpecification.getKeyboardSpecificationName(),
-            Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
-            Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
-            getDefaultDeviceConfiguration()),
+        MozcUtil.getRequestBuilder(
+            service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
         Collections.<TouchEvent>emptyList());
-    sessionExecutor.switchInputMode(keyEvent, keyboardSpecification.getCompositionMode(),
-                                    renderResultCallback);
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+                                    eq(keyboardSpecification.getCompositionMode()),
+                                    same(renderResultCallback));
 
     replayAll();
 
@@ -721,17 +676,13 @@
     resetAll();
 
     keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
+    sessionExecutor.submit(same(service.renderResultCallback));
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            keyboardSpecification.getKeyboardSpecificationName(),
-            Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
-            Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
-            getDefaultDeviceConfiguration()),
+        MozcUtil.getRequestBuilder(
+            service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
         Collections.<TouchEvent>emptyList());
     sessionExecutor.switchInputMode(
-        same(keyEvent), isA(CompositionMode.class), same(service.renderResultCallback));
+        sameOptional(keyEvent), isA(CompositionMode.class), same(service.renderResultCallback));
 
     replayAll();
 
@@ -822,8 +773,8 @@
 
     Preedit preedit = Preedit.newBuilder()
         .addSegment(Segment.newBuilder()
-            .setValue("0")
-            .setAnnotation(Annotation.UNDERLINE)
+            .setValue("\uD83D\uDC31")  // a character meaning a cat
+            .setAnnotation(Annotation.HIGHLIGHT)
             .setValueLength(1))
         .addSegment(Segment.newBuilder()
             .setValue("1")
@@ -831,13 +782,15 @@
             .setValueLength(1))
         .addSegment(Segment.newBuilder()
             .setValue("2")
-            .setAnnotation(Annotation.HIGHLIGHT)
+            .setAnnotation(Annotation.UNDERLINE)
             .setValueLength(1))
-        .setCursor(3)
+        .setCursor(1)
         .build();
     Command command = Command.newBuilder()
         .setInput(Input.newBuilder().setType(Input.CommandType.SEND_KEY))
-        .setOutput(Output.newBuilder().setConsumed(true).setPreedit(preedit))
+        .setOutput(Output.newBuilder()
+            .setConsumed(true).setPreedit(preedit)
+            .setAllCandidateWords(CandidateList.newBuilder().setCategory(Category.SUGGESTION)))
         .build();
 
     resetAll();
@@ -847,6 +800,8 @@
     // the cursor is at the tail
     expect(inputConnection.setComposingText(capture(spannableStringBuilderCapture), eq(1)))
         .andReturn(true);
+    expect(selectionTracker.getPreeditStartPosition()).andReturn(0);
+    expect(inputConnection.setSelection(1, 1)).andReturn(true);
     selectionTracker.onRender(null, null, preedit);
     expect(inputConnection.endBatchEdit()).andReturn(true);
     replayAll();
@@ -855,11 +810,13 @@
 
     verifyAll();
     SpannableStringBuilder sb = spannableStringBuilderCapture.getValue();
-    assertEquals("012", sb.toString());
+    assertEquals("\uD83D\uDC3112", sb.toString());
     assertEquals(0, sb.getSpanStart(MozcService.SPAN_UNDERLINE));
-    assertEquals(3, sb.getSpanEnd(MozcService.SPAN_UNDERLINE));
-    assertEquals(2, sb.getSpanStart(MozcService.SPAN_CONVERT_HIGHLIGHT));
-    assertEquals(3, sb.getSpanEnd(MozcService.SPAN_CONVERT_HIGHLIGHT));
+    assertEquals(4, sb.getSpanEnd(MozcService.SPAN_UNDERLINE));
+    assertEquals(2, sb.getSpanStart(MozcService.SPAN_PARTIAL_SUGGESTION_COLOR));
+    assertEquals(4, sb.getSpanEnd(MozcService.SPAN_PARTIAL_SUGGESTION_COLOR));
+    assertEquals(0, sb.getSpanStart(MozcService.SPAN_BEFORE_CURSOR));
+    assertEquals(2, sb.getSpanEnd(MozcService.SPAN_BEFORE_CURSOR));
   }
 
   @SmallTest
@@ -1003,7 +960,8 @@
         .setOutput(Output.newBuilder()
             .setConsumed(true)
             .setResult(Result.newBuilder().setValue("commit").setType(ResultType.STRING))
-            .setPreedit(preedit))
+            .setPreedit(preedit)
+            .setAllCandidateWords(CandidateList.newBuilder().setCategory(Category.CONVERSION)))
         .build();
 
     resetAll();
@@ -1227,7 +1185,7 @@
 
       verifyAll();
 
-      // If the subview (SymbolInputView or CursorView) is shown, close it and do not pass the event
+      // If SymbolInputView is shown, close it and do not pass the event
       // to the client application.
       resetAll();
       expect(service.isInputViewShown()).andReturn(true);
@@ -1256,7 +1214,7 @@
   public void testSendKeyEventEnter() {
     MozcService service = createMockBuilder(MozcService.class)
         .addMockedMethods("requestHideSelf", "sendDownUpKeyEvents", "isInputViewShown",
-                          "sendDefaultEditorAction")
+                          "sendDefaultEditorAction", "getCurrentInputEditorInfo")
         .createMock();
     ViewEventListener eventListener = createNiceMock(ViewEventListener.class);
     ViewManager viewManager =
@@ -1287,6 +1245,7 @@
       resetAll();
       expect(service.isInputViewShown()).andReturn(true);
       expect(service.sendDefaultEditorAction(true)).andReturn(true);
+      expect(service.getCurrentInputEditorInfo()).andStubReturn(new EditorInfo());
       replayAll();
 
       service.sendKeyEvent(keyEvent);
@@ -1367,15 +1326,10 @@
     KeyboardSpecification newSpecification = KeyboardSpecification.QWERTY_KANA;
 
     sessionExecutor.updateRequest(
-        MozcUtil.getRequestForKeyboard(
-            newSpecification.getKeyboardSpecificationName(),
-            Optional.of(newSpecification.getSpecialRomanjiTable()),
-            Optional.of(newSpecification.getSpaceOnAlphanumeric()),
-            Optional.of(newSpecification.isKanaModifierInsensitiveConversion()),
-            Optional.of(newSpecification.getCrossingEdgeBehavior()),
-            getDefaultDeviceConfiguration()),
+        MozcUtil.getRequestBuilder(
+            service.getResources(), newSpecification, getDefaultDeviceConfiguration()).build(),
         touchEventList);
-    sessionExecutor.switchInputMode(isNull(KeyEventInterface.class),
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
                                     eq(newSpecification.getCompositionMode()),
                                     anyObject(EvaluationCallback.class));
 
@@ -1417,11 +1371,13 @@
     sessionExecutor.setImposedConfig(isA(Config.class));
     sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
     expectLastCall().asStub();
-    sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+                                    isA(CompositionMode.class),
                                     anyObject(EvaluationCallback.class));
     expectLastCall().asStub();
     sessionExecutor.setConfig(isA(Config.class));
-    sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+    sessionExecutor.preferenceUsageStatsEvent(
+        sharedPreferences, getInstrumentation().getTargetContext().getResources());
     replayAll();
 
     invokeOnCreateInternal(service, null, sharedPreferences, getDefaultDeviceConfiguration(),
@@ -1432,7 +1388,7 @@
 
     // Make sure the UI is initialized expectedly.
     assertEquals(KeyboardLayout.QWERTY,
-        service.viewManager.getJapaneseSoftwareKeyboardModel().getKeyboardLayout());
+        service.viewManager.getActiveSoftwareKeyboardModel().getKeyboardLayout());
   }
 
   @SmallTest
@@ -1537,7 +1493,8 @@
     replayAll();
 
     // Invoke onConversionCandidateSelected.
-    service.viewManager.getEventListener().onConversionCandidateSelected(0);
+    service.viewManager.getEventListener()
+        .onConversionCandidateSelected(0, Optional.<Integer>absent());
 
     verifyAll();
   }
@@ -1580,33 +1537,50 @@
     verifyAll();
   }
 
+  @SuppressWarnings("unchecked")
   @SmallTest
-  public void testMozcEventListener_onClickHardwareKeyboardCompositionModeButton() {
-    MozcService service = createService();
+  public void testMozcEventListener_onNarrowModeChanged() {
+    SessionExecutor sessionExecutorMock = createMock(SessionExecutor.class);
+    MozcService service = initializeMozcService(new MozcService(), sessionExecutorMock);
+    ViewManagerInterface viewManagerMock = createMock(ViewManagerInterface.class);
+    service.viewManager = viewManagerMock;
     ViewEventListener viewEventListener = service.new MozcEventListener();
-    ViewManager viewManager =
-        createViewManagerMock(getInstrumentation().getTargetContext(), viewEventListener);
-    invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
-                           createNiceMock(SessionExecutor.class));
-    HardwareKeyboard hardwareKeyboard = createMock(HardwareKeyboard.class);
-    service.hardwareKeyboard = hardwareKeyboard;
 
+    Capture<Config> configCapture = new Capture<Config>();
+
+    // On transition from narrow mode to non-narrow mode, submit() should be called.
     resetAll();
-
-    hardwareKeyboard.setCompositionMode(CompositionSwitchMode.TOGGLE);
-    // As current composition mode
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
-    // As updated composition mode
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
-    viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HALF_ASCII);
-    expect(hardwareKeyboard.getKeyboardSpecification())
-        .andReturn(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
-
+    expect(viewManagerMock.isNarrowMode()).andStubReturn(false);
+    expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(false);
+    sessionExecutorMock.submit(same(service.renderResultCallback));
+    sessionExecutorMock.setImposedConfig(capture(configCapture));
     replayAll();
-
-    viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
-
+    viewEventListener.onNarrowModeChanged(false);
     verifyAll();
+    assertEquals(SelectionShortcut.NO_SHORTCUT,
+                 configCapture.getValue().getSelectionShortcut());
+
+    // On the opposite transition, submit() should not be called.
+    resetAll();
+    expect(viewManagerMock.isNarrowMode()).andStubReturn(true);
+    expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(true);
+    sessionExecutorMock.setImposedConfig(capture(configCapture));
+    replayAll();
+    viewEventListener.onNarrowModeChanged(true);
+    verifyAll();
+    assertEquals(SelectionShortcut.SHORTCUT_123456789,
+                 configCapture.getValue().getSelectionShortcut());
+
+    // Don't use shortcut keys if floating candidate window is disabled.
+    resetAll();
+    expect(viewManagerMock.isNarrowMode()).andStubReturn(true);
+    expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(false);
+    sessionExecutorMock.setImposedConfig(capture(configCapture));
+    replayAll();
+    viewEventListener.onNarrowModeChanged(true);
+    verifyAll();
+    assertEquals(SelectionShortcut.NO_SHORTCUT,
+                 configCapture.getValue().getSelectionShortcut());
   }
 
   @SmallTest
@@ -1655,7 +1629,7 @@
 
   @SmallTest
   public void testPropagateClientSidePreference_touchUI() {
-
+    Resources resoureces = getInstrumentation().getTargetContext().getResources();
     SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
     replayAll();
     MozcService service = createInitializedService(sessionExecutor);
@@ -1668,7 +1642,7 @@
           new ClientSidePreference(
               true, 100, true, 100, false, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
               0, EmojiProviderType.DOCOMO, HardwareKeyMap.JAPANESE109A, SkinType.ORANGE_LIGHTGRAY,
-              LayoutAdjustment.FILL, 100);
+              true, LayoutAdjustment.FILL, 100);
       service.propagateClientSidePreference(clientSidePreference);
 
       // Check all the fields are propagated.
@@ -1676,16 +1650,16 @@
       assertTrue(feedbackManager.isHapticFeedbackEnabled());
       assertEquals(feedbackManager.getHapticFeedbackDuration(), 100L);
       assertTrue(feedbackManager.isSoundFeedbackEnabled());
-      assertEquals(feedbackManager.getSoundFeedbackVolume(), 0.2f);
+      assertEquals(feedbackManager.getSoundFeedbackVolume(), 0.8f);
       assertFalse(viewManager.isPopupEnabled());
-      JapaneseSoftwareKeyboardModel model = viewManager.getJapaneseSoftwareKeyboardModel();
+      JapaneseSoftwareKeyboardModel model = viewManager.getActiveSoftwareKeyboardModel();
       assertEquals(KeyboardLayout.QWERTY, model.getKeyboardLayout());
       assertEquals(InputStyle.TOGGLE, model.getInputStyle());
       assertFalse(model.isQwertyLayoutForAlphabet());
       assertFalse(viewManager.isFullscreenMode());
       assertFalse(service.onEvaluateFullscreenMode());
       assertEquals(EmojiProviderType.DOCOMO, viewManager.getEmojiProviderType());
-      assertEquals(HardwareKeyMap.JAPANESE109A, service.hardwareKeyboard.getHardwareKeyMap());
+      assertEquals(HardwareKeyMap.JAPANESE109A, service.viewManager.getHardwareKeyMap());
       assertEquals(LayoutAdjustment.FILL, viewManager.getLayoutAdjustment());
       assertEquals(100, viewManager.getKeyboardHeightRatio());
     }
@@ -1705,7 +1679,8 @@
       final int expectFlickSensitivity;
       final EmojiProviderType expectEmojiProviderType;
       final HardwareKeyMap expectHardwareKeyMap;
-      final SkinType expectSkinType;
+      final Skin expectSkin;
+      final boolean expectMicrophoneButtonEnabledByPreference;
       final LayoutAdjustment expectLayoutAdjustment;
       final int expectKeyboardHeight;
 
@@ -1720,7 +1695,8 @@
                int expectFlickSensitivity,
                EmojiProviderType expectEmojiProviderType,
                HardwareKeyMap expectHardwareKeyMap,
-               SkinType expectSkinType,
+               Skin expectSkin,
+               boolean expectMicrophoneButtonEnabledByPreference,
                LayoutAdjustment expectLayoutAdjustment,
                int expectKeyboardHeight) {
         this.clientSidePreference = clientSidePreference;
@@ -1736,7 +1712,8 @@
         this.expectFlickSensitivity = expectFlickSensitivity;
         this.expectEmojiProviderType = expectEmojiProviderType;
         this.expectHardwareKeyMap = expectHardwareKeyMap;
-        this.expectSkinType = expectSkinType;
+        this.expectSkin = expectSkin;
+        this.expectMicrophoneButtonEnabledByPreference = expectMicrophoneButtonEnabledByPreference;
         this.expectLayoutAdjustment = expectLayoutAdjustment;
         this.expectKeyboardHeight = expectKeyboardHeight;
       }
@@ -1748,11 +1725,11 @@
             new ClientSidePreference(
                 false, 10, true, 10, true, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
                 0, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
-                LayoutAdjustment.FILL, 100),
+                true, LayoutAdjustment.FILL, 100),
             false,
             10,
             true,
-            0.02f,
+            0.08f,
             true,
             KeyboardLayout.QWERTY,
             InputStyle.TOGGLE,
@@ -1761,18 +1738,19 @@
             0,
             EmojiProviderType.DOCOMO,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 20, true, 20, false, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
                 -1, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
-                LayoutAdjustment.FILL, 100),
+                false, LayoutAdjustment.FILL, 100),
             false,
             20,
             true,
-            0.04f,
+            0.16f,
             false,
             KeyboardLayout.QWERTY,
             InputStyle.TOGGLE,
@@ -1781,18 +1759,19 @@
             -1,
             EmojiProviderType.DOCOMO,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            false,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 30, false, 30, true, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
                 2, EmojiProviderType.KDDI, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
-                LayoutAdjustment.FILL, 100),
+                true, LayoutAdjustment.FILL, 100),
             false,
             30,
             false,
-            0.06f,
+            0.24f,
             true,
             KeyboardLayout.QWERTY,
             InputStyle.TOGGLE,
@@ -1801,18 +1780,19 @@
             2,
             EmojiProviderType.KDDI,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 40, false, 40, true, KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE,
                 false, false, -3, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+                SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.FILL, 100),
             false,
             40,
             false,
-            0.08f,
+            0.32f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.TOGGLE,
@@ -1821,18 +1801,19 @@
             -3,
             EmojiProviderType.SOFTBANK,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 50, false, 50, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
                 false, false, 4, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+                SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
             false,
             50,
             false,
-            0.1f,
+            0.4f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1841,18 +1822,19 @@
             4,
             EmojiProviderType.DOCOMO,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            false,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 60, false, 60, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
                 true, false, -5, EmojiProviderType.KDDI, HardwareKeyMap.DEFAULT,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+                SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.FILL, 100),
             false,
             60,
             false,
-            0.12f,
+            0.48f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1861,18 +1843,19 @@
             -5,
             EmojiProviderType.KDDI,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 70, false, 70, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
                 true, true, 6, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+                SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
             false,
             70,
             false,
-            0.14f,
+            0.56f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1881,17 +1864,18 @@
             6,
             EmojiProviderType.SOFTBANK,
             HardwareKeyMap.DEFAULT,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            false,
             LayoutAdjustment.FILL, 100),
         new TestData(
             new ClientSidePreference(
                 false, 80, false, 80, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
                 true, true, -7, EmojiProviderType.SOFTBANK, HardwareKeyMap.JAPANESE109A,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+                SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
             false,
             80,
             false,
-            0.16f,
+            0.64f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1900,18 +1884,19 @@
             -7,
             EmojiProviderType.SOFTBANK,
             HardwareKeyMap.JAPANESE109A,
-            SkinType.ORANGE_LIGHTGRAY,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            false,
             LayoutAdjustment.FILL,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 90, false, 90, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
-                true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.TWELVEKEY,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.RIGHT, 100),
+                true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
+                SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.RIGHT, 100),
             false,
             90,
             false,
-            0.18f,
+            0.72f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1919,19 +1904,20 @@
             true,
             8,
             EmojiProviderType.SOFTBANK,
-            HardwareKeyMap.TWELVEKEY,
-            SkinType.ORANGE_LIGHTGRAY,
+            HardwareKeyMap.DEFAULT,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.RIGHT,
             100),
         new TestData(
             new ClientSidePreference(
                 false, 100, false, 100, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
-                true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.TWELVEKEY,
-                SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.RIGHT, 120),
+                true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
+                SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.RIGHT, 120),
             false,
             100,
             false,
-            0.2f,
+            0.8f,
             true,
             KeyboardLayout.TWELVE_KEYS,
             InputStyle.FLICK,
@@ -1939,8 +1925,9 @@
             true,
             8,
             EmojiProviderType.SOFTBANK,
-            HardwareKeyMap.TWELVEKEY,
-            SkinType.ORANGE_LIGHTGRAY,
+            HardwareKeyMap.DEFAULT,
+            SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+            true,
             LayoutAdjustment.RIGHT,
             120),
     };
@@ -1964,7 +1951,7 @@
       assertEquals(testData.toString(),
                    testData.expectPopupFeedback,
                    viewManager.isPopupEnabled());
-      JapaneseSoftwareKeyboardModel model = viewManager.getJapaneseSoftwareKeyboardModel();
+      JapaneseSoftwareKeyboardModel model = viewManager.getActiveSoftwareKeyboardModel();
       assertEquals(testData.toString(), testData.expectKeyboardLayout, model.getKeyboardLayout());
       assertEquals(testData.toString(), testData.expectInputStyle, model.getInputStyle());
       assertEquals(testData.toString(),
@@ -1981,10 +1968,13 @@
                    testData.expectEmojiProviderType,
                    viewManager.getEmojiProviderType());
       assertEquals(testData.toString(),
-                   testData.expectHardwareKeyMap, service.hardwareKeyboard.getHardwareKeyMap());
+                   testData.expectHardwareKeyMap, service.viewManager.getHardwareKeyMap());
       assertEquals(testData.toString(),
-                   testData.expectSkinType,
-                   viewManager.getSkinType());
+                   testData.expectSkin,
+                   viewManager.getSkin());
+      assertEquals(testData.toString(),
+                   testData.expectMicrophoneButtonEnabledByPreference,
+                   viewManager.isMicrophoneButtonEnabledByPreference());
       assertEquals(testData.toString(),
                    testData.expectLayoutAdjustment,
                    viewManager.getLayoutAdjustment());
@@ -2020,21 +2010,15 @@
                   createNiceMock(SymbolHistoryStorage.class),
                   createNiceMock(ImeSwitcher.class),
                   createNiceMock(MenuDialogListener.class))
-        .addMockedMethods("isNarrowMode", "hideSubInputView", "setNarrowMode",
-                          "onConfigurationChanged")
+        .addMockedMethods("onConfigurationChanged")
         .createMock();
     MozcService service = createService();
-    invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
-                           sessionExecutor);
+    invokeOnCreateInternal(
+        service, viewManager, getSharedPreferences(), getDefaultDeviceConfiguration(),
+        sessionExecutor);
     service.selectionTracker = selectionTracker;
     service.inputBound = true;
 
-    Config expectedConfig = Config.newBuilder()
-        .setSessionKeymap(SessionKeymap.MOBILE)
-        .setSelectionShortcut(SelectionShortcut.NO_SHORTCUT)
-        .setUseEmojiConversion(true)
-        .build();
-
     Configuration deviceConfig = new Configuration();
     deviceConfig.keyboard = Configuration.KEYBOARD_NOKEYS;
     deviceConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
@@ -2052,8 +2036,8 @@
     selectionTracker.onConfigurationChanged();
 
     sessionExecutor.resetContext();
-    sessionExecutor.setImposedConfig(expectedConfig);
-    sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+    sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+                                    isA(CompositionMode.class),
                                     anyObject(EvaluationCallback.class));
     expectLastCall().asStub();
     sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
@@ -2189,23 +2173,18 @@
       }
     }
     TestData[] testDataList = {
-        new TestData((InputType.TYPE_CLASS_TEXT |
-                      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD),
+        new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD),
                      InputFieldType.PASSWORD),
-        new TestData((InputType.TYPE_CLASS_TEXT |
-                      InputType.TYPE_TEXT_VARIATION_URI |
-                      InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE),
+        new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI
+                      | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE),
                      InputFieldType.NORMAL),
-        new TestData((InputType.TYPE_CLASS_TEXT |
-                      InputType.TYPE_TEXT_VARIATION_PASSWORD |
-                      InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS),
+        new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD
+                      | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS),
                      InputFieldType.PASSWORD),
-        new TestData((InputType.TYPE_CLASS_TEXT |
-                      InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE |
-                      InputType.TYPE_TEXT_FLAG_AUTO_CORRECT),
+        new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE
+                      | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT),
                      InputFieldType.NORMAL),
-        new TestData((InputType.TYPE_CLASS_NUMBER |
-                      InputType.TYPE_NUMBER_FLAG_SIGNED),
+        new TestData((InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED),
                       InputFieldType.NUMBER),
         new TestData(InputType.TYPE_CLASS_PHONE,
                      InputFieldType.TEL),
@@ -2232,28 +2211,21 @@
                   createNiceMock(SymbolHistoryStorage.class),
                   createNiceMock(ImeSwitcher.class),
                   createNiceMock(MenuDialogListener.class))
-        .addMockedMethod("setHardwareKeyboardCompositionMode")
+        .addMockedMethod("switchHardwareKeyboardCompositionMode")
         .createMock();
-    invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
-                           createNiceMock(SessionExecutor.class));
+    invokeOnCreateInternal(
+        service, viewManager, getSharedPreferences(), getDefaultDeviceConfiguration(),
+        createNiceMock(SessionExecutor.class));
     MozcView mozcView = viewManager.createMozcView(context);
-    HardwareKeyboard hardwareKeyboard = createMockBuilder(HardwareKeyboard.class)
-        .addMockedMethods("setCompositionMode", "getCompositionMode").createMock();
-    service.hardwareKeyboard = hardwareKeyboard;
 
     resetAll();
-    expect(service.isInputViewShown()).andStubReturn(true);
 
-    hardwareKeyboard.setCompositionMode(CompositionSwitchMode.TOGGLE);
-    // As current composition mode
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
-    // As updated composition mode
-    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
-    viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HIRAGANA);
+    expect(service.isInputViewShown()).andStubReturn(true);
+    viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
 
     replayAll();
 
-    mozcView.getHardwareCompositionButton().performClick();
+    mozcView.findViewById(R.id.hardware_composition_button).performClick();
 
     verifyAll();
   }
@@ -2264,52 +2236,46 @@
         getInstrumentation().getTargetContext(),
         createNiceMock(ViewEventListener.class));
     MozcService service = createService();
-    invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
-                           createNiceMock(SessionExecutor.class));
+
+    resetAll();
+    SessionExecutor sessionExecutorMock = createNiceMock(SessionExecutor.class);
+    expect(viewManager.isNarrowMode()).andStubReturn(false);
+    expect(viewManager.isFloatingCandidateMode()).andStubReturn(false);
+    viewManager.onConfigurationChanged(anyObject(Configuration.class));
+    replayAll();
+    invokeOnCreateInternal(
+        service, viewManager, null, getDefaultDeviceConfiguration(), sessionExecutorMock);
+    verifyAll();
 
     Configuration configuration = new Configuration();
 
     resetAll();
-
     expect(viewManager.isNarrowMode()).andReturn(false);
     expect(viewManager.hideSubInputView()).andReturn(true);
     viewManager.setNarrowMode(true);
-
     replayAll();
-
     configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
     service.maybeSetNarrowMode(configuration);
-
     verifyAll();
 
     resetAll();
-
     expect(viewManager.isNarrowMode()).andReturn(true);
     viewManager.setNarrowMode(false);
-
     replayAll();
-
     configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
     service.maybeSetNarrowMode(configuration);
-
     verifyAll();
 
     resetAll();
-
     replayAll();
-
     configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
     service.maybeSetNarrowMode(configuration);
-
     verifyAll();
 
     resetAll();
-
     replayAll();
-
     configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_UNDEFINED;
     service.maybeSetNarrowMode(configuration);
-
     verifyAll();
   }
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
index 8217b56..59be1ee 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
@@ -29,26 +29,45 @@
 
 package org.mozc.android.inputmethod.japanese;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import static org.easymock.EasyMock.expect;
+
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import com.google.protobuf.ByteString;
 
 import android.content.Context;
 import android.content.res.Configuration;
-import android.test.InstrumentationTestCase;
 import android.test.mock.MockContext;
+import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.InputType;
 import android.view.inputmethod.EditorInfo;
 
 /**
  */
-public class MozcUtilTest extends InstrumentationTestCase {
+public class MozcUtilTest extends InstrumentationTestCaseWithMock {
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    clearnUpMozcUtil();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    clearnUpMozcUtil();
+    super.tearDown();
+  }
+
+  private void clearnUpMozcUtil() {
+    MozcUtil.setSystemApplication(Optional.<Boolean>absent());
+    MozcUtil.setUpdatedSystemApplication(Optional.<Boolean>absent());
+  }
+
   @SmallTest
   public void testIsDevChannel() {
     class TestData extends Parameter {
@@ -90,82 +109,41 @@
   @SmallTest
   public void testGetRequest() {
     Configuration configuration = new Configuration();
+    int floatingCandidatePageSize = 9;
+    MockResources mockResources = createNiceMock(MockResources.class);
+    resetAll();
+    expect(mockResources.getInteger(R.integer.floating_candidate_candidate_num)).andStubReturn(
+        floatingCandidatePageSize);
+    replayAll();
+
     for (KeyboardSpecification specification : KeyboardSpecification.values()) {
       for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
                                         Configuration.ORIENTATION_LANDSCAPE}) {
         configuration.orientation = orientation;
-        Request request = MozcUtil.getRequestForKeyboard(
-            specification.getKeyboardSpecificationName(),
-            Optional.of(specification.getSpecialRomanjiTable()),
-            Optional.of(specification.getSpaceOnAlphanumeric()),
-            Optional.of(specification.isKanaModifierInsensitiveConversion()),
-            Optional.of(specification.getCrossingEdgeBehavior()),
-            configuration);
+        Request request =
+            MozcUtil.getRequestBuilder(mockResources, specification, configuration).build();
         assertEquals(specification.getKeyboardSpecificationName()
                          .formattedKeyboardName(configuration),
                      request.getKeyboardName());
         assertEquals(specification.getSpecialRomanjiTable(), request.getSpecialRomanjiTable());
         assertEquals(specification.getSpaceOnAlphanumeric(), request.getSpaceOnAlphanumeric());
+
+        if (specification.isHardwareKeyboard()) {
+          assertFalse(request.getMixedConversion());
+          assertFalse(request.getZeroQuerySuggestion());
+          assertTrue(request.getUpdateInputModeFromSurroundingText());
+          assertFalse(request.getAutoPartialSuggestion());
+          assertEquals(floatingCandidatePageSize, request.getCandidatePageSize());
+        } else {
+          assertTrue(request.getMixedConversion());
+          assertTrue(request.getZeroQuerySuggestion());
+          assertFalse(request.getUpdateInputModeFromSurroundingText());
+          assertTrue(request.getAutoPartialSuggestion());
+        }
       }
     }
-  }
 
-  @SmallTest
-  public void testGetRequest_pseudoKeyboards() {
-    Configuration configuration = new Configuration();
-    {
-      Request request =
-          MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
-                                         Optional.of(SpecialRomanjiTable.DEFAULT_TABLE),
-                                         Optional.<SpaceOnAlphanumeric>absent(),
-                                         Optional.<Boolean>absent(),
-                                         Optional.<CrossingEdgeBehavior>absent(),
-                                         configuration);
-      assertEquals(SpecialRomanjiTable.DEFAULT_TABLE, request.getSpecialRomanjiTable());
-      assertFalse(request.hasSpaceOnAlphanumeric());
-      assertFalse(request.hasKanaModifierInsensitiveConversion());
-      assertFalse(request.hasCrossingEdgeBehavior());
-    }
-    {
-      Request request =
-          MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
-                                         Optional.<SpecialRomanjiTable>absent(),
-                                         Optional.of(SpaceOnAlphanumeric.COMMIT),
-                                         Optional.<Boolean>absent(),
-                                         Optional.<CrossingEdgeBehavior>absent(),
-                                         configuration);
-      assertFalse(request.hasSpecialRomanjiTable());
-      assertEquals(SpaceOnAlphanumeric.COMMIT, request.getSpaceOnAlphanumeric());
-      assertFalse(request.hasKanaModifierInsensitiveConversion());
-      assertFalse(request.hasCrossingEdgeBehavior());
-    }
-    {
-      Request request =
-          MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
-                                         Optional.<SpecialRomanjiTable>absent(),
-                                         Optional.<SpaceOnAlphanumeric>absent(),
-                                         Optional.of(Boolean.TRUE),
-                                         Optional.<CrossingEdgeBehavior>absent(),
-                                         configuration);
-      assertFalse(request.hasSpaceOnAlphanumeric());
-      assertFalse(request.hasSpecialRomanjiTable());
-      assertTrue(request.getKanaModifierInsensitiveConversion());
-      assertFalse(request.hasCrossingEdgeBehavior());
-    }
-    {
-      Request request =
-          MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
-                                         Optional.<SpecialRomanjiTable>absent(),
-                                         Optional.<SpaceOnAlphanumeric>absent(),
-                                         Optional.<Boolean>absent(),
-                                         Optional.of(CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-                                         configuration);
-      assertFalse(request.hasSpaceOnAlphanumeric());
-      assertFalse(request.hasSpecialRomanjiTable());
-      assertFalse(request.hasKanaModifierInsensitiveConversion());
-      assertEquals(CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING,
-                   request.getCrossingEdgeBehavior());
-    }
+    verifyAll();
   }
 
   @SmallTest
@@ -211,39 +189,7 @@
     };
 
     for (TestData testData : testDataList) {
-      EditorInfo editorInfo = new EditorInfo();
-      editorInfo.inputType = testData.inputType;
-      assertEquals(testData.expectedPasswordField, MozcUtil.isPasswordField(editorInfo));
-    }
-  }
-
-  @SmallTest
-  public void testIsVoiceInputAllowed() {
-    class TestData extends Parameter {
-      final String privateImeOptions;
-      final boolean expectedIsVoiceInputAllowed;
-      TestData(String privateImeOptions, boolean expectedIsVoiceInputAllowed) {
-        this.privateImeOptions = privateImeOptions;
-        this.expectedIsVoiceInputAllowed = expectedIsVoiceInputAllowed;
-      }
-    }
-
-    TestData[] testDataList = {
-        new TestData(null, true),
-        new TestData("", true),
-        new TestData("nnm", true),
-        new TestData("nnm,a", true),
-        new TestData("nm", false),
-        new TestData("a,nm", false),
-        new TestData("nm,b", false),
-        new TestData("a,nm,b", false),
-        new TestData("com.google.android.inputmethod.latin.noMicrophoneKey", false),
-    };
-
-    for (TestData testData : testDataList) {
-      EditorInfo editorInfo = new EditorInfo();
-      editorInfo.privateImeOptions = testData.privateImeOptions;
-      assertEquals(testData.expectedIsVoiceInputAllowed, MozcUtil.isVoiceInputAllowed(editorInfo));
+      assertEquals(testData.expectedPasswordField, MozcUtil.isPasswordField(testData.inputType));
     }
   }
 
@@ -317,4 +263,61 @@
       }
     }
   }
+
+  @SmallTest
+  public void testIsVoiceInputPreferred() {
+    class TestData extends Parameter {
+      final int inputType;
+      final String privateImeOptions;
+      final boolean expectPreffered;
+      TestData(int inputType, String privateImeOptions, boolean expectEligible) {
+        this.inputType = inputType;
+        this.privateImeOptions = Preconditions.checkNotNull(privateImeOptions);
+        this.expectPreffered = expectEligible;
+      }
+    }
+    TestData[] testDataList = {
+        new TestData(0, "", true),
+        new TestData(InputType.TYPE_CLASS_TEXT, "", true),
+        new TestData(InputType.TYPE_CLASS_NUMBER, "", false),
+        new TestData(InputType.TYPE_CLASS_PHONE, "", false),
+        new TestData(InputType.TYPE_CLASS_DATETIME, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_PASSWORD, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS, "", false),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, "", true),
+        new TestData(InputType.TYPE_CLASS_TEXT
+                     | InputType.TYPE_TEXT_VARIATION_URI, "", false),
+        new TestData(0, "a", true),
+        new TestData(0, "nm", false),
+        new TestData(0, "a,nm", false),
+        new TestData(0, "nm,a", false),
+        new TestData(0, "a,nm,a", false),
+        new TestData(0, "com.google.android.inputmethod.latin.noMicrophoneKey", false),
+        new TestData(InputType.TYPE_CLASS_TEXT, "a", true),
+        new TestData(InputType.TYPE_CLASS_NUMBER, "a", false),
+        new TestData(InputType.TYPE_CLASS_PHONE, "a", false),
+        new TestData(InputType.TYPE_CLASS_DATETIME, "a", false),
+        new TestData(InputType.TYPE_CLASS_TEXT, "nm", false),
+        new TestData(InputType.TYPE_CLASS_NUMBER, "nm", false),
+        new TestData(InputType.TYPE_CLASS_PHONE, "nm", false),
+        new TestData(InputType.TYPE_CLASS_DATETIME, "nm", false),
+    };
+
+    EditorInfo editorInfo = new EditorInfo();
+    for (TestData testData : testDataList) {
+      editorInfo.inputType = testData.inputType;
+      editorInfo.privateImeOptions = testData.privateImeOptions;
+      assertEquals(testData.toString(),
+                   testData.expectPreffered, MozcUtil.isVoiceInputPreferred(editorInfo));
+    }
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
index 3ca845a..a0687ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
@@ -29,8 +29,10 @@
 
 package org.mozc.android.inputmethod.japanese;
 
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
 import static org.easymock.EasyMock.anyFloat;
 import static org.easymock.EasyMock.anyInt;
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
@@ -38,37 +40,48 @@
 import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.same;
 
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
 import org.mozc.android.inputmethod.japanese.InOutAnimatedFrameLayout.VisibilityChangeListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.LayoutParamsAnimator.InterpolationListener;
 import org.mozc.android.inputmethod.japanese.MozcView.DimensionPixelSize;
 import org.mozc.android.inputmethod.japanese.MozcView.HeightLinearInterpolationListener;
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
 import org.mozc.android.inputmethod.japanese.keyboard.Row;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.model.SymbolMinorCategory;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
 import org.mozc.android.inputmethod.japanese.ui.SideFrameStubProxy;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.base.Optional;
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.inputmethodservice.InputMethodService.Insets;
+import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
 import android.test.mock.MockResources;
@@ -86,48 +99,60 @@
 import android.widget.LinearLayout.LayoutParams;
 
 import org.easymock.Capture;
+import org.easymock.IMockBuilder;
 
 import java.util.Collections;
+import java.util.EnumSet;
 
 /**
  */
 public class MozcViewTest extends InstrumentationTestCaseWithMock {
 
+  private IMockBuilder<CandidateViewManager> createCandidateViewManagerMockBuilder() {
+    return createMockBuilder(CandidateViewManager.class)
+        .withConstructor(CandidateView.class, FloatingCandidateView.class)
+        .withArgs(createViewMockBuilder(CandidateView.class).createNiceMock(),
+                  createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+  }
+
   @SmallTest
   public void testSetViewEventListener() {
+    Context context = getInstrumentation().getContext();
+
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
     ViewEventListener viewEventListener = createMock(ViewEventListener.class);
     OnClickListener widenButtonClickListener = createMock(OnClickListener.class);
-    CandidateView candidateView = createViewMock(CandidateView.class);
-    candidateView.setViewEventListener(same(viewEventListener), isA(OnClickListener.class));
     SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
-    symbolInputView.setViewEventListener(same(viewEventListener),
-                                         isA(OnClickListener.class));
-    ImageView hardwareCompositionButton = new ImageView(getInstrumentation().getContext());
-    ImageView widenButton = new ImageView(getInstrumentation().getContext());
-
     OnClickListener leftAdjustButtonClickListener = createMock(OnClickListener.class);
     OnClickListener rightAdjustButtonClickListener = createMock(OnClickListener.class);
-
+    OnClickListener mictophoneButtonClickListener = createMock(OnClickListener.class);
+    NarrowFrameView narrowFrameView = createViewMock(NarrowFrameView.class);
+    MozcImageView microphoneButton = new MozcImageView(context);
     MozcView mozcView = createViewMockBuilder(MozcView.class)
         .addMockedMethods(
-            "checkInflated", "getCandidateView", "getSymbolInputView",
-            "getHardwareCompositionButton", "getWidenButton")
+            "checkInflated", "getSymbolInputView", "getNarrowFrame", "getMicrophoneButton")
         .createMock();
+    mozcView.candidateViewManager = candidateViewManager;
+
+    resetAll();
+
+    symbolInputView.setEventListener(
+        same(viewEventListener), isA(OnClickListener.class), isA(OnClickListener.class));
+    candidateViewManager.setEventListener(
+        same(viewEventListener), isA(KeyboardCandidateViewHeightListener.class));
     mozcView.checkInflated();
     expectLastCall().asStub();
-    expect(mozcView.getCandidateView()).andStubReturn(candidateView);
     expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
-    expect(mozcView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
-    expect(mozcView.getWidenButton()).andStubReturn(widenButton);
-    viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
-    widenButtonClickListener.onClick(widenButton);
+    expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+    expect(mozcView.getMicrophoneButton()).andStubReturn(microphoneButton);
+    narrowFrameView.setEventListener(viewEventListener, widenButtonClickListener);
 
     replayAll();
 
     mozcView.setEventListener(viewEventListener, widenButtonClickListener,
-                              leftAdjustButtonClickListener, rightAdjustButtonClickListener);
-    mozcView.getHardwareCompositionButton().performClick();
-    mozcView.getWidenButton().performClick();
+                              leftAdjustButtonClickListener, rightAdjustButtonClickListener,
+                              mictophoneButtonClickListener);
 
     verifyAll();
 
@@ -145,7 +170,7 @@
   public void testSetKeyEventHandler() {
     KeyEventHandler keyEventHandler = new KeyEventHandler(
         Looper.getMainLooper(), createNiceMock(KeyboardActionListener.class), 0, 0, 0);
-    JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+    KeyboardView keyboardView = createViewMock(KeyboardView.class);
     keyboardView.setKeyEventHandler(keyEventHandler);
     SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
     symbolInputView.setKeyEventHandler(keyEventHandler);
@@ -170,11 +195,11 @@
 
   @SmallTest
   public void testGetJapaneseKeyboard() {
-    JapaneseKeyboard keyboard = new JapaneseKeyboard(
+    Keyboard keyboard = new Keyboard(
         Optional.<String>absent(),
         Collections.<Row>emptyList(), 1, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
-    JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
-    expect(keyboardView.getJapaneseKeyboard()).andStubReturn(keyboard);
+    KeyboardView keyboardView = createViewMock(KeyboardView.class);
+    expect(keyboardView.getKeyboard()).andStubReturn(Optional.of(keyboard));
     MozcView mozcView = createViewMockBuilder(MozcView.class)
         .addMockedMethods("checkInflated", "getKeyboardView")
         .createMock();
@@ -184,28 +209,37 @@
 
     replayAll();
 
-    assertSame(keyboard, mozcView.getJapaneseKeyboard());
+    assertSame(keyboard, mozcView.getKeyboard());
 
     verifyAll();
   }
 
   @SmallTest
   public void testSetJapaneseKeyboard() {
-    JapaneseKeyboard keyboard = new JapaneseKeyboard(
+    Keyboard keyboard = new Keyboard(
         Optional.<String>absent(),
         Collections.<Row>emptyList(), 1, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
-    JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
-    keyboardView.setJapaneseKeyboard(keyboard);
+    KeyboardView keyboardView = createViewMock(KeyboardView.class);
+    NarrowFrameView narrowFrame = createViewMock(NarrowFrameView.class);
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createNiceMock();
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("checkInflated", "getKeyboardView")
+        .addMockedMethods("checkInflated", "getKeyboardView", "getNarrowFrame")
         .createMock();
+    mozcView.candidateViewManager = candidateViewManager;
+
+    resetAll();
+
     mozcView.checkInflated();
     expectLastCall().asStub();
     expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
+    expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrame);
+    keyboardView.setKeyboard(keyboard);
+    narrowFrame.setHardwareCompositionButtonImage(CompositionMode.HIRAGANA);
 
     replayAll();
 
-    mozcView.setJapaneseKeyboard(keyboard);
+    mozcView.setKeyboard(keyboard);
 
     verifyAll();
   }
@@ -254,29 +288,48 @@
     }
   }
 
+  @SuppressWarnings("deprecation")
   @SmallTest
   public void testSetSkinType() {
-    CandidateView candidateView = createViewMock(CandidateView.class);
-    JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+    Context context = getInstrumentation().getTargetContext();
+
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
+    KeyboardView keyboardView = createViewMock(KeyboardView.class);
     SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
+    NarrowFrameView narrowFrameView = createViewMock(NarrowFrameView.class);
+    MozcImageView microphoneButton = createViewMock(MozcImageView.class);
+    View separatorView = createViewMock(View.class);
+    View buttonFrame = createViewMock(View.class);
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("checkInflated", "getKeyboardView", "getCandidateView",
-                          "getSymbolInputView")
+        .addMockedMethods("checkInflated", "getKeyboardView", "getSymbolInputView",
+                          "getNarrowFrame", "getMicrophoneButton", "getButtonFrame",
+                          "getMicrophoneButton", "getKeyboardFrameSeparator")
         .createMock();
+    mozcView.candidateViewManager = candidateViewManager;
 
     for (SkinType skinType : SkinType.values()) {
       resetAll();
       mozcView.checkInflated();
       expectLastCall().asStub();
       expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
-      expect(mozcView.getCandidateView()).andStubReturn(candidateView);
       expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
-      keyboardView.setSkinType(skinType);
-      candidateView.setSkinType(skinType);
-      symbolInputView.setSkinType(skinType);
+      expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+      expect(mozcView.getMicrophoneButton()).andStubReturn(microphoneButton);
+      expect(mozcView.getButtonFrame()).andStubReturn(buttonFrame);
+      expect(mozcView.getKeyboardFrameSeparator()).andStubReturn(separatorView);
+      Skin skin = skinType.getSkin(context.getResources());
+      keyboardView.setSkin(skin);
+      candidateViewManager.setSkin(skin);
+      symbolInputView.setSkin(skin);
+      microphoneButton.setSkin(skin);
+      microphoneButton.setBackgroundDrawable(anyObject(Drawable.class));
+      narrowFrameView.setSkin(skin);
+      buttonFrame.setBackgroundDrawable(anyObject(Drawable.class));
+      separatorView.setBackgroundDrawable(anyObject(Drawable.class));
       replayAll();
 
-      mozcView.setSkinType(skinType);
+      mozcView.setSkin(skin);
 
       verifyAll();
     }
@@ -284,18 +337,21 @@
 
   @SmallTest
   public void testSetPopupEnabled() {
-    JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+    KeyboardView keyboardView = createViewMock(KeyboardView.class);
+    SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("checkInflated", "getKeyboardView")
+        .addMockedMethods("checkInflated", "getKeyboardView", "getSymbolInputView")
         .createMock();
 
     boolean parameters[] = { true, false };
     for (boolean popupEnabled : parameters) {
       resetAll();
       keyboardView.setPopupEnabled(popupEnabled);
+      symbolInputView.setPopupEnabled(popupEnabled);
       mozcView.checkInflated();
       expectLastCall().asStub();
       expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
+      expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
       replayAll();
 
       mozcView.setPopupEnabled(popupEnabled);
@@ -304,13 +360,15 @@
     }
   }
 
+  @SuppressWarnings("unchecked")
   @SmallTest
   public void testSetCommand() {
-    CandidateView candidateView = createViewMock(CandidateView.class);
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("checkInflated", "getCandidateView", "startCandidateViewInAnimation",
-                          "startCandidateViewOutAnimation")
+        .addMockedMethods("checkInflated", "updateMetaStatesBasedOnOutput")
         .createMock();
+    mozcView.candidateViewManager = candidateViewManager;
 
     // Set non-empty command.
     {
@@ -320,11 +378,11 @@
                   .addCandidates(CandidateWord.getDefaultInstance())))
           .buildPartial();
 
-      candidateView.update(command);
-      mozcView.startCandidateViewInAnimation();
+      resetAll();
+      candidateViewManager.update(command);
       mozcView.checkInflated();
       expectLastCall().asStub();
-      expect(mozcView.getCandidateView()).andStubReturn(candidateView);
+      mozcView.updateMetaStatesBasedOnOutput(anyObject(Output.class));
       replayAll();
 
       mozcView.setCommand(command);
@@ -334,20 +392,64 @@
 
     // Set empty command.
     {
+      Command emptyCommand = Command.getDefaultInstance();
+
       resetAll();
-      mozcView.startCandidateViewOutAnimation();
       mozcView.checkInflated();
       expectLastCall().asStub();
-      expect(mozcView.getCandidateView()).andStubReturn(candidateView);
+      candidateViewManager.update(emptyCommand);
+      mozcView.updateMetaStatesBasedOnOutput(anyObject(Output.class));
       replayAll();
 
-      mozcView.setCommand(Command.getDefaultInstance());
+      mozcView.setCommand(emptyCommand);
 
       verifyAll();
     }
   }
 
   @SmallTest
+  public void testUpdateMetaStatesBasedOnOutput() {
+    MozcView mozcView = createViewMockBuilder(MozcView.class)
+        .addMockedMethods("getKeyboardView")
+        .createMock();
+    KeyboardView keyboard = createViewMockBuilder(KeyboardView.class)
+        .addMockedMethod("updateMetaStates")
+        .createMock();
+
+    {
+      // No preedit field -> Remove COMPOSING
+      resetAll();
+      keyboard.updateMetaStates(Collections.<MetaState>emptySet(), EnumSet.of(MetaState.COMPOSING));
+      expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+      replayAll();
+      mozcView.updateMetaStatesBasedOnOutput(Output.getDefaultInstance());
+      verifyAll();
+    }
+    {
+      // No segments -> Remove COMPOSING
+      resetAll();
+      keyboard.updateMetaStates(Collections.<MetaState>emptySet(), EnumSet.of(MetaState.COMPOSING));
+      expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+      replayAll();
+      mozcView.updateMetaStatesBasedOnOutput(
+          Output.newBuilder().setPreedit(Preedit.getDefaultInstance()).buildPartial());
+      verifyAll();
+    }
+    {
+      // With segments -> Add COMPOSING
+      resetAll();
+      keyboard.updateMetaStates(EnumSet.of(MetaState.COMPOSING), Collections.<MetaState>emptySet());
+      expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+      replayAll();
+      mozcView.updateMetaStatesBasedOnOutput(
+          Output.newBuilder().setPreedit(Preedit.newBuilder().addSegment(
+              Segment.getDefaultInstance()).buildPartial()).buildPartial());
+      verifyAll();
+    }
+
+  }
+
+  @SmallTest
   public void testReset() {
     LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
     MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
@@ -357,7 +459,6 @@
       keyboardFrame.setVisibility(View.GONE);
       keyboardFrame.getLayoutParams().height = 0;
 
-      mozcView.getCandidateView().startInAnimation();
       mozcView.getSymbolInputView().startInAnimation();
     }
 
@@ -365,26 +466,53 @@
 
     assertEquals(View.VISIBLE, mozcView.getKeyboardFrame().getVisibility());
     assertTrue(mozcView.getKeyboardFrame().getLayoutParams().height > 0);
-
-    assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
-    assertNull(mozcView.getCandidateView().getAnimation());
-
+    assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
     assertEquals(View.GONE, mozcView.getSymbolInputView().getVisibility());
     assertNull(mozcView.getSymbolInputView().getAnimation());
   }
 
   @SmallTest
+  public void testSetGlobeButtonEnabled() {
+    LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
+    MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+
+    assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+    mozcView.setGlobeButtonEnabled(false);
+    assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+    mozcView.setGlobeButtonEnabled(true);
+    assertEquals(EnumSet.of(MetaState.GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+    mozcView.getKeyboardView().updateMetaStates(EnumSet.of(MetaState.ACTION_GO, MetaState.CAPS_LOCK,
+        MetaState.VARIATION_EMAIL_ADDRESS, MetaState.GLOBE), EnumSet.allOf(MetaState.class));
+    mozcView.setGlobeButtonEnabled(false);
+    assertEquals(EnumSet.of(MetaState.NO_GLOBE,
+                            MetaState.ACTION_GO,
+                            MetaState.CAPS_LOCK,
+                            MetaState.VARIATION_EMAIL_ADDRESS),
+                 mozcView.getKeyboardView().getMetaStates());
+    mozcView.setGlobeButtonEnabled(true);
+    assertEquals(EnumSet.of(MetaState.ACTION_GO,
+                            MetaState.CAPS_LOCK,
+                            MetaState.VARIATION_EMAIL_ADDRESS,
+                            MetaState.GLOBE),
+                 mozcView.getKeyboardView().getMetaStates());
+
+    mozcView.reset();
+    assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+  }
+
+  @SmallTest
   public void testGetVisibleViewHeight() {
     Resources resources = getInstrumentation().getTargetContext().getResources();
 
-    int imeWindowHeight =
-        resources.getDimensionPixelSize(R.dimen.ime_window_height)
-        - resources.getDimensionPixelSize(R.dimen.translucent_border_height);
+    int imeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
     int inputFrameHeight =
         resources.getDimensionPixelSize(R.dimen.input_frame_height);
-    int narrowImeWindowHeight =
-        resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height)
-        - resources.getDimensionPixelSize(R.dimen.translucent_border_height);
+    int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
+    int symbolInputFrameHeight = inputFrameHeight + buttonFrameHeight;
+    int narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
     int narrowFrameHeight =
         resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
 
@@ -406,11 +534,11 @@
         // At normal view mode.
         // If both candidate view and symbol input view are hidden, the height of the view
         // equals to input frame height.
-        new TestData(false, View.GONE, View.GONE, inputFrameHeight),
+        new TestData(false, View.GONE, View.GONE, inputFrameHeight + buttonFrameHeight),
         // If either candidate view or symbol input view are visible, the height of the view
         // equals to ime window height.
         new TestData(false, View.VISIBLE, View.GONE, imeWindowHeight),
-        new TestData(false, View.GONE, View.VISIBLE, imeWindowHeight),
+        new TestData(false, View.GONE, View.VISIBLE, symbolInputFrameHeight),
 
         // At narrow view mode.
         // If both candidate view and symbol input view are hidden, the height of the view
@@ -424,9 +552,11 @@
 
     LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
     MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+    mozcView.allowFloatingCandidateMode = false;
     for (TestData testData : testDataList) {
       mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, testData.narrowMode);
-      mozcView.getCandidateView().setVisibility(testData.candidateViewVisibility);
+      mozcView.candidateViewManager.keyboardCandidateView.setVisibility(
+          testData.candidateViewVisibility);
       mozcView.getSymbolInputView().setVisibility(testData.symbolInputViewVisibility);
       assertEquals(testData.toString(),
                    testData.expectedHeight, mozcView.getVisibleViewHeight());
@@ -437,7 +567,6 @@
   public void testSymbolInputViewInitializationLazily() {
     LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
     MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
-    mozcView.isDropShadowExpanded = true;
     SymbolCandidateStorage candidateStorage = createMockBuilder(SymbolCandidateStorage.class)
         .withConstructor(SymbolHistoryStorage.class)
         .withArgs(createMock(SymbolHistoryStorage.class))
@@ -451,7 +580,7 @@
     assertFalse(mozcView.getSymbolInputView().isInflated());
 
     // Once symbol input view is shown, the view (and its children) should be inflated.
-    assertTrue(mozcView.showSymbolInputView());
+    assertTrue(mozcView.showSymbolInputView(Optional.<SymbolMajorCategory>absent()));
     assertTrue(mozcView.getSymbolInputView().isInflated());
 
     // Even after closing the view, the inflation state should be kept.
@@ -463,9 +592,9 @@
   public void testUpdateInputFrameHeight() {
     Resources resources = getInstrumentation().getTargetContext().getResources();
 
-    int shadowHeight = resources.getDimensionPixelSize(R.dimen.translucent_border_height);
     int imeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
     int inputFrameHeight = resources.getDimensionPixelSize(R.dimen.input_frame_height);
+    int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
     int narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
     int narrowFrameHeight =  resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
 
@@ -488,7 +617,7 @@
         // At fullscreen mode and narrow mode
         // If candidate view is hidden, the height of the view
         // equals to narrow frame height.
-        new TestData(true, true, View.GONE, narrowFrameHeight + shadowHeight),
+        new TestData(true, true, View.GONE, narrowFrameHeight),
         // If candidate view is visible, the height of the view
         // equals to narrow ime window height.
         new TestData(true, true, View.VISIBLE, narrowImeWindowHeight),
@@ -496,7 +625,7 @@
         // At fullscreen mode and not narrow mode
         // If candidate view is hidden, the height of the view
         // equals to input frame height.
-        new TestData(true, false, View.GONE, inputFrameHeight + shadowHeight),
+        new TestData(true, false, View.GONE, inputFrameHeight + buttonFrameHeight),
         // If candidate view is visible, the height of the view
         // equals to ime window height.
         new TestData(true, false, View.VISIBLE, imeWindowHeight),
@@ -514,11 +643,13 @@
 
     LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
     MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+    mozcView.allowFloatingCandidateMode = false;
     for (TestData testData : testDataList) {
       mozcView.setFullscreenMode(testData.fullscreenMode);
       mozcView.resetFullscreenMode();
       mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, testData.narrowMode);
-      mozcView.getCandidateView().setVisibility(testData.candidateViewVisibility);
+      mozcView.candidateViewManager.keyboardCandidateView.setVisibility(
+          testData.candidateViewVisibility);
       mozcView.updateInputFrameHeight();
 
       assertEquals(testData.toString(),
@@ -546,24 +677,38 @@
     Context context = getInstrumentation().getTargetContext();
     LayoutInflater inflater = LayoutInflater.from(context);
     MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
+    mozcView.allowFloatingCandidateMode = false;
+    mozcView.candidateViewManager = candidateViewManager;
     View overlayView =  mozcView.getOverlayView();
     LinearLayout textInputFrame = mozcView.getTextInputFrame();
     VisibilityChangeListener onVisibilityChangeListener = mozcView.onVisibilityChangeListener;
 
+    resetAll();
+    candidateViewManager.setOnVisibilityChangeListener(sameOptional(onVisibilityChangeListener));
+    candidateViewManager.setExtractedMode(true);
+    expect(candidateViewManager.isKeyboardCandidateViewVisible()).andStubReturn(false);
+    replayAll();
     mozcView.setFullscreenMode(true);
     mozcView.resetFullscreenMode();
-    assertEquals(0, overlayView.getLayoutParams().height);
+    verifyAll();
+    assertEquals(View.GONE, overlayView.getVisibility());
     assertEquals(FrameLayout.LayoutParams.WRAP_CONTENT, textInputFrame.getLayoutParams().height);
     assertSame(onVisibilityChangeListener,
-               mozcView.getCandidateView().onVisibilityChangeListener);
-    assertSame(onVisibilityChangeListener,
                mozcView.getSymbolInputView().onVisibilityChangeListener);
 
+    resetAll();
+    candidateViewManager.setOnVisibilityChangeListener(
+        Optional.<InOutAnimatedFrameLayout.VisibilityChangeListener>absent());
+    expect(candidateViewManager.isKeyboardCandidateViewVisible()).andStubReturn(false);
+    candidateViewManager.setExtractedMode(false);
+    replayAll();
     mozcView.setFullscreenMode(false);
     mozcView.resetFullscreenMode();
-    assertEquals(LinearLayout.LayoutParams.MATCH_PARENT, overlayView.getLayoutParams().height);
+    verifyAll();
+    assertEquals(View.VISIBLE, overlayView.getVisibility());
     assertEquals(FrameLayout.LayoutParams.MATCH_PARENT, textInputFrame.getLayoutParams().height);
-    assertNull(mozcView.getCandidateView().onVisibilityChangeListener);
     assertNull(mozcView.getSymbolInputView().onVisibilityChangeListener);
   }
 
@@ -588,7 +733,8 @@
     MozcView mozcView =
         MozcView.class.cast(LayoutInflater.from(context).inflate(R.layout.mozc_view, null));
     View keyboardFrame = mozcView.getKeyboardFrame();
-    View inputFrameButton = mozcView.getCandidateView().getInputFrameFoldButton();
+    View inputFrameButton =
+        mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton();
     View narrowFrame = mozcView.getNarrowFrame();
 
     mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, true);
@@ -631,17 +777,23 @@
 
   @SmallTest
   public void testSetLayoutAdjustmentAndNarrowMode() {
+    Context context = getInstrumentation().getTargetContext();
+    Resources resources = context.getResources();
+
     MozcView mozcView = createViewMockBuilder(MozcView.class)
         .addMockedMethods("checkInflated", "getForegroundFrame", "getInputFrameHeight",
                           "updateBackgroundColor", "updateInputFrameHeight", "getSymbolInputView",
-                          "getCandidateView", "getConversionCandidateWordContainerView",
-                          "getKeyboardFrame", "getNarrowFrame", "resetKeyboardFrameVisibility")
+                          "getKeyboardFrame", "getNarrowFrame", "getButtonFrame",
+                          "resetKeyboardFrameVisibility")
         .createMock();
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
+    mozcView.candidateViewManager = candidateViewManager;
     View foreGroundFrame = createViewMockBuilder(View.class)
         .addMockedMethods("getLayoutParams", "setLayoutParams")
         .createMock();
-    View keyboardFrame = new View(getInstrumentation().getTargetContext());
-    FrameLayout narrowFrame = new FrameLayout(getInstrumentation().getTargetContext());
+    View keyboardFrame = new View(context);
+    NarrowFrameView narrowFrameView = new NarrowFrameView(context);
     SideFrameStubProxy leftFrameStubProxy = createMock(SideFrameStubProxy.class);
     SideFrameStubProxy rightFrameStubProxy = createMock(SideFrameStubProxy.class);
     VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
@@ -649,13 +801,7 @@
     SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
         .addMockedMethods("setCandidateTextDimension")
         .createMock();
-    CandidateView candidateView = createViewMockBuilder(CandidateView.class)
-        .addMockedMethods("setCandidateTextDimension", "setNarrowMode")
-        .createMock();
-    ConversionCandidateWordContainerView conversionCandidateWordContainerView =
-        createViewMockBuilder(ConversionCandidateWordContainerView.class)
-            .addMockedMethods("setCandidateTextDimension")
-            .createMock();
+    View buttonFrame = new View(context);
 
     class TestData extends Parameter {
       final LayoutAdjustment layoutAdjustment;
@@ -678,7 +824,6 @@
       }
     }
 
-    Resources resources = getInstrumentation().getTargetContext().getResources();
     int displayWidth = resources.getDisplayMetrics().widthPixels;
     int partialWidth = resources.getDimensionPixelSize(R.dimen.ime_window_partial_width)
         + resources.getDimensionPixelSize(R.dimen.side_frame_width);
@@ -698,6 +843,13 @@
                    displayWidth, Gravity.BOTTOM, View.GONE, View.GONE),
     };
 
+    boolean isCursorAnchorInfoEnabled = Build.VERSION.SDK_INT >= 21;
+    resetAll();
+    candidateViewManager.setAllowFloatingMode(isCursorAnchorInfoEnabled);
+    replayAll();
+    mozcView.setCursorAnchorInfoEnabled(isCursorAnchorInfoEnabled);
+    verifyAll();
+
     for (TestData testData : testDataList) {
       Capture<FrameLayout.LayoutParams> layoutCapture = new Capture<FrameLayout.LayoutParams>();
       resetAll();
@@ -706,19 +858,16 @@
       expect(mozcView.getInputFrameHeight()).andStubReturn(100);
       expect(mozcView.getForegroundFrame()).andReturn(foreGroundFrame);
       expect(foreGroundFrame.getLayoutParams()).andReturn(new FrameLayout.LayoutParams(0, 0));
-      expect(mozcView.getCandidateView()).andStubReturn(candidateView);
       expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
-      expect(mozcView.getConversionCandidateWordContainerView())
-          .andStubReturn(conversionCandidateWordContainerView);
-      candidateView.setCandidateTextDimension(anyFloat(), anyFloat());
-      candidateView.setNarrowMode(testData.narrowMode);
+      candidateViewManager.setCandidateTextDimension(anyFloat(), anyFloat());
+      candidateViewManager.setNarrowMode(testData.narrowMode);
       symbolInputView.setCandidateTextDimension(anyFloat(), anyFloat());
-      conversionCandidateWordContainerView.setCandidateTextDimension(anyFloat());
       foreGroundFrame.setLayoutParams(capture(layoutCapture));
       leftFrameStubProxy.setFrameVisibility(testData.expectLeftFrameVisibility);
       rightFrameStubProxy.setFrameVisibility(testData.expectRightFrameVisibility);
       expect(mozcView.getKeyboardFrame()).andStubReturn(keyboardFrame);
-      expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrame);
+      expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+      expect(mozcView.getButtonFrame()).andStubReturn(buttonFrame);
       if (!testData.narrowMode) {
         mozcView.resetKeyboardFrameVisibility();
       }
@@ -726,8 +875,8 @@
       mozcView.updateBackgroundColor();
 
       replayAll();
-      mozcView.setLayoutAdjustmentAndNarrowMode(testData.layoutAdjustment, testData.narrowMode);
 
+      mozcView.setLayoutAdjustmentAndNarrowMode(testData.layoutAdjustment, testData.narrowMode);
       verifyAll();
       assertEquals(testData.toString(), testData.layoutAdjustment, mozcView.layoutAdjustment);
       assertEquals(testData.toString(),
@@ -735,14 +884,14 @@
       assertEquals(testData.toString(),
                    testData.expectForegroundFrameGravity, layoutCapture.getValue().gravity);
       assertEquals(testData.narrowMode ? View.GONE : View.VISIBLE, keyboardFrame.getVisibility());
-      assertEquals(testData.narrowMode ? View.VISIBLE : View.GONE, narrowFrame.getVisibility());
+      assertEquals(testData.narrowMode ? View.VISIBLE : View.GONE, narrowFrameView.getVisibility());
     }
   }
 
   @SmallTest
   public void testUpdateBackgroundColor() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("getBottomBackground")
+        .addMockedMethods("getBottomBackground", "isFloatingMode")
         .createMock();
 
     View bottomBackground = createViewMockBuilder(View.class)
@@ -756,7 +905,7 @@
 
       final int expectResourceId;
 
-      TestData(boolean fullscreenMode, boolean narrowMode, final boolean isFloatable,
+      TestData(boolean fullscreenMode, boolean narrowMode, boolean isFloatable,
                int expectedResourceId) {
         this.fullscreenMode = fullscreenMode;
         this.narrowMode = narrowMode;
@@ -872,11 +1021,10 @@
   }
 
   @SmallTest
-  public void testExpandDropShadowAndBackground() {
+  public void testExpandBottomBackgroundView() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("getDropShadowTop", "getBottomBackground")
+        .addMockedMethods("getBottomBackground")
         .createMock();
-    View dropShadowTop = createViewMock(View.class);
     View bottomBackground = createViewMockBuilder(View.class)
         .addMockedMethods("getLayoutParams", "setLayoutParams")
         .createMock();
@@ -884,45 +1032,34 @@
     SideFrameStubProxy rightFrameStubProxy = createMock(SideFrameStubProxy.class);
     VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
     VisibilityProxy.setField(mozcView, "rightFrameStubProxy", rightFrameStubProxy);
-    Resources resources = getInstrumentation().getTargetContext().getResources();
     int imeWindowHeight = 100;
 
     {
       resetAll();
       mozcView.imeWindowHeight = imeWindowHeight;
-      expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
       expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
-      leftFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
-      rightFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
-      dropShadowTop.setVisibility(View.VISIBLE);
       expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
       Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
       bottomBackground.setLayoutParams(capture(captureBottomBackground));
 
       replayAll();
       mozcView.fullscreenMode = false;
-      mozcView.expandDropShadowAndBackground();
+      mozcView.changeBottomBackgroundHeight(imeWindowHeight);
 
       verifyAll();
-      assertEquals(imeWindowHeight
-                       - resources.getDimensionPixelSize(R.dimen.translucent_border_height),
-                   captureBottomBackground.getValue().height);
+      assertEquals(imeWindowHeight, captureBottomBackground.getValue().height);
     }
     {
       resetAll();
       mozcView.imeWindowHeight = imeWindowHeight;
-      expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
       expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
-      leftFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
-      rightFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
-      dropShadowTop.setVisibility(View.VISIBLE);
       expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
       Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
       bottomBackground.setLayoutParams(capture(captureBottomBackground));
 
       replayAll();
       mozcView.fullscreenMode = true;
-      mozcView.expandDropShadowAndBackground();
+      mozcView.changeBottomBackgroundHeight(imeWindowHeight);
 
       verifyAll();
       assertEquals(imeWindowHeight, captureBottomBackground.getValue().height);
@@ -930,12 +1067,11 @@
   }
 
   @SmallTest
-  public void testCollapseDropShadowAndBackground() {
+  public void testCollapseBottomBackgroundView() {
     Resources resources = getInstrumentation().getTargetContext().getResources();
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("getDropShadowTop", "getBottomBackground", "getInputFrameHeight")
+        .addMockedMethods("getBottomBackground", "getInputFrameHeight")
         .createMock();
-    View dropShadowTop = createViewMock(View.class);
     View bottomBackground = createViewMockBuilder(View.class)
         .addMockedMethods("getLayoutParams", "setLayoutParams")
         .createMock();
@@ -944,103 +1080,66 @@
     VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
     VisibilityProxy.setField(mozcView, "rightFrameStubProxy", rightFrameStubProxy);
     int inputFrameHeight = 100;
+    int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
 
     {
       resetAll();
       expect(mozcView.getInputFrameHeight()).andStubReturn(inputFrameHeight);
-      expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
       expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
-      leftFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
-      rightFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
-      dropShadowTop.setVisibility(View.INVISIBLE);
       expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
       Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
       bottomBackground.setLayoutParams(capture(captureBottomBackground));
 
       replayAll();
       mozcView.fullscreenMode = false;
-      mozcView.collapseDropShadowAndBackground();
+      mozcView.resetBottomBackgroundHeight();
 
       verifyAll();
-      assertEquals(inputFrameHeight, captureBottomBackground.getValue().height);
+      assertEquals(inputFrameHeight + buttonFrameHeight, captureBottomBackground.getValue().height);
     }
     {
       resetAll();
       expect(mozcView.getInputFrameHeight()).andStubReturn(inputFrameHeight);
-      expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
       expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
-      leftFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
-      rightFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
-      dropShadowTop.setVisibility(View.VISIBLE);
       expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
       Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
       bottomBackground.setLayoutParams(capture(captureBottomBackground));
 
       replayAll();
       mozcView.fullscreenMode = true;
-      mozcView.collapseDropShadowAndBackground();
+      mozcView.resetBottomBackgroundHeight();
 
       verifyAll();
-      assertEquals(inputFrameHeight
-                       + resources.getDimensionPixelSize(R.dimen.translucent_border_height),
-                   captureBottomBackground.getValue().height);
+      assertEquals(inputFrameHeight + buttonFrameHeight, captureBottomBackground.getValue().height);
     }
   }
 
   @SmallTest
   public void testStartAnimation() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("getCandidateView", "getSymbolInputView",
-                          "expandDropShadowAndBackground", "collapseDropShadowAndBackground",
-                          "startDropShadowAnimation")
+        .addMockedMethods("getSymbolInputView",
+                          "changeBottomBackgroundHeight", "resetBottomBackgroundHeight")
         .createMock();
-    CandidateView candidateView = createViewMockBuilder(CandidateView.class)
-        .addMockedMethods("startInAnimation", "startOutAnimation", "getVisibility")
-        .createMock();
+    CandidateViewManager candidateViewManager =
+        createCandidateViewManagerMockBuilder().createMock();
+    mozcView.candidateViewManager = candidateViewManager;
     SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
         .addMockedMethods("startInAnimation", "startOutAnimation", "getVisibility")
         .createMock();
 
-    Animation candidateViewInAnimation = createMock(Animation.class);
-    Animation candidateViewOutAnimation = createMock(Animation.class);
     Animation symbolInputViewInAnimation = createMock(Animation.class);
     Animation symbolInputViewOutAnimation = createMock(Animation.class);
-    Animation dropShadowCandidateViewInAnimation = createMock(Animation.class);
-    Animation dropShadowCandidateViewOutAnimation = createMock(Animation.class);
-    Animation dropShadowSymbolInputViewInAnimation = createMock(Animation.class);
-    Animation dropShadowSymbolInputViewOutAnimation = createMock(Animation.class);
-    mozcView.candidateViewInAnimation = candidateViewInAnimation;
-    mozcView.candidateViewOutAnimation = candidateViewOutAnimation;
     mozcView.symbolInputViewInAnimation = symbolInputViewInAnimation;
     mozcView.symbolInputViewOutAnimation = symbolInputViewOutAnimation;
-    mozcView.dropShadowCandidateViewInAnimation = dropShadowCandidateViewInAnimation;
-    mozcView.dropShadowCandidateViewOutAnimation = dropShadowCandidateViewOutAnimation;
-    mozcView.dropShadowSymbolInputViewInAnimation = dropShadowSymbolInputViewInAnimation;
-    mozcView.dropShadowSymbolInputViewOutAnimation = dropShadowSymbolInputViewOutAnimation;
 
     // Test startCandidateViewInAnimation.
     {
       resetAll();
-      mozcView.isDropShadowExpanded = true;
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      candidateView.startInAnimation();
+      mozcView.imeWindowHeight = 100;
+      mozcView.changeBottomBackgroundHeight(100);
 
       replayAll();
-      mozcView.startCandidateViewInAnimation();
-
-      verifyAll();
-    }
-    {
-      resetAll();
-      mozcView.isDropShadowExpanded = false;
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      candidateView.startInAnimation();
-      mozcView.expandDropShadowAndBackground();
-      mozcView.startDropShadowAnimation(candidateViewInAnimation,
-                                        dropShadowCandidateViewInAnimation);
-
-      replayAll();
-      mozcView.startCandidateViewInAnimation();
+      mozcView.softwareKeyboardHeightListener.onExpanded();
 
       verifyAll();
     }
@@ -1048,29 +1147,22 @@
     // Test startCandidateViewOutAnimation.
     {
       resetAll();
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      candidateView.startOutAnimation();
       expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
       expect(symbolInputView.getVisibility()).andReturn(View.VISIBLE);
 
       replayAll();
-      mozcView.startCandidateViewOutAnimation();
+      mozcView.softwareKeyboardHeightListener.onCollapse();
 
       verifyAll();
     }
     {
       resetAll();
-      mozcView.isDropShadowExpanded = true;
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      candidateView.startOutAnimation();
       expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
       expect(symbolInputView.getVisibility()).andReturn(View.INVISIBLE);
-      mozcView.collapseDropShadowAndBackground();
-      mozcView.startDropShadowAnimation(candidateViewOutAnimation,
-                                        dropShadowCandidateViewOutAnimation);
+      mozcView.resetBottomBackgroundHeight();
 
       replayAll();
-      mozcView.startCandidateViewOutAnimation();
+      mozcView.softwareKeyboardHeightListener.onCollapse();
 
       verifyAll();
     }
@@ -1078,24 +1170,10 @@
     // Test startSymbolInputViewInAnimation.
     {
       resetAll();
-      mozcView.isDropShadowExpanded = true;
       expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
       symbolInputView.startInAnimation();
-
-      replayAll();
-      mozcView.startSymbolInputViewInAnimation();
-
-      verifyAll();
-    }
-    {
-      resetAll();
-      mozcView.isDropShadowExpanded = false;
-      expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
-      symbolInputView.startInAnimation();
-
-      mozcView.expandDropShadowAndBackground();
-      mozcView.startDropShadowAnimation(symbolInputViewInAnimation,
-                                        dropShadowSymbolInputViewInAnimation);
+      mozcView.symbolInputViewHeight = 200;
+      mozcView.changeBottomBackgroundHeight(200);
 
       replayAll();
       mozcView.startSymbolInputViewInAnimation();
@@ -1108,24 +1186,8 @@
       resetAll();
       expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
       symbolInputView.startOutAnimation();
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      expect(candidateView.getVisibility()).andReturn(View.VISIBLE);
-
-      replayAll();
-      mozcView.startSymbolInputViewOutAnimation();
-
-      verifyAll();
-    }
-    {
-      resetAll();
-      mozcView.isDropShadowExpanded = true;
-      expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
-      symbolInputView.startOutAnimation();
-      expect(mozcView.getCandidateView()).andReturn(candidateView);
-      expect(candidateView.getVisibility()).andReturn(View.INVISIBLE);
-      mozcView.collapseDropShadowAndBackground();
-      mozcView.startDropShadowAnimation(symbolInputViewOutAnimation,
-                                        dropShadowSymbolInputViewOutAnimation);
+      expect(candidateViewManager.isKeyboardCandidateViewVisible()).andReturn(false);
+      mozcView.resetBottomBackgroundHeight();
 
       replayAll();
       mozcView.startSymbolInputViewOutAnimation();
@@ -1137,15 +1199,15 @@
   @SmallTest
   public void testSetKeyboardHeight() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("checkInflated", "getResources",
+        .addMockedMethods("checkInflated", "getSymbolInputView",
                           "updateInputFrameHeight", "resetHeightDependingComponents")
         .createMock();
-    Resources resources = createMock(MockResources.class);
+    SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
+        .addMockedMethods("setVerticalDimension")
+        .createMock();
     mozcView.checkInflated();
-    expect(mozcView.getResources()).andStubReturn(resources);
-    expect(resources.getDimensionPixelSize(R.dimen.ime_window_height)).andStubReturn(300);
-    expect(resources.getDimensionPixelSize(R.dimen.input_frame_height)).andStubReturn(200);
-    createViewMock(SymbolInputView.class);
+    expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
+    symbolInputView.setVerticalDimension(anyInt(), eq(1.2f, 1e-5f));
     mozcView.updateInputFrameHeight();
     mozcView.resetHeightDependingComponents();
 
@@ -1153,8 +1215,11 @@
     mozcView.setKeyboardHeightRatio(120);
 
     verifyAll();
-    assertEquals(360, mozcView.imeWindowHeight);
-    assertEquals(240, mozcView.getInputFrameHeight());
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    float originalImeWindowHeight = resources.getDimension(R.dimen.ime_window_height);
+    float originalInputFrameHeight = resources.getDimension(R.dimen.input_frame_height);
+    assertEquals(Math.round(originalImeWindowHeight * 1.2f), mozcView.imeWindowHeight);
+    assertEquals(Math.round(originalInputFrameHeight * 1.2f), mozcView.getInputFrameHeight());
   }
 
   @SmallTest
@@ -1171,26 +1236,16 @@
     // Not inflated.
     assertNotNull(mozcView.findViewById(R.id.stub_left_frame));
     assertNull(mozcView.findViewById(R.id.left_frame));
-    assertNull(mozcView.findViewById(R.id.dropshadow_left_short_top));
-    assertNull(mozcView.findViewById(R.id.dropshadow_left_long_top));
     assertNull(mozcView.findViewById(R.id.left_adjust_button));
-    assertNull(mozcView.findViewById(R.id.left_dropshadow_short));
-    assertNull(mozcView.findViewById(R.id.left_dropshadow_long));
     assertFalse(sideFrameStubProxy.inflated);
     sideFrameStubProxy.setButtonOnClickListener(buttonClickListener);
-    sideFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
-    sideFrameStubProxy.setDropShadowHeight(3, 4);
     sideFrameStubProxy.resetAdjustButtonBottomMargin(100);
 
     // Inflate.
     sideFrameStubProxy.setFrameVisibility(View.VISIBLE);
     assertNull(mozcView.findViewById(R.id.stub_left_frame));
     assertNotNull(mozcView.findViewById(R.id.left_frame));
-    assertNotNull(mozcView.findViewById(R.id.dropshadow_left_short_top));
-    assertNotNull(mozcView.findViewById(R.id.dropshadow_left_long_top));
     assertNotNull(mozcView.findViewById(R.id.left_adjust_button));
-    assertNotNull(mozcView.findViewById(R.id.left_dropshadow_short));
-    assertNotNull(mozcView.findViewById(R.id.left_dropshadow_long));
     assertTrue(sideFrameStubProxy.inflated);
     ImageView imageView = ImageView.class.cast(mozcView.findViewById(R.id.left_adjust_button));
     imageView.performClick();
@@ -1198,33 +1253,16 @@
     FrameLayout.LayoutParams layoutParams = FrameLayout.LayoutParams.class.cast(
         imageView.getLayoutParams());
     assertEquals((100 - layoutParams.height) / 2, layoutParams.bottomMargin);
-    assertEquals(View.VISIBLE, mozcView.findViewById(R.id.left_dropshadow_short).getVisibility());
-    assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_dropshadow_long).getVisibility());
-    assertEquals(3, mozcView.findViewById(R.id.left_dropshadow_short).getLayoutParams().height);
-    assertEquals(4, mozcView.findViewById(R.id.left_dropshadow_long).getLayoutParams().height);
 
     verifyAll();
 
     sideFrameStubProxy.setFrameVisibility(View.INVISIBLE);
-    sideFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
-    sideFrameStubProxy.setDropShadowHeight(5, 6);
-    Animation animation1 = createNiceMock(Animation.class);
-    Animation animation2 = createNiceMock(Animation.class);
-    sideFrameStubProxy.startDropShadowAnimation(animation1, animation2);
-
     assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_frame).getVisibility());
-    assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_dropshadow_short).getVisibility());
-    assertEquals(View.VISIBLE, mozcView.findViewById(R.id.left_dropshadow_long).getVisibility());
-    assertEquals(5, mozcView.findViewById(R.id.left_dropshadow_short).getLayoutParams().height);
-    assertEquals(6, mozcView.findViewById(R.id.left_dropshadow_long).getLayoutParams().height);
-    assertEquals(animation1, mozcView.findViewById(R.id.left_dropshadow_short).getAnimation());
-    assertEquals(animation2, mozcView.findViewById(R.id.left_dropshadow_long).getAnimation());
   }
 
   @SmallTest
   public void testCandidateViewListener() {
     ViewEventListener eventListener = createMock(ViewEventListener.class);
-
     View keyboardView = new View(getInstrumentation().getTargetContext());
 
     android.view.animation.Interpolator foldKeyboardViewInterpolator =
@@ -1239,15 +1277,16 @@
     Capture<InterpolationListener> interpolationListenerCapture =
         new Capture<InterpolationListener>();
     MozcView mozcView = createViewMock(MozcView.class);
+    mozcView.viewEventListener = eventListener;
     CompoundButton inputFrameFoldButton = createViewMock(CompoundButton.class);
 
     MozcView.InputFrameFoldButtonClickListener candidateViewListener =
         mozcView.new InputFrameFoldButtonClickListener(
-            eventListener, keyboardView,
-            300, foldKeyboardViewInterpolator, 400, expandKeyboardViewInterpolator,
-            layoutParamsAnimator);
+            keyboardView, 200, 300L, foldKeyboardViewInterpolator,
+            400L, expandKeyboardViewInterpolator, layoutParamsAnimator);
 
     {
+      resetAll();
       keyboardView.layout(0, 0, 250, 200);
       eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
       layoutParamsAnimator.startAnimation(same(keyboardView), capture(interpolationListenerCapture),
@@ -1276,9 +1315,9 @@
       interpolationListenerCapture.reset();
       eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
       inputFrameFoldButton.setChecked(false);
-
       layoutParamsAnimator.startAnimation(same(keyboardView), capture(interpolationListenerCapture),
           same(expandKeyboardViewInterpolator), eq(400L), eq(0L));
+
       replayAll();
 
       candidateViewListener.onClick(inputFrameFoldButton);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java
new file mode 100644
index 0000000..f5f0ea8
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java
@@ -0,0 +1,109 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import static org.easymock.EasyMock.expect;
+
+import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import org.mozc.android.inputmethod.japanese.view.SkinType;
+
+import android.content.Context;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+/** Test for narrow frame view. */
+public class NarrowFrameViewTest extends InstrumentationTestCaseWithMock {
+
+  @SmallTest
+  public void testSetEventListener() {
+    Context context = getInstrumentation().getTargetContext();
+    NarrowFrameView narrowFrameView = createViewMockBuilder(NarrowFrameView.class)
+        .addMockedMethods("getHardwareCompositionButton", "getWidenButton")
+        .createMock();
+
+    ViewEventListener viewEventListener = createMock(ViewEventListener.class);
+    OnClickListener widenButtonClickListener = createMock(OnClickListener.class);
+    MozcImageView hardwareCompositionButton = new MozcImageView(context);
+    MozcImageView widenButton = new MozcImageView(context);
+
+    resetAll();
+    expect(narrowFrameView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
+    expect(narrowFrameView.getWidenButton()).andStubReturn(widenButton);
+    replayAll();
+    narrowFrameView.setEventListener(viewEventListener, widenButtonClickListener);
+    verifyAll();
+
+    resetAll();
+    viewEventListener.onFireFeedbackEvent(
+        FeedbackEvent.NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN);
+    viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
+    replayAll();
+    hardwareCompositionButton.performClick();
+    verifyAll();
+
+    resetAll();
+    widenButtonClickListener.onClick(widenButton);
+    replayAll();
+    widenButton.performClick();
+    verifyAll();
+  }
+
+  @SuppressWarnings("deprecation")
+  @SmallTest
+  public void testSetSkinType() {
+    Context context = getInstrumentation().getTargetContext();
+    NarrowFrameView narrowFrameView = createViewMockBuilder(NarrowFrameView.class)
+        .addMockedMethods("setBackgroundDrawable", "getHardwareCompositionButton", "getWidenButton",
+                          "getNarrowFrameSeparator")
+        .createMock();
+    MozcImageView hardwareCompositionButton = new MozcImageView(context);
+    MozcImageView widenButton = new MozcImageView(context);
+    Skin skin = SkinType.MATERIAL_DESIGN_LIGHT.getSkin(context.getResources());
+
+    resetAll();
+    expect(narrowFrameView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
+    expect(narrowFrameView.getWidenButton()).andStubReturn(widenButton);
+    expect(narrowFrameView.getNarrowFrameSeparator()).andStubReturn(new View(context));
+    narrowFrameView.setBackgroundDrawable(skin.narrowFrameBackgroundDrawable);
+    replayAll();
+    narrowFrameView.setSkin(skin);
+    verifyAll();
+
+    assertNotSame(DummyDrawable.getInstance(), hardwareCompositionButton.getDrawable());
+    assertNotSame(DummyDrawable.getInstance(), widenButton.getDrawable());
+    assertNotSame(hardwareCompositionButton.getDrawable(), widenButton.getDrawable());
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
index 14ad936..e385daf 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
@@ -40,6 +40,8 @@
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 import android.content.Context;
 import android.content.res.AssetManager;
@@ -63,10 +65,10 @@
     PrimaryKeyCodeConverter primaryKeyCodeConverter = new PrimaryKeyCodeConverter(context);
 
     // Invalid Keycode.
-    ProtoCommands.KeyEvent keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
+    Optional<ProtoCommands.KeyEvent> keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
         Integer.MIN_VALUE, Collections.<TouchEvent>emptyList());
 
-    assertNull(keyEvent);
+    assertFalse(keyEvent.isPresent());
   }
 
   @SmallTest
@@ -85,16 +87,16 @@
 
     class TestData extends Parameter {
       final int keyCode;
-      final List<? extends TouchEvent> touchEventList;
+      final List<TouchEvent> touchEventList;
       final ProtoCommands.KeyEvent expectKeyEvent;
       final int expectKeyCode;
 
       TestData(
-          int keyCode, List<? extends TouchEvent> touchEventList,
+          int keyCode, List<TouchEvent> touchEventList,
           ProtoCommands.KeyEvent expectKeyEvent, int expectKeyCode) {
         this.keyCode = keyCode;
-        this.touchEventList = touchEventList;
-        this.expectKeyEvent = expectKeyEvent;
+        this.touchEventList = Preconditions.checkNotNull(touchEventList);
+        this.expectKeyEvent = Preconditions.checkNotNull(expectKeyEvent);
         this.expectKeyCode = expectKeyCode;
       }
     }
@@ -104,32 +106,32 @@
     TestData[] testDataList = {
         // White space.
         new TestData(
-            ' ', null,
+            ' ', Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.SPACE).build(),
             KeyEvent.KEYCODE_SPACE),
         // Enter.
         new TestData(
-            resources.getInteger(R.integer.key_enter), null,
+            resources.getInteger(R.integer.key_enter), Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_ENTER).build(),
             KeyEvent.KEYCODE_ENTER),
         // Delete.
         new TestData(
-            resources.getInteger(R.integer.key_backspace), null,
+            resources.getInteger(R.integer.key_backspace), Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.BACKSPACE).build(),
             KeyEvent.KEYCODE_DEL),
         // Left.
         new TestData(
-            resources.getInteger(R.integer.key_left), null,
+            resources.getInteger(R.integer.key_left), Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_LEFT).build(),
             KeyEvent.KEYCODE_DPAD_LEFT),
         // Right.
         new TestData(
-            resources.getInteger(R.integer.key_right), null,
+            resources.getInteger(R.integer.key_right), Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_RIGHT).build(),
             KeyEvent.KEYCODE_DPAD_RIGHT),
         // Normal character with no correction stats.
         new TestData(
-            'a', null,
+            'a', Collections.<TouchEvent>emptyList(),
             ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build(),
             KeyEvent.KEYCODE_A),
         // Normal character with correction stats.
@@ -155,9 +157,9 @@
     replayAll();
 
     for (TestData testData : testDataList) {
-      ProtoCommands.KeyEvent keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
+      Optional<ProtoCommands.KeyEvent> keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
           testData.keyCode, testData.touchEventList);
-      assertEquals(testData.toString(), testData.expectKeyEvent, keyEvent);
+      assertEquals(testData.toString(), testData.expectKeyEvent, keyEvent.orNull());
 
       KeyEventInterface primaryCodeKeyEvent = primaryKeyCodeConverter.getPrimaryCodeKeyEvent(
           testData.keyCode);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
index fa4b158..65a29fa 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
@@ -47,6 +47,7 @@
 import android.content.Context;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.View;
+import android.view.View.OnClickListener;
 
 import java.util.Collections;
 
@@ -84,7 +85,7 @@
     symbolInputView.sharedPreferences = null;
 
     AlertDialog dialog = createDialogMock(AlertDialog.class);
-    symbolInputView.emojiProviderDialog = dialog;
+    symbolInputView.emojiProviderDialog = Optional.of(dialog);
 
     symbolInputView.maybeInitializeEmojiProviderDialog(context);
     expect(symbolInputView.getWindowToken()).andReturn(null);
@@ -120,14 +121,29 @@
     view.reset();
 
     ViewEventListener listener = createMock(ViewEventListener.class);
-    view.setViewEventListener(listener, null);
+    view.setEventListener(
+        listener, createNiceMock(OnClickListener.class), createNiceMock(OnClickListener.class));
 
     checkConsistency(view);
 
+    // NUMBER
+    resetAll();
+    replayAll();
+
+    view.setMajorCategory(SymbolMajorCategory.NUMBER);
+
+    verifyAll();
+    checkConsistency(view);
+
+    // The others
     for (SymbolMajorCategory category : SymbolMajorCategory.values()) {
+      if (category == SymbolMajorCategory.NUMBER) {
+        continue;
+      }
+
       resetAll();
       expect(historyStorage.getAllHistory(category)).andReturn(Collections.<String>emptyList());
-      listener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+      listener.onSubmitPreedit();
       replayAll();
 
       view.setMajorCategory(category);
@@ -150,14 +166,31 @@
     view.reset();
 
     ViewEventListener listener = createMock(ViewEventListener.class);
-    view.setViewEventListener(listener, null);
+    view.setEventListener(
+        listener, createNiceMock(OnClickListener.class), createNiceMock(OnClickListener.class));
     checkConsistency(view);
+
+    // NUMBER
+    resetAll();
+    replayAll();
+
+    view.setMajorCategory(SymbolMajorCategory.NUMBER);
+
+    verifyAll();
+    checkConsistency(view);
+
+    // The others
     for (final SymbolMajorCategory category : SymbolMajorCategory.values()) {
+      if (category == SymbolMajorCategory.NUMBER) {
+        continue;
+      }
+
       resetAll();
       expect(historyStorage.getAllHistory(category))
           .andReturn(Collections.singletonList(category.name()));
-      listener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+      listener.onFireFeedbackEvent(FeedbackEvent.SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED);
       expectLastCall().asStub();
+      listener.onSubmitPreedit();
       replayAll();
 
       view.setMajorCategory(category);
@@ -181,7 +214,8 @@
     view.setMajorCategory(SymbolMajorCategory.EMOTICON);
 
     ViewEventListener viewEventListener = createMock(ViewEventListener.class);
-    view.setViewEventListener(viewEventListener, null);
+    view.setEventListener(viewEventListener, createNiceMock(OnClickListener.class),
+        createNiceMock(OnClickListener.class));
 
     resetAll();
     viewEventListener.onSymbolCandidateSelected(SymbolMajorCategory.EMOTICON, "(^_^)", true);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
index f6a7517..fb0ee08 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
@@ -31,28 +31,36 @@
 
 import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesKeyEvent;
 import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.same;
 
 import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.MozcView.HeightLinearInterpolationListener;
 import org.mozc.android.inputmethod.japanese.ViewManager.ViewManagerEventListener;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
+import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
 import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
@@ -61,6 +69,7 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ProbableKeyEvent;
@@ -68,12 +77,14 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockWindow;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog;
 import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
 import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
@@ -94,6 +105,9 @@
 import android.view.Window;
 import android.view.inputmethod.EditorInfo;
 
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -133,7 +147,7 @@
     keyboardFrame.setLayoutParams(layoutParams);
 
     // Set the input frame fold button checked.
-    mozcView.getCandidateView().getInputFrameFoldButton().setChecked(true);
+    mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton().setChecked(true);
 
     resetAllToDefault();
 
@@ -145,7 +159,8 @@
     verifyAll();
 
     MoreAsserts.assertNotEqual(0, keyboardFrame.getLayoutParams().height);
-    assertFalse(mozcView.getCandidateView().getInputFrameFoldButton().isChecked());
+    assertFalse(
+        mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton().isChecked());
   }
 
   @SmallTest
@@ -196,15 +211,15 @@
     assertNotNull(mozcView);
 
     // Keyboard instance is correctly registered.
-    JapaneseKeyboardView japaneseKeyboardView = mozcView.getKeyboardView();
-    assertNotNull(japaneseKeyboardView.getJapaneseKeyboard());
+    KeyboardView keyboardView = mozcView.getKeyboardView();
+    assertTrue(keyboardView.getKeyboard().isPresent());
 
     // Make sure layout params.
-    assertEquals(LayoutParams.MATCH_PARENT, japaneseKeyboardView.getLayoutParams().width);
-    assertEquals(LayoutParams.MATCH_PARENT, japaneseKeyboardView.getLayoutParams().height);
+    assertEquals(LayoutParams.MATCH_PARENT, keyboardView.getLayoutParams().width);
+    assertEquals(LayoutParams.MATCH_PARENT, keyboardView.getLayoutParams().height);
 
     // Check visibility
-    assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
+    assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
   }
 
   @SmallTest
@@ -266,7 +281,7 @@
 
     // Render with CandidateView
     MozcView mozcView = viewManager.createMozcView(context);
-    CandidateView candidateView = mozcView.getCandidateView();
+    CandidateView candidateView = mozcView.candidateViewManager.keyboardCandidateView;
     assertNotNull(candidateView);
     CandidateView.ConversionCandidateWordView candidateWordView =
         candidateView.getConversionCandidateWordView();
@@ -321,7 +336,7 @@
       expect(mozcView.getInputFrameHeight()).andStubReturn(200);
       mozcView.setEditorInfo(editorInfo);
       mozcView.setPasswordField(false);
-      mozcView.setJapaneseKeyboard(isA(JapaneseKeyboard.class));
+      mozcView.setKeyboard(isA(Keyboard.class));
       replayAll();
 
       viewManager.setEditorInfo(editorInfo);
@@ -331,6 +346,43 @@
   }
 
   @SmallTest
+  public void testNumberField() {
+    ViewManager viewManager = createViewManager(getInstrumentation().getTargetContext());
+    EditorInfo editorInfo = new EditorInfo();
+
+    editorInfo.inputType = EditorInfo.TYPE_CLASS_DATETIME;
+    viewManager.setEditorInfo(editorInfo);
+    assertEquals(
+        KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+    assertEquals(
+        KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+        viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+    editorInfo.inputType = EditorInfo.TYPE_CLASS_NUMBER;
+    viewManager.setEditorInfo(editorInfo);
+    assertEquals(
+        KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+    assertEquals(
+        KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+        viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+    editorInfo.inputType = EditorInfo.TYPE_CLASS_PHONE;
+    viewManager.setEditorInfo(editorInfo);
+    assertEquals(
+        KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+    assertEquals(
+        KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+        viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+    editorInfo.inputType = EditorInfo.TYPE_CLASS_TEXT;
+    viewManager.setEditorInfo(editorInfo);
+    assertEquals(KeyboardMode.KANA, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+    assertEquals(
+        KeyboardSpecification.HARDWARE_QWERTY_KANA,
+        viewManager.hardwareKeyboard.getKeyboardSpecification());
+  }
+
+  @SmallTest
   public void testHideSubInputView() {
     Context context = getInstrumentation().getTargetContext();
     ViewManager viewManager = createViewManager(context);
@@ -375,13 +427,13 @@
   }
 
   @SmallTest
-  public void testJapaneseKeyboardSwitchEventCallback() {
+  public void testKeyboardSwitchEventCallback() {
     Context context = getInstrumentation().getTargetContext();
     ViewEventListener eventListener = createMock(ViewEventListener.class);
     ViewManager viewManager = createViewManagerWithEventListener(context, eventListener);
 
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 viewManager.getJapaneseKeyboardSpecification());
+                 viewManager.getKeyboardSpecification());
 
     // Make sure that whenever keyboard is changed, the callback should be invoked.
     eventListener.onKeyEvent(null, null, KeyboardSpecification.QWERTY_KANA,
@@ -399,139 +451,157 @@
   }
 
   @SmallTest
-  public void testJapaneseKeyboardSwitching() {
+  public void testKeyboardSwitching() {
     Context context = getInstrumentation().getTargetContext();
     Resources resources = context.getResources();
 
     ViewManager viewManager = createViewManager(context);
     replayAll();
     MozcView mozcView = viewManager.createMozcView(context);
-    JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+    KeyboardView keyboardView = mozcView.getKeyboardView();
+    HardwareKeyboard hardwareKeyboard = viewManager.hardwareKeyboard;
     List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
 
     // The default keyboard is 12key's-"kana"-toggle mode.
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // The default mode is "kana".
     viewManager.setKeyboardLayout(KeyboardLayout.QWERTY);
     assertEquals(KeyboardSpecification.QWERTY_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana_123), touchEventList);
-    assertEquals(KeyboardSpecification.QWERTY_KANA_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.QWERTY_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.QWERTY_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc_123), touchEventList);
-    assertEquals(KeyboardSpecification.QWERTY_ALPHABET_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.QWERTY_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.QWERTY_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Make sure we can return back to 12-keys keyboard.
     viewManager.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Then set to flick mode.
     viewManager.setInputStyle(InputStyle.FLICK);
     assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
-    assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Return back to flick-kana mode.
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Then set to toggle-flick mode.
     viewManager.setInputStyle(InputStyle.TOGGLE_FLICK);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Return back to flick-kana mode.
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Testing for qwerty layout for alphabet mode.
     viewManager.setQwertyLayoutForAlphabet(true);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     // Switching the mode should trigger the alphabet keyboard view switching as well.
     viewManager.setQwertyLayoutForAlphabet(false);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.setQwertyLayoutForAlphabet(true);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc_123), touchEventList);
-    assertEquals(KeyboardSpecification.QWERTY_ALPHABET_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
-
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
 
     viewManager.setQwertyLayoutForAlphabet(false);
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
+    assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+                 hardwareKeyboard.getKeyboardSpecification());
   }
 
   @SmallTest
@@ -549,15 +619,15 @@
   }
 
   @SmallTest
-  public void testSetJapaneseKeyboardStyleForUninitializedKeyboardViewDefault() {
+  public void testSetKeyboardStyleForUninitializedKeyboardViewDefault() {
     Context context = getInstrumentation().getTargetContext();
     ViewManager viewManager = createViewManager(context);
 
     // Make sure keyboard by createInputView is 12keys-kana keyboard by default.
     MozcView mozcView = viewManager.createMozcView(context);
-    JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+    KeyboardView keyboardView = mozcView.getKeyboardView();
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
   }
 
   @SmallTest
@@ -570,9 +640,9 @@
 
     // Make sure the keyboard instance created via createInputView is not default keyboard.
     MozcView mozcView = viewManager.createMozcView(context);
-    JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+    KeyboardView keyboardView = mozcView.getKeyboardView();
     assertEquals(KeyboardSpecification.QWERTY_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
   }
 
   @SmallTest
@@ -585,9 +655,9 @@
 
     // Make sure the keyboard instance created via createInputView is not default keyboard.
     MozcView mozcView = viewManager.createMozcView(context);
-    JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+    KeyboardView keyboardView = mozcView.getKeyboardView();
     assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
   }
 
   @SmallTest
@@ -612,12 +682,12 @@
         .createMock();
     ViewManager viewManager = new ViewManager(
         context, listener, createNiceMock(SymbolHistoryStorage.class),
-        createMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class), guesser);
+        createMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class), guesser,
+        new HardwareKeyboard());
     viewManager.createMozcView(context);
     KeyboardSpecification keyboardSpecification =
-        JapaneseSoftwareKeyboardModel.class.cast(
-            viewManager.japaneseSoftwareKeyboardModel)
-                .getKeyboardSpecification();
+        JapaneseSoftwareKeyboardModel.class.cast(viewManager.getActiveSoftwareKeyboardModel())
+            .getKeyboardSpecification();
 
     Resources resources = context.getResources();
     List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
@@ -644,41 +714,41 @@
     TestData[] testDataList = {
         // White space.
         new TestData(' ',
-                     null,
+                     new ProbableKeyEvent[0],
                      false,
                      ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.SPACE).build(),
                      KeyEvent.KEYCODE_SPACE),
         // Enter.
         new TestData(resources.getInteger(R.integer.key_enter),
-                     null,
+                     new ProbableKeyEvent[0],
                      false,
                      ProtoCommands.KeyEvent.newBuilder()
                          .setSpecialKey(SpecialKey.VIRTUAL_ENTER).build(),
                      KeyEvent.KEYCODE_ENTER),
         // Delete.
         new TestData(resources.getInteger(R.integer.key_backspace),
-                     null,
+                     new ProbableKeyEvent[0],
                      false,
                      ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.BACKSPACE)
                          .build(),
                      KeyEvent.KEYCODE_DEL),
         // Left.
         new TestData(resources.getInteger(R.integer.key_left),
-                     null,
+                     new ProbableKeyEvent[0],
                      false,
                      ProtoCommands.KeyEvent.newBuilder()
                          .setSpecialKey(SpecialKey.VIRTUAL_LEFT).build(),
                      KeyEvent.KEYCODE_DPAD_LEFT),
         // Right.
         new TestData(resources.getInteger(R.integer.key_right),
-                     null,
+                     new ProbableKeyEvent[0],
                      false,
                      ProtoCommands.KeyEvent.newBuilder()
                          .setSpecialKey(SpecialKey.VIRTUAL_RIGHT).build(),
                      KeyEvent.KEYCODE_DPAD_RIGHT),
         // Normal character with no correction stats.
         new TestData('a',
-                     null,
+                     new ProbableKeyEvent[0],
                      true,
                      ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build(),
                      KeyEvent.KEYCODE_A),
@@ -739,26 +809,44 @@
     resetAll();
     List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
     listener.onKeyEvent(null, null,
-                        KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER, touchEventList);
+                        KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET, touchEventList);
     replayAll();
 
     // Make sure the current keyboard is 12keys-toggle-kana mode before sending a key.
-    JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+    KeyboardView keyboardView = mozcView.getKeyboardView();
     assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+                 keyboardView.getKeyboard().get().getSpecification());
 
     // Send key code to switch number keyboard style.
-    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
+    viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
 
     // Make sure actually keyboard style has been changed.
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER,
-                 keyboardView.getJapaneseKeyboard().getSpecification());
+    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+                 keyboardView.getKeyboard().get().getSpecification());
 
     // Make sure that the listener can catch the expected events.
     verifyAll();
   }
 
   @SmallTest
+  public void testOnKeyForGlobeButton() {
+    Context context = getInstrumentation().getTargetContext();
+    ImeSwitcher imeSwitcher = createMock(ImeSwitcher.class);
+
+    ViewManager viewManager = new ViewManager(
+        context, createNiceMock(ViewEventListener.class),
+        createNiceMock(SymbolHistoryStorage.class),
+        imeSwitcher, createNiceMock(MenuDialogListener.class));
+
+    expect(imeSwitcher.switchToNextInputMethod(false)).andReturn(Boolean.TRUE);
+
+    replayAll();
+    viewManager.onKey(context.getResources().getInteger(R.integer.key_globe),
+                      Collections.<TouchEvent>emptyList());
+    verifyAll();
+  }
+
+  @SmallTest
   public void testKeyboardActionAdapter_onKey() {
     Context context = getInstrumentation().getTargetContext();
     List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
@@ -804,7 +892,7 @@
     ViewManager viewManager = createViewManagerWithEventListener(context, listener);
     viewManager.createMozcView(context);
     KeyboardSpecification keyboardSpecification =
-        JapaneseSoftwareKeyboardModel.class.cast(viewManager.japaneseSoftwareKeyboardModel)
+        JapaneseSoftwareKeyboardModel.class.cast(viewManager.getActiveSoftwareKeyboardModel())
             .getKeyboardSpecification();
 
     // Emulate toggling a key.
@@ -883,18 +971,19 @@
       // Add dummy KeyEventContext.
       KeyEventContext keyEventContext =
           new KeyEventContext(
-              new Key(0, 0, 0, 0, 0, 0, false, false, false,
-                      Stick.EVEN, Collections.<KeyState>emptyList()),
+              new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                      Collections.<KeyState>emptyList()),
               0, 0, 0, 0, 0, 0, Collections.<MetaState>emptySet());
       keyEventContextMap.put(0, keyEventContext);
     }
 
-    mozcView.getCandidateView().startInAnimation();
+    mozcView.softwareKeyboardHeightListener.onExpanded();
     mozcView.getSymbolInputView().startInAnimation();
 
     MenuDialog menuDialog = createMockBuilder(MenuDialog.class)
-        .withConstructor(Context.class, Optional.class, boolean.class)
-        .withArgs(context, Optional.of(createNiceMock(MenuDialogListener.class)), false)
+        .withConstructor(Context.class, Optional.class)
+        .withArgs(context, Optional.of(createNiceMock(MenuDialogListener.class)))
         .createMock();
     resetAll();
     viewManager.menuDialog = menuDialog;
@@ -908,9 +997,9 @@
     assertEquals(View.VISIBLE, mozcView.getKeyboardFrame().getVisibility());
     assertEquals(context.getResources().getDimensionPixelSize(R.dimen.input_frame_height),
                  mozcView.getKeyboardFrame().getLayoutParams().height);
-    assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
+    assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
     assertEquals(View.GONE, mozcView.getSymbolInputView().getVisibility());
-    assertNull(mozcView.getCandidateView().getAnimation());
+    assertNull(mozcView.candidateViewManager.keyboardCandidateView.getAnimation());
     assertNull(mozcView.getSymbolInputView().getAnimation());
     assertTrue(keyEventContextMap.isEmpty());
   }
@@ -938,7 +1027,7 @@
 
     Context context = getInstrumentation().getTargetContext();
     ViewManager viewManager = createViewManager(context);
-    Window window = createMockBuilder(Window.class)
+    Window window = createMockBuilder(MockWindow.class)
         .withConstructor(Context.class)
         .withArgs(context)
         .createMock();
@@ -1064,15 +1153,17 @@
   @SmallTest
   public void testSetSkinType() {
     Context context = getInstrumentation().getTargetContext();
+    Resources resources = context.getResources();
     ViewManager viewManager = createViewManager(context);
     MozcView mozcView = viewManager.createMozcView(context);
 
-    viewManager.setSkinType(SkinType.ORANGE_LIGHTGRAY);
-    assertEquals(SkinType.ORANGE_LIGHTGRAY, mozcView.getSkinType());
-    viewManager.setSkinType(SkinType.TEST);
-    assertEquals(SkinType.TEST, mozcView.getSkinType());
+    viewManager.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
+    assertEquals(SkinType.ORANGE_LIGHTGRAY.getSkin(resources), mozcView.getSkin());
+    viewManager.setSkin(SkinType.TEST.getSkin(resources));
+    assertEquals(SkinType.TEST.getSkin(resources), mozcView.getSkin());
   }
 
+  @SmallTest
   public void testMaybeTransitToNarrowMode() {
     Context context = getInstrumentation().getTargetContext();
     ViewManager viewManager = createViewManager(context);
@@ -1089,8 +1180,8 @@
     }
     KeyEventInterface softwareEvent = new KeyEventInterface() {
       @Override
-      public KeyEvent getNativeEvent() {
-        return null;
+      public Optional<KeyEvent> getNativeEvent() {
+        return Optional.absent();
       }
       @Override
       public int getKeyCode() {
@@ -1099,8 +1190,8 @@
     };
     KeyEventInterface hardwareEvent = new KeyEventInterface() {
       @Override
-      public KeyEvent getNativeEvent() {
-        return new KeyEvent(0, 0);
+      public Optional<KeyEvent> getNativeEvent() {
+        return Optional.of(new KeyEvent(0, 0));
       }
       @Override
       public int getKeyCode() {
@@ -1128,8 +1219,8 @@
         .buildPartial();
     TestData[] testDataList = new TestData[] {
         new TestData(noKey, hardwareEvent, false),
-        new TestData(noKeyCode, hardwareEvent, false),
-        new TestData(withModifier, hardwareEvent, false),
+        new TestData(noKeyCode, hardwareEvent, true),
+        new TestData(withModifier, hardwareEvent, true),
         new TestData(printable, null, false),
         new TestData(printable, softwareEvent, false),
         new TestData(printable, hardwareEvent, true),
@@ -1140,4 +1231,201 @@
       assertEquals(testData.expectation, viewManager.isNarrowMode());
     }
   }
+
+  @SmallTest
+  public void testHandleEmojiKey() {
+    Context context = getInstrumentation().getTargetContext();
+    ViewManager viewManager = createViewManager(context);
+    MozcView mozcView = createViewMockBuilder(MozcView.class)
+        .addMockedMethods("showSymbolInputView", "setLayoutAdjustmentAndNarrowMode")
+        .createNiceMock();
+    viewManager.mozcView = mozcView;
+
+    // Disable input device check.
+    // Otherwise, this feature doesn't work except for keyboards which has Emoji key(s).
+    viewManager.viewLayerKeyEventHandler.disableDeviceCheck = true;
+
+    KeyEvent aDown = new KeyEvent(0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0);
+    KeyEvent aUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0);
+    KeyEvent aDownWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, KeyEvent.META_ALT_ON);
+    KeyEvent aUpWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0, KeyEvent.META_ALT_ON);
+    KeyEvent altDown = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+    KeyEvent altUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0);
+    KeyEvent shiftDown = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+    KeyEvent shiftUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT, 0);
+    KeyEvent altDownWithShift = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+    KeyEvent altUpWithShift = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+    KeyEvent shiftDownWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_ALT_ON);
+    KeyEvent shiftUpWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_ALT_ON);
+    KeyEvent altDownWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+    KeyEvent altUpWithAlt = new KeyEvent(
+        0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+
+
+    class TestData extends Parameter {
+      final KeyEvent[] keyEvents;
+      final boolean expectLaunchEmojiPalette;
+      TestData(KeyEvent[] keyEvents, boolean expectLaunchEmojiPalette) {
+        this.keyEvents = Preconditions.checkNotNull(keyEvents);
+        this.expectLaunchEmojiPalette = expectLaunchEmojiPalette;
+      }
+    }
+    TestData[] testDataArray = new TestData[] {
+        new TestData(new KeyEvent[] {altDown, altUp}, true),
+        new TestData(new KeyEvent[] {shiftDown, shiftUp}, false),
+        new TestData(new KeyEvent[] {aDown, aUp}, false),
+
+        new TestData(new KeyEvent[] {altDown, aDownWithAlt, aUpWithAlt, altUp}, false),
+        new TestData(new KeyEvent[] {aDown, altDown, altUp, aUp}, false),
+        new TestData(new KeyEvent[] {altDown, aDownWithAlt, altUp, aUpWithAlt}, false),
+        new TestData(new KeyEvent[] {aDown, altDown, aUpWithAlt, altUp}, false),
+
+        new TestData(new KeyEvent[] {altDown, shiftDownWithAlt, shiftUpWithAlt, altUp}, false),
+        new TestData(new KeyEvent[] {shiftDown, altDownWithShift, altUpWithShift, shiftUp}, false),
+        new TestData(new KeyEvent[] {altDown, shiftDownWithAlt, altUpWithShift, shiftUp}, false),
+        new TestData(new KeyEvent[] {shiftDown, altDownWithShift, shiftUpWithAlt, altUp}, false),
+
+        new TestData(new KeyEvent[] {altDown, altDownWithAlt, altUpWithAlt, altUp}, false),
+    };
+
+    for (TestData testData : testDataArray) {
+      // Key events except for last one should NOT be consumed by view layer.
+      for (int i = 0; i < testData.keyEvents.length - 1; ++i) {
+        assertFalse(viewManager.isKeyConsumedOnViewAsynchronously(testData.keyEvents[i]));
+      }
+
+      KeyEvent lastKeyEvent = testData.keyEvents[testData.keyEvents.length - 1];
+      if (testData.expectLaunchEmojiPalette) {
+        assertTrue(viewManager.isKeyConsumedOnViewAsynchronously(lastKeyEvent));
+        resetAll();
+        expect(mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI)))
+            .andReturn(true);
+        replayAll();
+        viewManager.consumeKeyOnViewSynchronously(lastKeyEvent);
+        verifyAll();
+      } else {
+        assertFalse(viewManager.isKeyConsumedOnViewAsynchronously(lastKeyEvent));
+        resetAll();
+        replayAll();
+        viewManager.consumeKeyOnViewSynchronously(lastKeyEvent);
+        verifyAll();
+      }
+    }
+  }
+
+  @SmallTest
+  public void testOnKeyDownByHardwareKeyboard() {
+    Context context = getInstrumentation().getTargetContext();
+    HardwareKeyboard hardwareKeyboard = createNiceMock(HardwareKeyboard.class);
+    ViewEventListener listener = createMock(ViewEventListener.class);
+    ViewManager viewManager = new ViewManager(
+        context, listener, createNiceMock(SymbolHistoryStorage.class),
+        createNiceMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class),
+        new ProbableKeyEventGuesser(context.getAssets()), hardwareKeyboard);
+
+    MozcView mozcView = createViewMockBuilder(MozcView.class)
+        .addMockedMethods("setKeyboard")
+        .createNiceMock();
+    viewManager.mozcView = mozcView;
+
+    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
+    ProtoCommands.KeyEvent mozcKeyEvent =
+        ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
+    KeyEventInterface keyEventInterface = KeycodeConverter.getKeyEventInterface(event);
+    KeyboardSpecification keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
+
+    resetAll();
+
+    expect(hardwareKeyboard.getCompositionMode()).andStubReturn(CompositionMode.HIRAGANA);
+    expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
+    expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
+    expect(hardwareKeyboard.getKeyEventInterface(event)).andReturn(keyEventInterface);
+    expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
+    listener.onKeyEvent(
+        same(mozcKeyEvent), same(keyEventInterface), same(keyboardSpecification),
+        eq(Collections.<TouchEvent>emptyList()));
+
+    replayAll();
+    viewManager.onHardwareKeyEvent(event);
+    verifyAll();
+
+    resetAll();
+
+    keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_ALPHABET;
+    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
+    expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
+    expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
+    expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
+    expect(hardwareKeyboard.getKeyEventInterface(event)).andReturn(keyEventInterface);
+    expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
+    Capture<Keyboard> keyboardCapture = new Capture<Keyboard>();
+    mozcView.setKeyboard(capture(keyboardCapture));
+    listener.onKeyEvent(
+        same(mozcKeyEvent), same(keyEventInterface), same(keyboardSpecification),
+        eq(Collections.<TouchEvent>emptyList()));
+
+    replayAll();
+    viewManager.onHardwareKeyEvent(event);
+    verifyAll();
+    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+                 keyboardCapture.getValue().getSpecification());
+  }
+
+  @SmallTest
+  public void testSwitchHardwareKeyboardCompositionMode() {
+    Context context = getInstrumentation().getTargetContext();
+    ViewEventListener listener = createMock(ViewEventListener.class);
+    ViewManager viewManager = createViewManagerWithEventListener(context, listener);
+
+    // Set KANA as a initial composition mode without MozcView.
+    viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.KANA);
+
+    MozcView mozcView = createViewMockBuilder(MozcView.class)
+        .addMockedMethods("setKeyboard")
+        .createNiceMock();
+    viewManager.mozcView = mozcView;
+
+    Capture<Keyboard> keyboardCapture = new Capture<Keyboard>();
+
+    // HIRAGANA to HIRAGANA by CompositionSwitchMode.KANA.
+    resetAll();
+    replayAll();
+    viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.KANA);
+    verifyAll();
+
+    // HIRAGANA to HALF_ASCII by CompositionSwitchMode.HALF_ASCII.
+    resetAll();
+    mozcView.setKeyboard(capture(keyboardCapture));
+    listener.onKeyEvent(EasyMock.<ProtoCommands.KeyEvent>isNull(),
+                        EasyMock.<KeyEventInterface>isNull(),
+                        same(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET),
+                        eq(Collections.<TouchEvent>emptyList()));
+    replayAll();
+    viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.ALPHABET);
+    verifyAll();
+    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+        keyboardCapture.getValue().getSpecification());
+
+    // HALF_ASCII to HIRAGANA by CompositionSwitchMode.TOGGLE.
+    resetAll();
+    mozcView.setKeyboard(capture(keyboardCapture));
+    listener.onKeyEvent(EasyMock.<ProtoCommands.KeyEvent>isNull(),
+                        EasyMock.<KeyEventInterface>isNull(),
+                        same(KeyboardSpecification.HARDWARE_QWERTY_KANA),
+                        eq(Collections.<TouchEvent>emptyList()));
+    replayAll();
+    viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
+    verifyAll();
+    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+                 keyboardCapture.getValue().getSpecification());
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
index 87d8357..fc3eb38 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
@@ -34,23 +34,21 @@
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 
+import org.mozc.android.inputmethod.japanese.accessibility.KeyboardAccessibilityDelegate.TouchEventEmulator;
 import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
 import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
 import com.google.common.base.Optional;
 
 import android.content.Context;
-import android.os.Looper;
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -88,8 +86,8 @@
   private static Optional<Key> createOptionalKey() {
     // Currently following values are not used.
     KeyEntity keyEntity =
-        new KeyEntity(SOURCE_ID, KEY_CODE, LONGPRESS_KEY_CODE, 0,
-                      DrawableType.TWELVEKEYS_CENTER_FLICK, false, null);
+        new KeyEntity(SOURCE_ID, KEY_CODE, LONGPRESS_KEY_CODE, true, 0,
+                      Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
     Flick flick = new Flick(Direction.CENTER, keyEntity);
     List<KeyState> keyStates =
         Collections.singletonList(
@@ -98,8 +96,8 @@
                          Collections.<MetaState>emptySet(),
                          Collections.<MetaState>emptySet(),
                          Collections.singletonList(flick)));
-    return Optional.of(new Key(0, 0, 10, 10, 0, 0, false, false, false,
-                               Stick.EVEN, keyStates));
+    return Optional.of(new Key(0, 0, 10, 10, 0, 0, false, false, Stick.EVEN,
+                               DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, keyStates));
   }
 
   private KeyboardAccessibilityNodeProvider createMockProvider(View view) {
@@ -107,15 +105,6 @@
         .withConstructor(View.class).withArgs(view).createMock();
   }
 
-  private KeyEventHandler createMockKeyEventHandler() {
-    return createMockBuilder(KeyEventHandler.class)
-        .withConstructor(Looper.class, KeyboardActionListener.class,
-                         Integer.TYPE, Integer.TYPE, Integer.TYPE)
-        .withArgs(Looper.getMainLooper(), createNiceMock(KeyboardActionListener.class), 0, 0, 0)
-        .addMockedMethod("sendKey")
-        .createMock();
-  }
-
   @SmallTest
   public void testDispatchHoverEvent_NoCorrespondingAction() {
     // Action: No corresponding action
@@ -127,7 +116,15 @@
     KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
     expect(provider.getKey(anyInt(), anyInt())).andReturn(Optional.<Key>absent());
     replayAll();
-    KeyboardAccessibilityDelegate delegate = new KeyboardAccessibilityDelegate(view, provider, 0);
+    KeyboardAccessibilityDelegate delegate =
+        new KeyboardAccessibilityDelegate(view, provider, 0, new TouchEventEmulator() {
+          @Override
+          public void emulateLongPress(Key key) {
+          }
+          @Override
+          public void emulateKeyInput(Key key) {
+          }
+        });
     assertFalse(delegate.dispatchHoverEvent(createMotionEvent(MotionEvent.ACTION_CANCEL)));
     verifyAll();
   }
@@ -145,13 +142,12 @@
                                  MotionEvent.ACTION_HOVER_EXIT}) {
       resetAll();
       View view = createViewMock(View.class);
-      KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+      TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
       KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
       expect(provider.getKey(anyInt(), anyInt())).andReturn(Optional.<Key>absent());
       replayAll();
       KeyboardAccessibilityDelegate delegate =
-          new KeyboardAccessibilityDelegate(view, provider, 0);
-      delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+          new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
       assertFalse(delegate.dispatchHoverEvent(createMotionEvent(action)));
       verifyAll();
     }
@@ -170,7 +166,7 @@
                                  MotionEvent.ACTION_HOVER_MOVE}) {
       resetAll();
       View view = createViewMock(View.class);
-      KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+      TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
       KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
       expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
       provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -180,8 +176,7 @@
           .andReturn(true);
       replayAll();
       KeyboardAccessibilityDelegate delegate =
-          new KeyboardAccessibilityDelegate(view, provider, 0);
-      delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+          new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
       assertTrue(delegate.dispatchHoverEvent(createMotionEvent(action)));
       verifyAll();
     }
@@ -196,12 +191,12 @@
     //   - KeyEventHandler#onKey is invoked.
     //   - MotionEvent is consumed.
     View view = createViewMock(View.class);
-    KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+    TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
     KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
 
     Optional<Key> optionalKey = createOptionalKey();
     expect(provider.getKey(anyInt(), anyInt())).andReturn(optionalKey);
-    keyEventHandler.sendKey(KEY_CODE, Collections.<TouchEvent>emptyList());
+    emulator.emulateKeyInput(anyObject(Key.class));
     provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
         anyObject(Key.class), eq(AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT));
     expect(provider.performActionForKey(
@@ -209,8 +204,7 @@
         .andReturn(true);
     replayAll();
     KeyboardAccessibilityDelegate delegate =
-        new KeyboardAccessibilityDelegate(view, provider, 0);
-    delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+        new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
     assertTrue(delegate.dispatchHoverEvent(createMotionEvent(MotionEvent.ACTION_HOVER_EXIT)));
     verifyAll();
   }
@@ -225,11 +219,10 @@
     //   - No methods in the KeyEventHandler are called back.
     //   - MotionEvent is consumed.
     View view = createViewMock(View.class);
-    KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+    TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
     KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
     KeyboardAccessibilityDelegate delegate =
-        new KeyboardAccessibilityDelegate(view, provider, 0);
-    delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+        new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
     // Preparing precondition.
     expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
     provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -266,11 +259,10 @@
     //   - No methods in the KeyEventHandler are called back.
     //   - MotionEvent is consumed.
     View view = createViewMock(View.class);
-    KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+    TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
     KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
     KeyboardAccessibilityDelegate delegate =
-        new KeyboardAccessibilityDelegate(view, provider, 0);
-    delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+        new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
     // Preparing precondition.
     expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
     provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -303,9 +295,10 @@
         .addMockedMethods("isWiredHeadsetOn", "isBluetoothA2dpOn")
         .createMock();
     AccessibilityUtil.setAudioManagerForTesting(Optional.of(audioManager));
+    TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
     KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
     KeyboardAccessibilityDelegate delegate =
-        new KeyboardAccessibilityDelegate(view, provider, 0);
+        new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
     for (boolean isPasswordField : new boolean[] {true, false}) {
       for (boolean isAccessibilityEnabled : new boolean[] {true, false}) {
         AccessibilityUtil.setAccessibilityEnabled(Optional.of(isAccessibilityEnabled));
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
index 2638023..bcadad3 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
@@ -33,6 +33,7 @@
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.expect;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key;
@@ -41,6 +42,8 @@
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
 import org.mozc.android.inputmethod.japanese.keyboard.Row;
 import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
@@ -90,7 +93,8 @@
   private Keyboard createMockKeyboard() {
     List<Row> rowList = Collections.singletonList(
         new Row(Arrays.asList(
-            new Key(0, 0, 10, 10, 0, 0, true, false, false, Stick.EVEN, Arrays.asList(
+            new Key(0, 0, 10, 10, 0, 0, true, false, Stick.EVEN,
+                DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Arrays.asList(
                 new KeyState(
                     "meta:unmodified",
                     Collections.<MetaState>emptySet(),
@@ -98,8 +102,9 @@
                     Collections.<MetaState>emptySet(),
                     Collections.singletonList(
                         new Flick(Direction.CENTER,
-                            new KeyEntity(SOURCE_ID_UNMODIFIED, KEYCODE_UNMODIFIED,
-                                0, 0, null, false, null)))),
+                            new KeyEntity(SOURCE_ID_UNMODIFIED, KEYCODE_UNMODIFIED, 0, true, 0,
+                                Optional.<String>absent(), false, Optional.<PopUp>absent(),
+                                0, 0, 0, 0)))),
                 new KeyState(
                     "meta:shift",
                     EnumSet.of(MetaState.SHIFT),
@@ -107,9 +112,11 @@
                     Collections.<MetaState>emptySet(),
                     Collections.singletonList(
                         new Flick(Direction.CENTER,
-                            new KeyEntity(SOURCE_ID_SHIFTED, KEYCODE_SHIFTED,
-                                0, 0, null, false, null)))))),
-            new Key(10, 0, 10, 10, 0, 0, true, false, false, Stick.EVEN, Collections.singletonList(
+                            new KeyEntity(SOURCE_ID_SHIFTED, KEYCODE_SHIFTED, 0, true, 0,
+                                Optional.<String>absent(), false, Optional.<PopUp>absent(),
+                                0, 0, 0, 0)))))),
+            new Key(10, 0, 10, 10, 0, 0, true, false, Stick.EVEN,
+                DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.singletonList(
                 new KeyState(
                     "backspace",
                     Collections.<MetaState>emptySet(),
@@ -117,10 +124,12 @@
                     Collections.<MetaState>emptySet(),
                     Collections.singletonList(
                         new Flick(Direction.CENTER,
-                            new KeyEntity(SOURCE_ID_BACKSPACE, KEYCODE_BACKSPACE,
-                                0, 0, null, false, null))))))),
+                            new KeyEntity(SOURCE_ID_BACKSPACE, KEYCODE_BACKSPACE, 0, true, 0,
+                                Optional.<String>absent(), false,
+                                Optional.<PopUp>absent(), 0, 0, 0, 0))))))),
             10, 0));
-    return new Keyboard(Optional.of("testkeyboard"), rowList, 0);
+    return new Keyboard(Optional.of("testkeyboard"), rowList, 0,
+                        KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
   }
 
   private View createMockView() {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
index 1821d9c..d3600e9 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
@@ -29,9 +29,9 @@
 
 package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ModifierKey;
@@ -80,7 +80,7 @@
         HardwareKeyboardSpecification.DEFAULT;
 
     class KeyEventMock extends KeyEvent {
-      private int unicode;
+      private final int unicode;
       KeyEventMock(int action, int keycode, int meta, int unicode) {
         super(0, 0, action, keycode, 0, meta);
         this.unicode = unicode;
@@ -99,7 +99,7 @@
       assertEquals(keyEvent.getUnicodeChar(), mozcKeyEvent.getKeyCode());
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -123,7 +123,7 @@
       assertEquals(SpecialKey.SPACE, mozcKeyEvent.getSpecialKey());
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -135,7 +135,7 @@
       assertEquals(SpecialKey.ENTER, mozcKeyEvent.getSpecialKey());
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -149,7 +149,7 @@
       assertEquals(0, mozcKeyEvent.getModifierKeysCount());
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -167,7 +167,7 @@
                                new HashSet<ModifierKey>(mozcKeyEvent.getModifierKeysList()));
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -187,7 +187,7 @@
                                new HashSet<ModifierKey>(mozcKeyEvent.getModifierKeysList()));
 
       KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+      assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
     }
 
     {
@@ -915,7 +915,7 @@
       }
 
       assertEquals(testData.toString(), keyEvent,
-                   keyboardSpecification.getKeyEventInterface(keyEvent).getNativeEvent());
+                   keyboardSpecification.getKeyEventInterface(keyEvent).getNativeEvent().orNull());
 
       assertEquals(testData.toString(), testData.expectCompositionSwitchMode,
                    keyboardSpecification.getCompositionSwitchMode(keyEvent));
@@ -928,81 +928,6 @@
   }
 
   @SmallTest
-  public void testTweleveKeyConverter() {
-    HardwareKeyboardSpecification keyboardSpecification =
-        HardwareKeyboardSpecification.TWELVEKEY;
-
-    KeyEvent keyEventA = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
-    keyEventA.setSource(InputDevice.SOURCE_KEYBOARD);
-    assertEquals(keyEventA.getUnicodeChar(),
-                 keyboardSpecification.getMozcKeyEvent(keyEventA).getKeyCode());
-
-    class TestData extends Parameter {
-      final int keyCode;
-      final int expectMozcKeyCode;
-
-      TestData(int keyCode, int expectMozcKeyCode) {
-        this.keyCode = keyCode;
-        this.expectMozcKeyCode = expectMozcKeyCode;
-      }
-    }
-
-    TestData[] testDataList = {
-        new TestData(KeyEvent.KEYCODE_0, '0'),
-        new TestData(KeyEvent.KEYCODE_1, '1'),
-        new TestData(KeyEvent.KEYCODE_2, '2'),
-        new TestData(KeyEvent.KEYCODE_3, '3'),
-        new TestData(KeyEvent.KEYCODE_4, '4'),
-        new TestData(KeyEvent.KEYCODE_5, '5'),
-        new TestData(KeyEvent.KEYCODE_6, '6'),
-        new TestData(KeyEvent.KEYCODE_7, '7'),
-        new TestData(KeyEvent.KEYCODE_8, '8'),
-        new TestData(KeyEvent.KEYCODE_9, '9'),
-        new TestData(KeyEvent.KEYCODE_STAR, '*'),
-    };
-
-    for (TestData testData : testDataList) {
-      KeyEvent keyEvent  = new KeyEvent(KeyEvent.ACTION_DOWN, testData.keyCode);
-      keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
-      assertEquals(testData.toString(), testData.expectMozcKeyCode,
-                   keyboardSpecification.getMozcKeyEvent(keyEvent).getKeyCode());
-      KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertNotNull(testData.toString(), keyEventInterface.getNativeEvent());
-      assertEquals(testData.toString(), keyEvent.getKeyCode(), keyEventInterface.getKeyCode());
-    }
-
-    {
-      KeyEvent keyEvent  = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POUND);
-      keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
-      assertEquals(SpecialKey.ENTER,
-                   keyboardSpecification.getMozcKeyEvent(keyEvent).getSpecialKey());
-      KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertNotNull(keyEventInterface.getNativeEvent());
-      assertEquals(KeyEvent.KEYCODE_ENTER, keyEventInterface.getKeyCode());
-    }
-
-    {
-      KeyEvent keyEvent  = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
-      keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
-      assertEquals(SpecialKey.ENTER,
-                   keyboardSpecification.getMozcKeyEvent(keyEvent).getSpecialKey());
-      KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
-      assertNotNull(keyEventInterface.getNativeEvent());
-      assertEquals(KeyEvent.KEYCODE_ENTER, keyEventInterface.getKeyCode());
-    }
-
-    // No corresponding entry.
-    KeyEvent keyEvent = new KeyEvent(0, 0);
-    keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
-    assertFalse(keyboardSpecification.getCompositionSwitchMode(keyEvent).isPresent());
-
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 keyboardSpecification.getKanaKeyboardSpecification());
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
-                 keyboardSpecification.getAlphabetKeyboardSpecification());
-  }
-
-  @SmallTest
   public void testMaybeSetDetectedHardwareKeyMap() {
     class TestData extends Parameter {
       final HardwareKeyMap presetHardwareKeyMap;
@@ -1024,8 +949,8 @@
     TestData[] testDataList = {
         new TestData(HardwareKeyMap.JAPANESE109A, Configuration.KEYBOARD_12KEY, false,
                      HardwareKeyMap.JAPANESE109A),
-        new TestData(null, Configuration.KEYBOARD_12KEY, false, HardwareKeyMap.TWELVEKEY),
-        new TestData(null, Configuration.KEYBOARD_QWERTY, false, HardwareKeyMap.JAPANESE109A),
+        new TestData(null, Configuration.KEYBOARD_12KEY, false, HardwareKeyMap.DEFAULT),
+        new TestData(null, Configuration.KEYBOARD_QWERTY, false, HardwareKeyMap.DEFAULT),
         new TestData(null, Configuration.KEYBOARD_NOKEYS, false, null),
         new TestData(null, Configuration.KEYBOARD_UNDEFINED, false, null),
         new TestData(null, Configuration.KEYBOARD_NOKEYS, true, HardwareKeyMap.DEFAULT),
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
index 961adce..280bcd6 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
@@ -29,7 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
@@ -86,27 +86,4 @@
     assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
                  hardwareKeyboard.getKeyboardSpecification());
   }
-
-  @SmallTest
-  public void test12KeysKeyboard() {
-    HardwareKeyboard hardwareKeyboard = new HardwareKeyboard();
-    hardwareKeyboard.setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
-    assertEquals(HardwareKeyMap.TWELVEKEY, hardwareKeyboard.getHardwareKeyMap());
-
-    KeyEvent zenhan = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_ZENKAKU_HANKAKU, 0);
-
-    assertEquals(CompositionMode.HIRAGANA, hardwareKeyboard.getCompositionMode());
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 hardwareKeyboard.getKeyboardSpecification());
-
-    hardwareKeyboard.setCompositionModeByKey(zenhan);
-    assertEquals(CompositionMode.HALF_ASCII, hardwareKeyboard.getCompositionMode());
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
-                 hardwareKeyboard.getKeyboardSpecification());
-
-    hardwareKeyboard.setCompositionModeByKey(zenhan);
-    assertEquals(CompositionMode.HIRAGANA, hardwareKeyboard.getCompositionMode());
-    assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
-                 hardwareKeyboard.getKeyboardSpecification());
-  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
index d4be0e7..678a783 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
@@ -39,6 +39,7 @@
 import org.mozc.android.inputmethod.japanese.testing.MozcMatcher.DeepCopyPaintCapture;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 
+import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.ComposeShader;
 import android.graphics.LinearGradient;
@@ -60,7 +61,9 @@
   @Override
   public void setUp() throws Exception {
     super.setUp();
-    factory = new BackgroundDrawableFactory(1f);
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    factory = new BackgroundDrawableFactory(resources);
+    factory.setSkin(SkinType.TEST.getSkin(resources));
   }
 
   @Override
@@ -151,6 +154,9 @@
         DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         DrawableType.TWELVEKEYS_FUNCTION_KEY_BACKGROUND,
     };
+    // Expectations depend on ORANGE_LIGHTGRAY skin.
+    factory.setSkin(
+        SkinType.ORANGE_LIGHTGRAY.getSkin(getInstrumentation().getTargetContext().getResources()));
 
     for (DrawableType drawableType : drawableTypeList) {
       Capture<Paint> paintCapture = new DeepCopyPaintCapture();
@@ -238,8 +244,6 @@
     DrawableType[] drawableTypeList = {
         DrawableType.QWERTY_REGULAR_KEY_BACKGROUND,
         DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND,
-        DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
-        DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
     };
 
     int[][] stateList = {
@@ -254,13 +258,6 @@
         canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), isA(Paint.class));  // Shadow.
         canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), capture(paintCapture));  // Base.
 
-        if (drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND ||
-            drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND) {
-          // Light mark should be drawn.
-          canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class));  // Base.
-          canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class));  // Shade.
-        }
-
         replayAll();
 
         Drawable drawable = factory.getDrawable(drawableType);
@@ -278,12 +275,6 @@
         canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), isA(Paint.class));  // Shadow.
         canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), capture(paintCapture));  // Base.
 
-        if (drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND ||
-            drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND) {
-          // Light mark should be drawn.
-          canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class));  // Base.
-          canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class));  // Shade.
-        }
         replayAll();
         drawable.setBounds(0, 0, 200, 200);
         drawable.draw(canvas);
@@ -299,6 +290,9 @@
 
   @SmallTest
   public void testSetSkinType() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    // With skin, getDrawable method returns concrete drawable.
+    factory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
     Drawable drawable = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
     assertNotNull(drawable);
 
@@ -307,12 +301,12 @@
 
     // If setSkinType is invoked, but actually skin is not changed,
     // the same instance should be used.
-    factory.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+    factory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
     assertSame(drawable, factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND));
 
     // If setSkinType is invoked, and actually the skin is changed,
     // the difference instance should be created.
-    factory.setSkinType(SkinType.TEST);
+    factory.setSkin(SkinType.TEST.getSkin(resources));
     assertNotSame(drawable, factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND));
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
index c5de5af..9af8ce7 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
@@ -29,10 +29,12 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
+import com.google.common.base.Optional;
 
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -45,6 +47,7 @@
 /**
  */
 public class KeyEventContextTest extends TestCase {
+
   private PopUp defaultPopUp;
   private PopUp leftPopUp;
   private KeyEntity defaultEntity;
@@ -54,18 +57,30 @@
   private KeyState defaultState;
   private KeyState modifiedState;
   private Key modifiableKey;
+  private Key longpressableKeyWithTimeoutTrigger;
+  private Key longpressableKeyWithoutTimeoutTrigger;
 
   @Override
   public void setUp() throws Exception {
     super.setUp();
 
-    defaultPopUp = new PopUp(0, 0, 0, 0, 0);
-    leftPopUp = new PopUp(0, 0, 0, 0, 0);
+    defaultPopUp = new PopUp(0, 0, 0, 0, 0, 0, 0);
+    leftPopUp = new PopUp(0, 0, 0, 0, 0, 0, 0);
 
-    defaultEntity = new KeyEntity(1, 'a', 'A', 0, null, false, defaultPopUp);
-    leftFlickEntity = new KeyEntity(2, 'b', 'B',  0, null, false, leftPopUp);
-    modifiedCenterEntity = new KeyEntity(3, 'c', 'C', 0, null, false, null);
-    modifiedLeftEntity = new KeyEntity(4, 'd', 'D', 0, null, false, null);
+    defaultEntity = new KeyEntity(
+        1, 'a', 'A', true, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+        0, 0, 0, 0);
+    leftFlickEntity = new KeyEntity(
+        2, 'b', 'B', true, 0, Optional.<String>absent(), false, Optional.of(leftPopUp), 0, 0, 0, 0);
+    modifiedCenterEntity = createKeyEntity(3, 'c', 'C');
+    modifiedLeftEntity = createKeyEntity(4, 'd', 'D');
+
+    KeyEntity longpressableEntityWithTimeoutTrigger = new KeyEntity(
+        5, 'e', 'E', true, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+        0, 0, 0, 0);
+    KeyEntity longpressableEntityWithoutTimeoutTrigger = new KeyEntity(
+        6, 'f', 'F', false, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+        0, 0, 0, 0);
 
     defaultState = new KeyState(
         "", Collections.<MetaState>emptySet(),
@@ -78,8 +93,25 @@
         Arrays.asList(new Flick(Flick.Direction.CENTER, modifiedCenterEntity),
                       new Flick(Flick.Direction.LEFT, modifiedLeftEntity)));
 
-    modifiableKey = new Key(0, 0, 16, 16, 0, 0, false, false, false, Stick.EVEN,
+    modifiableKey = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+                            DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                             Arrays.asList(defaultState, modifiedState));
+    longpressableKeyWithTimeoutTrigger = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+        Collections.singletonList(
+            new KeyState("", Collections.<MetaState>emptySet(),
+                         Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+                         Collections.singletonList(
+                             new Flick(Flick.Direction.CENTER,
+                                       longpressableEntityWithTimeoutTrigger)))));
+    longpressableKeyWithoutTimeoutTrigger = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+        Collections.singletonList(
+            new KeyState("", Collections.<MetaState>emptySet(),
+                         Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+                         Collections.singletonList(
+                             new Flick(Flick.Direction.CENTER,
+                                       longpressableEntityWithoutTimeoutTrigger)))));
   }
 
   @Override
@@ -97,10 +129,17 @@
     super.tearDown();
   }
 
+  private static KeyEntity createKeyEntity(int sourceId, int keyCode, int longPressKeyCode) {
+    return new KeyEntity(
+        sourceId, keyCode, longPressKeyCode, true, 0,
+        Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
+  }
+
   @SmallTest
   public void testIsContained() {
     Key key = new Key(
-        0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN, Collections.<KeyState>emptyList());
+        0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList());
     assertTrue(KeyEventContext.isContained(15, 25, key));
     assertTrue(KeyEventContext.isContained(10, 5, key));
     assertTrue(KeyEventContext.isContained(29, 45, key));
@@ -114,16 +153,16 @@
   public void testIsFlickable() {
     // If the key doesn't return KeyState, isFlickable should return false.
     assertFalse(KeyEventContext.isFlickable(
-        new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
-                Collections.<KeyState>emptyList()),
+        new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+            DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList()),
         Collections.<MetaState>emptySet()));
 
     // If the key doesn't have flick related data other than CENTER, it is not flickable.
-    KeyEntity dummyKeyEntity =
-        new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
+    KeyEntity dummyKeyEntity = createKeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE);
     Flick center = new Flick(Flick.Direction.CENTER, dummyKeyEntity);
     assertFalse(KeyEventContext.isFlickable(
-        new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+        new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+                DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                 Collections.singletonList(
                     new KeyState("",
                                  Collections.<MetaState>emptySet(),
@@ -135,7 +174,8 @@
     // If the key has flick related data other than CENTER, it is flickable.
     Flick left = new Flick(Flick.Direction.LEFT, dummyKeyEntity);
     assertTrue(KeyEventContext.isFlickable(
-        new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+        new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+                DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                 Collections.singletonList(
                     new KeyState("",
                                  Collections.<MetaState>emptySet(),
@@ -149,48 +189,60 @@
   public void testGetKeyEntity() {
     assertSame(defaultEntity,
                KeyEventContext.getKeyEntity(
-                   modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.CENTER));
+                   modifiableKey, Collections.<MetaState>emptySet(),
+                   Optional.of(Flick.Direction.CENTER)).get());
     assertSame(leftFlickEntity,
                KeyEventContext.getKeyEntity(
-                   modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.LEFT));
+                   modifiableKey, Collections.<MetaState>emptySet(),
+                   Optional.of(Flick.Direction.LEFT)).get());
     assertSame(modifiedCenterEntity,
                KeyEventContext.getKeyEntity(
-                   modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.CENTER));
+                   modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+                   Optional.of(Flick.Direction.CENTER)).get());
     assertSame(modifiedLeftEntity,
                KeyEventContext.getKeyEntity(
-                   modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.LEFT));
+                   modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+                   Optional.of(Flick.Direction.LEFT)).get());
 
     // If a key entity for the flick direction is not specified,
-    // null should be returned.
-    assertNull(KeyEventContext.getKeyEntity(
-        modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.RIGHT));
-    assertNull(KeyEventContext.getKeyEntity(
-        modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.RIGHT));
+    // Optional.absent() should be returned.
+    assertFalse(KeyEventContext.getKeyEntity(
+        modifiableKey, Collections.<MetaState>emptySet(),
+        Optional.of(Flick.Direction.RIGHT)).isPresent());
+    assertFalse(KeyEventContext.getKeyEntity(
+        modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+        Optional.of(Flick.Direction.RIGHT)).isPresent());
 
-    Key unmodifiableKey = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
+    Key unmodifiableKey = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                                  DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                                   Collections.singletonList(defaultState));
 
     // If a key doesn't have modified state, default state should be used as its fall back.
     assertSame(defaultEntity,
                KeyEventContext.getKeyEntity(
-                   unmodifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.CENTER));
+                   unmodifiableKey, Collections.<MetaState>emptySet(),
+                   Optional.of(Flick.Direction.CENTER)).get());
     assertSame(leftFlickEntity,
                KeyEventContext.getKeyEntity(
-                   unmodifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.LEFT));
+                   unmodifiableKey, Collections.<MetaState>emptySet(),
+                   Optional.of(Flick.Direction.LEFT)).get());
     assertSame(defaultEntity,
                KeyEventContext.getKeyEntity(
-                   unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.CENTER));
+                   unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+                   Optional.of(Flick.Direction.CENTER)).get());
     assertSame(leftFlickEntity,
                KeyEventContext.getKeyEntity(
-                   unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.LEFT));
+                   unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+                   Optional.of(Flick.Direction.LEFT)).get());
 
-    // If both state is not specified, null should be returned.
-    Key spacer = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
+    // If both state is not specified, Optional.absent() should be returned.
+    Key spacer = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                         DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                          Collections.<KeyState>emptyList());
-    assertNull(KeyEventContext.getKeyEntity(spacer, Collections.<MetaState>emptySet(),
-                                            Flick.Direction.CENTER));
-    assertNull(KeyEventContext.getKeyEntity(spacer, EnumSet.of(MetaState.CAPS_LOCK),
-                                            Flick.Direction.CENTER));
+    assertFalse(KeyEventContext.getKeyEntity(spacer, Collections.<MetaState>emptySet(),
+                                             Optional.of(Flick.Direction.CENTER)).isPresent());
+    assertFalse(KeyEventContext.getKeyEntity(spacer, EnumSet.of(MetaState.CAPS_LOCK),
+                                             Optional.of(Flick.Direction.CENTER)).isPresent());
   }
 
   @SmallTest
@@ -202,18 +254,40 @@
     assertEquals('b', keyEventContext.getKeyCode());
     keyEventContext.flickDirection = Flick.Direction.RIGHT;
     assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
-    keyEventContext.longPressSent = true;
+    keyEventContext.pastLongPressSentTimeout = true;
     keyEventContext.flickDirection = Flick.Direction.CENTER;
     assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
   }
 
   @SmallTest
+  public void testGetKeyCodeForLongPressWithTimeoutTrigger() {
+    KeyEventContext keyEventContext =
+        new KeyEventContext(longpressableKeyWithTimeoutTrigger, 0, 0, 0, 100, 100, 1,
+                            Collections.<MetaState>emptySet());
+    keyEventContext.pastLongPressSentTimeout = false;
+    assertEquals('e', keyEventContext.getKeyCode());
+    keyEventContext.pastLongPressSentTimeout = true;
+    assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
+  }
+
+  @SmallTest
+  public void testGetKeyCodeForLongPressWithoutTimeoutTrigger() {
+    KeyEventContext keyEventContext =
+        new KeyEventContext(longpressableKeyWithoutTimeoutTrigger, 0, 0, 0, 100, 100, 1,
+                            Collections.<MetaState>emptySet());
+    keyEventContext.pastLongPressSentTimeout = false;
+    assertEquals('f', keyEventContext.getKeyCode());
+    keyEventContext.pastLongPressSentTimeout = true;
+    assertEquals('F', keyEventContext.getKeyCode());
+  }
+
+  @SmallTest
   public void testGetLongPressKeyCode() {
     KeyEventContext keyEventContext =
         new KeyEventContext(modifiableKey, 0, 0, 0, 100, 100, 1,
                             Collections.<MetaState>emptySet());
     assertEquals('A', keyEventContext.getLongPressKeyCode());
-    keyEventContext.longPressSent = true;
+    keyEventContext.pastLongPressSentTimeout = true;
     assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getLongPressKeyCode());
   }
 
@@ -227,7 +301,7 @@
     assertEquals('a', keyEventContext.getPressedKeyCode());
     keyEventContext.flickDirection = Flick.Direction.RIGHT;
     assertEquals('a', keyEventContext.getPressedKeyCode());
-    keyEventContext.longPressSent = true;
+    keyEventContext.pastLongPressSentTimeout = true;
     keyEventContext.flickDirection = Flick.Direction.CENTER;
     assertEquals('a', keyEventContext.getPressedKeyCode());
   }
@@ -252,7 +326,8 @@
         Collections.<MetaState>emptySet(),
         EnumSet.of(MetaState.CAPS_LOCK),
         Collections.singletonList(new Flick(Flick.Direction.CENTER, defaultEntity)));
-    Key capsLockKey = new Key(0, 0, 10, 10, 0, 0, false, true, false, Stick.EVEN,
+    Key capsLockKey = new Key(0, 0, 10, 10, 0, 0, false, true, Stick.EVEN,
+                              DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                               Arrays.asList(onUnmodified, onShift, onCapsLock));
     assertEquals(
         EnumSet.of(MetaState.SHIFT),
@@ -270,19 +345,21 @@
 
   @SmallTest
   public void testIsMetaStateToggleEvent() {
-    Key key = new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+    Key key = new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                       Collections.<KeyState>emptyList());
     KeyEventContext keyEventContext =
         new KeyEventContext(key, 0, 0, 0, 100, 100, 1, Collections.<MetaState>emptySet());
     assertFalse(keyEventContext.isMetaStateToggleEvent());
-    Key modifierKey = new Key(0, 0, 30, 50, 0, 0, false, true, false, Stick.EVEN,
+    Key modifierKey = new Key(0, 0, 30, 50, 0, 0, false, true, Stick.EVEN,
+                              DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                               Collections.<KeyState>emptyList());
     KeyEventContext modifierKeyEventContext =
         new KeyEventContext(modifierKey, 0, 0, 0, 100, 100, 1, Collections.<MetaState>emptySet());
     assertTrue(modifierKeyEventContext.isMetaStateToggleEvent());
-    modifierKeyEventContext.longPressSent = true;
+    modifierKeyEventContext.pastLongPressSentTimeout = true;
     assertFalse(modifierKeyEventContext.isMetaStateToggleEvent());
-    modifierKeyEventContext.longPressSent = false;
+    modifierKeyEventContext.pastLongPressSentTimeout = false;
     modifierKeyEventContext.flickDirection = Flick.Direction.LEFT;
     assertFalse(modifierKeyEventContext.isMetaStateToggleEvent());
   }
@@ -292,23 +369,23 @@
     KeyEventContext keyEventContext =
         new KeyEventContext(modifiableKey, 0, 0, 0, 100, 100, 1,
                             Collections.<MetaState>emptySet());
-    assertSame(defaultPopUp, keyEventContext.getCurrentPopUp());
+    assertSame(defaultPopUp, keyEventContext.getCurrentPopUp().get());
     keyEventContext.flickDirection = Flick.Direction.LEFT;
-    assertSame(leftPopUp, keyEventContext.getCurrentPopUp());
+    assertSame(leftPopUp, keyEventContext.getCurrentPopUp().get());
     keyEventContext.flickDirection = Flick.Direction.RIGHT;
-    assertNull(keyEventContext.getCurrentPopUp());
-    keyEventContext.longPressSent = true;
+    assertFalse(keyEventContext.getCurrentPopUp().isPresent());
+    keyEventContext.pastLongPressSentTimeout = true;
     keyEventContext.flickDirection = Flick.Direction.CENTER;
-    assertNull(keyEventContext.getCurrentPopUp());
+    assertFalse(keyEventContext.getCurrentPopUp().isPresent());
   }
 
   @SmallTest
   public void testUpdate() {
-    KeyEntity centerEntity = new KeyEntity(1, 'a', 'A', 0, null, false, null);
-    KeyEntity leftEntity = new KeyEntity(2, 'b', 'B', 0, null, false, null);
-    KeyEntity upEntity = new KeyEntity(3, 'c', 'C', 0, null, false, null);
-    KeyEntity rightEntity = new KeyEntity(4, 'd', 'D', 0, null, false, null);
-    KeyEntity downEntity = new KeyEntity(5, 'e', 'E', 0, null, false, null);
+    KeyEntity centerEntity = createKeyEntity(1, 'a', 'A');
+    KeyEntity leftEntity = createKeyEntity(2, 'b', 'B');
+    KeyEntity upEntity = createKeyEntity(3, 'c', 'C');
+    KeyEntity rightEntity = createKeyEntity(4, 'd', 'D');
+    KeyEntity downEntity = createKeyEntity(5, 'e', 'E');
 
     KeyState keyState = new KeyState(
         "",
@@ -321,7 +398,8 @@
                       new Flick(Flick.Direction.RIGHT, rightEntity),
                       new Flick(Flick.Direction.DOWN, downEntity)));
 
-    Key key = new Key(0, 0, 16, 16, 0, 0, false, false, false, Stick.EVEN,
+    Key key = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                       Collections.singletonList(keyState));
     KeyEventContext keyEventContext =
         new KeyEventContext(key, 0, 8, 8, 64, 64, 50, Collections.<MetaState>emptySet());
@@ -333,58 +411,65 @@
             .addStroke(
                 KeyEventContext.createTouchPosition(TouchAction.TOUCH_DOWN, 8, 8, 64, 64, 0))
             .build(),
-         keyEventContext.getTouchEvent());
+         keyEventContext.getTouchEvent().get());
 
     class TestData {
       final int x;
       final int y;
       final long timestamp;
+      final boolean pastLongPressSentTimeout;
       final boolean expectedUpdateResult;
       final Flick.Direction expectedDirection;
       final int expectedSourceId;
+      final boolean expectedPastLongPressSentTimeout;
 
-      TestData(int x, int y, long timestamp,
+      TestData(int x, int y, long timestamp, boolean pastLongPressSentTimeout,
                boolean expectedUpdateResult, Flick.Direction expectedDirection,
-               int expectedSourceId) {
+               int expectedSourceId, boolean expectedPastLongPressSentTimeout) {
         this.x = x;
         this.y = y;
         this.timestamp = timestamp;
+        this.pastLongPressSentTimeout = pastLongPressSentTimeout;
         this.expectedUpdateResult = expectedUpdateResult;
         this.expectedDirection = expectedDirection;
         this.expectedSourceId = expectedSourceId;
+        this.expectedPastLongPressSentTimeout = expectedPastLongPressSentTimeout;
       }
     }
 
     TestData[] testDataList = {
         // Center
-        new TestData(4, 4, 10, false, Flick.Direction.CENTER, 1),
+        new TestData(4, 4, 10, false, false, Flick.Direction.CENTER, 1, false),
 
         // Up
-        new TestData(8, -16, 20, true, Flick.Direction.UP, 3),
-        new TestData(8, -32, 30, false, Flick.Direction.UP, 3),
+        new TestData(8, -16, 20, false, true, Flick.Direction.UP, 3, false),
+        new TestData(8, -32, 30, false, false, Flick.Direction.UP, 3, false),
 
         // Left
-        new TestData(-16, 8, 40, true, Flick.Direction.LEFT, 2),
-        new TestData(-32, 8, 50, false, Flick.Direction.LEFT, 2),
+        new TestData(-16, 8, 40, false, true, Flick.Direction.LEFT, 2, false),
+        new TestData(-32, 8, 50, false, false, Flick.Direction.LEFT, 2, false),
 
         // Down
-        new TestData(8, 32, 60, true, Flick.Direction.DOWN, 5),
-        new TestData(8, 48, 70, false, Flick.Direction.DOWN, 5),
+        new TestData(8, 32, 60, true, true, Flick.Direction.DOWN, 5, false),
+        new TestData(8, 48, 70, true, false, Flick.Direction.DOWN, 5, true),
 
         // Right
-        new TestData(32, 8, 80, true, Flick.Direction.RIGHT, 4),
-        new TestData(48, 8, 90, false, Flick.Direction.RIGHT, 4),
+        new TestData(32, 8, 80, true, true, Flick.Direction.RIGHT, 4, false),
+        new TestData(48, 8, 90, true, false, Flick.Direction.RIGHT, 4, true),
 
         // Back to center
-        new TestData(8, 8, 100, true, Flick.Direction.CENTER, 1),
-        new TestData(4, 4, 110, false, Flick.Direction.CENTER, 1),
+        new TestData(8, 8, 100, true, true, Flick.Direction.CENTER, 1, false),
+        new TestData(4, 4, 110, true, false, Flick.Direction.CENTER, 1, true),
     };
 
     for (TestData testData : testDataList) {
+      keyEventContext.pastLongPressSentTimeout = testData.pastLongPressSentTimeout;
       assertEquals(testData.expectedUpdateResult,
                    keyEventContext.update(testData.x, testData.y,
                                           TouchAction.TOUCH_MOVE, testData.timestamp));
       assertEquals(testData.expectedDirection, keyEventContext.flickDirection);
+      assertEquals(testData.expectedPastLongPressSentTimeout,
+                   keyEventContext.pastLongPressSentTimeout);
       assertEquals(
           TouchEvent.newBuilder()
               .setSourceId(testData.expectedSourceId)
@@ -393,7 +478,7 @@
               .addStroke(KeyEventContext.createTouchPosition(
                   TouchAction.TOUCH_MOVE, testData.x, testData.y, 64, 64, testData.timestamp))
               .build(),
-          keyEventContext.getTouchEvent());
+          keyEventContext.getTouchEvent().get());
     }
 
     // Release the key.
@@ -404,19 +489,20 @@
         .addStroke(KeyEventContext.createTouchPosition(TouchAction.TOUCH_DOWN, 8, 8, 64, 64, 0))
         .addStroke(KeyEventContext.createTouchPosition(TouchAction.TOUCH_UP, 4, 4, 64, 64, 120))
         .build();
-    assertEquals(expectedEvent, keyEventContext.getTouchEvent());
+    assertEquals(expectedEvent, keyEventContext.getTouchEvent().get());
   }
 
   @SmallTest
   public void testUpdateNonFlickable() {
-    KeyEntity keyEntity = new KeyEntity(256, 'a', 'A', 0, null, false, null);
+    KeyEntity keyEntity = createKeyEntity(256, 'a', 'A');
     KeyState keyState = new KeyState(
         "",
         Collections.<MetaState>emptySet(),
         Collections.<MetaState>emptySet(),
         Collections.<MetaState>emptySet(),
         Collections.singletonList(new Flick(Flick.Direction.CENTER, keyEntity)));
-    Key key = new Key(0, 0, 10, 10, 0, 0, false, false, false, Stick.EVEN,
+    Key key = new Key(0, 0, 10, 10, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                       Collections.singletonList(keyState));
 
     // For unflickable keys, moving inside the key's region is NOT a flick action
@@ -438,6 +524,6 @@
     assertTrue(keyEventContext.update(-10, 5, TouchAction.TOUCH_MOVE, 40));
     assertEquals(Flick.Direction.LEFT, keyEventContext.flickDirection);
 
-    assertNull(keyEventContext.getTouchEvent());
+    assertFalse(keyEventContext.getTouchEvent().isPresent());
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
index c5365fc..cfda1dd 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
@@ -29,12 +29,14 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
 
 import android.os.Handler;
 import android.os.Looper;
@@ -46,8 +48,11 @@
 /**
  */
 public class KeyEventHandlerTest extends InstrumentationTestCaseWithMock {
+
   private static Key createDummyKey(int keyCode, int longPressKeyCode, boolean isRepeatable) {
-    KeyEntity keyEntity = new KeyEntity(1, keyCode, longPressKeyCode, 0, null, false, null);
+    KeyEntity keyEntity = new KeyEntity(
+        1, keyCode, longPressKeyCode, true, 0,
+        Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
     Flick flick = new Flick(Direction.CENTER, keyEntity);
     KeyState keyState =
         new KeyState("",
@@ -55,7 +60,8 @@
                      Collections.<MetaState>emptySet(),
                      Collections.<MetaState>emptySet(),
                      Collections.singletonList(flick));
-    return new Key(0, 0, 0, 0, 0, 0, isRepeatable, false, false, Stick.EVEN,
+    return new Key(0, 0, 0, 0, 0, 0, isRepeatable, false, Stick.EVEN,
+                   DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                    Collections.singletonList(keyState));
   }
 
@@ -94,8 +100,16 @@
   }
 
   @SmallTest
-  public void testHandlerMessage_longPressKey() {
+  public void testHandlerMessage_longPressKey_withoutCallback() {
     KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
+    Key key = createDummyKey('a', 'A', false);
+    KeyEventContext keyEventContext = createDummyKeyEventContext(key);
+    KeyEventHandler keyEventHandler =
+        new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
+    Handler handler = keyEventHandler.handler;
+    Message message = handler.obtainMessage(
+        KeyEventHandler.LONG_PRESS_KEY, 0, 0, keyEventContext);
+
     keyboardActionListener.onKey(
         'A',
         Collections.singletonList(TouchEvent.newBuilder()
@@ -105,18 +119,40 @@
             .build()));
     replayAll();
 
+    keyEventHandler.handleMessage(message);
+
+    verifyAll();
+    assertTrue(keyEventContext.pastLongPressSentTimeout);
+    assertFalse(handler.hasMessages(KeyEventHandler.LONG_PRESS_KEY, keyEventContext));
+  }
+
+  @SmallTest
+  public void testHandlerMessage_longPressKey_withCallback() {
+    KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
     Key key = createDummyKey('a', 'A', false);
     KeyEventContext keyEventContext = createDummyKeyEventContext(key);
-
     KeyEventHandler keyEventHandler =
         new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
     Handler handler = keyEventHandler.handler;
     Message message = handler.obtainMessage(
-        KeyEventHandler.LONG_PRESS_KEY, 'A', 0, keyEventContext);
+        KeyEventHandler.LONG_PRESS_KEY, 0, 0, keyEventContext);
+    Runnable callback = createMock(Runnable.class);
+    keyEventContext.longPressCallback = Optional.of(callback);
+
+    keyboardActionListener.onKey(
+        'A',
+        Collections.singletonList(TouchEvent.newBuilder()
+            .setSourceId(1)
+            .addStroke(KeyEventContext.createTouchPosition(
+                TouchAction.TOUCH_DOWN, 0, 0, 100, 60, 0))
+            .build()));
+    callback.run();
+    replayAll();
+
     keyEventHandler.handleMessage(message);
 
     verifyAll();
-    assertTrue(keyEventContext.longPressSent);
+    assertTrue(keyEventContext.pastLongPressSentTimeout);
     assertFalse(handler.hasMessages(KeyEventHandler.LONG_PRESS_KEY, keyEventContext));
   }
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
index 74ecc90..b39e9a7 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
@@ -29,6 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
 
@@ -53,18 +54,55 @@
     KeyState defaultState = new KeyState("", Collections.<MetaState>emptySet(),
         Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
         Collections.<Flick>emptySet());
+    KeyState fallbackState = new KeyState("",  EnumSet.of(MetaState.FALLBACK, MetaState.COMPOSING),
+        Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+        Collections.<Flick>emptySet());
 
     EnumSet<MetaState> givenMetaStates =
         EnumSet.of(MetaState.SHIFT, MetaState.CAPS_LOCK);
 
-    Key key12 = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
-                        Arrays.asList(defaultState, state1, state2));
+    Key default12 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                            DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                            Arrays.asList(defaultState, state1, state2));
     // Both state1 and state2 are eligible to givenMetaStates but state1 is expected as
     // it is registered earlier.
-    assertSame(state1, key12.getKeyState(givenMetaStates).get());
+    assertSame(state1, default12.getKeyState(givenMetaStates).get());
 
-    Key key21 = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
-                        Arrays.asList(defaultState, state2, state1));
-    assertSame(state2, key21.getKeyState(givenMetaStates).get());
+    Key default21 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                            DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                            Arrays.asList(defaultState, state2, state1));
+    assertSame(state2, default21.getKeyState(givenMetaStates).get());
+
+    Key fallback12 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                             DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                             Arrays.asList(fallbackState, state1, state2));
+    assertSame(state1, fallback12.getKeyState(givenMetaStates).get());
+    assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.GLOBE)).get());
+    assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.COMPOSING)).get());
+
+    Key fallback21 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+                             DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                             Arrays.asList(fallbackState, state2, state1));
+    assertSame(state2, fallback21.getKeyState(givenMetaStates).get());
+    assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.GLOBE)).get());
+    assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.COMPOSING)).get());
+  }
+
+  public void testKey_fallbackAndDefault() {
+    KeyState defaultState = new KeyState("", Collections.<MetaState>emptySet(),
+        Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+        Collections.<Flick>emptySet());
+    KeyState fallbackState = new KeyState("",  EnumSet.of(MetaState.FALLBACK, MetaState.SHIFT),
+        Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+        Collections.<Flick>emptySet());
+    try {
+      new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+              DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+              Arrays.asList(defaultState, fallbackState));
+    } catch (IllegalArgumentException e) {
+      // Expected.
+      return;
+    }
+    fail("Duplicate default/fallback keys should be denied.");
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java
new file mode 100644
index 0000000..ee42924
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java
@@ -0,0 +1,106 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.test.InstrumentationTestCase;
+
+/**
+ */
+public class KeyboardFactoryTest extends InstrumentationTestCase {
+
+  public void testGet() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    // With portrait/landscape keyboard size for HVGA display;
+    Rect portrait = new Rect(0, 0, 320, 480);
+    Rect landscape = new Rect(0, 0, 480, 320);
+
+    KeyboardFactory factory = new KeyboardFactory();
+
+    // Tests for portrait ones.
+    Keyboard portraitTwelveKeyKeyboard =
+        factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, portrait.width(),
+                    portrait.height());
+    assertNotNull(portraitTwelveKeyKeyboard);
+
+    Keyboard portraitQwertyKeyboard =
+        factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+                    portrait.height());
+    assertNotNull(portraitQwertyKeyboard);
+
+    // Those instances should be different.
+    assertNotSame(portraitTwelveKeyKeyboard, portraitQwertyKeyboard);
+
+    // The same instance should be returned for same resource and specification.
+    assertSame(portraitTwelveKeyKeyboard,
+               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+                           portrait.width(), portrait.height()));
+    assertSame(portraitQwertyKeyboard,
+               factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+                           portrait.height()));
+
+    // Then tests for landscape ones. The keyboards for landscape should be different from portrait
+    // ones.
+    Keyboard landscapeTwelveKeyKeyboard =
+        factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, landscape.width(),
+                    landscape.height());
+    assertNotNull(landscapeTwelveKeyKeyboard);
+    assertNotSame(portraitTwelveKeyKeyboard, landscapeTwelveKeyKeyboard);
+
+    Keyboard landscapeQwertyKeyboard =
+        factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
+                    landscape.height());
+    assertNotNull(landscapeQwertyKeyboard);
+    assertNotSame(portraitQwertyKeyboard, landscapeQwertyKeyboard);
+
+    // Those instances should be different.
+    assertNotSame(landscapeTwelveKeyKeyboard, landscapeQwertyKeyboard);
+
+    // The same instance should be returned for same resource and specification.
+    assertSame(landscapeTwelveKeyKeyboard,
+               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+                           landscape.width(), landscape.height()));
+    assertSame(landscapeQwertyKeyboard,
+               factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
+                           landscape.height()));
+
+    // Assuming the cache is large enough, the same instance should be used for portrait even after
+    // we load ones for landscape.
+    assertSame(portraitTwelveKeyKeyboard,
+               factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+                           portrait.width(), portrait.height()));
+    assertSame(portraitQwertyKeyboard,
+               factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+                           portrait.height()));
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
index cd33ffb..750ba2c 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
@@ -29,14 +29,12 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
-import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser.KeyAttributes;
+import com.google.common.base.Optional;
 
 import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
 import android.test.InstrumentationTestCase;
-import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
@@ -44,20 +42,13 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
-import java.util.Collections;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  */
 public class KeyboardParserTest extends InstrumentationTestCase {
 
-  private static int getDefaultKeyCode(Keyboard keyboard, int rowIndex, int colIndex) {
-    Row row = keyboard.getRowList().get(rowIndex);
-    Key key = row.getKeyList().get(colIndex);
-    // Expecting corresponding KeyState is always found.
-    KeyState keyState = key.getKeyState(Collections.<MetaState>emptySet()).get();
-    return keyState.getFlick(Flick.Direction.CENTER).getKeyEntity().getKeyCode();
-  }
-
   private static int intToComplex(int value) {
     if (value != value << TypedValue.COMPLEX_MANTISSA_SHIFT >> TypedValue.COMPLEX_MANTISSA_SHIFT) {
       throw new IllegalArgumentException("Complex doesn't support: " + value);
@@ -72,26 +63,28 @@
     TypedValue value = new TypedValue();
 
     // If the value is null, default value should be returned.
-    assertEquals(10, KeyboardParser.getDimensionOrFraction(null, 500, 10, metrics));
-    assertEquals(30, KeyboardParser.getDimensionOrFraction(null, 500, 30, metrics));
+    assertEquals(10, KeyboardParser.getDimensionOrFraction(
+        Optional.<TypedValue>absent(), 500, 10, metrics));
+    assertEquals(30, KeyboardParser.getDimensionOrFraction(
+        Optional.<TypedValue>absent(), 500, 30, metrics));
 
     // If the type is dimension, the pixel should be calculated based on metrics.
     value.type = TypedValue.TYPE_DIMENSION;
     value.data = intToComplex(100) | (TypedValue.COMPLEX_UNIT_DIP << TypedValue.COMPLEX_UNIT_SHIFT);
     metrics.density = 10;
-    assertEquals(1000, KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics));
+    assertEquals(1000, KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics));
 
     // If the type is fraction, the result is calculated based on given 'base' parameter.
     value.type = TypedValue.TYPE_FRACTION;
     value.data = intToComplex(10) |
         (TypedValue.COMPLEX_UNIT_FRACTION << TypedValue.COMPLEX_UNIT_SHIFT);
-    assertEquals(5000, KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics));
+    assertEquals(5000, KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics));
 
     // Otherwise exception should be thrown.
     value.type = TypedValue.TYPE_STRING;
     value.data = 0;
     try {
-      KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics);
+      KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics);
       fail("IllegalArgumentException is expected.");
     } catch (IllegalArgumentException e) {
       // Pass.
@@ -102,28 +95,28 @@
   public void testGetCode() {
     TypedValue value = new TypedValue();
 
-    // If the value is null, default value should be returned.
-    assertEquals(10, KeyboardParser.getCode(null, 10));
-    assertEquals(0x61, KeyboardParser.getCode(null, 0x61));
+    // If the value is Optional.absent(), default value should be returned.
+    assertEquals(10, KeyboardParser.getCode(Optional.<TypedValue>absent(), 10));
+    assertEquals(0x61, KeyboardParser.getCode(Optional.<TypedValue>absent(), 0x61));
 
     // If the value is decimal or hexadecimal integer, the value should be returned.
     value.type = TypedValue.TYPE_INT_DEC;
     value.data = 30;
-    assertEquals(30, KeyboardParser.getCode(value, 10));
+    assertEquals(30, KeyboardParser.getCode(Optional.of(value), 10));
 
     value.type = TypedValue.TYPE_INT_HEX;
     value.data = 30;
-    assertEquals(30, KeyboardParser.getCode(value, 10));
+    assertEquals(30, KeyboardParser.getCode(Optional.of(value), 10));
 
     // If type is string, the whole string will be parsed.
     value.type = TypedValue.TYPE_STRING;
     value.data = 0;
     value.string = "12345";
-    assertEquals(12345, KeyboardParser.getCode(value, 10));
+    assertEquals(12345, KeyboardParser.getCode(Optional.of(value), 10));
 
     value.string = "123asd";
     try {
-      KeyboardParser.getCode(value, 10);
+      KeyboardParser.getCode(Optional.of(value), 10);
       fail("An exception is expected.");
     } catch (NumberFormatException e) {
       // pass
@@ -131,138 +124,96 @@
   }
 
   @SmallTest
-  public void testToStringOrNull() {
-    // Null should be returned when null is a given argument.
-    assertNull(KeyboardParser.toStringOrNull(null));
-
-    // Otherwise, the toString'ed value is returned.
-    assertEquals("abcde", KeyboardParser.toStringOrNull("abcde"));
-  }
-
-  @SmallTest
-  public void testParseKeyboard()
-      throws NotFoundException, XmlPullParserException, IOException {
-    Resources resources = getInstrumentation().getTargetContext().getResources();
-    int keyboardWidth = 480;
-    int keyboardHeight = 200;
-    // Adding a mock resource on testing package causes a compile error for now,
-    // So, we'll use product resource for testing purpose.
-    // TODO(hidehiko): Figure out how to create a mock resource and replace this by it.
-    KeyboardParser parser = new KeyboardParser(
-        resources, resources.getXml(R.xml.kbd_12keys_flick_kana), keyboardWidth, keyboardHeight);
-
-    // Note: put test XML file under tests/res directory doesn't work,
-    // so, instead, read actual 12keys keyboard layout and check its properties.
-    Keyboard keyboard = parser.parseKeyboard();
-
-    // Make sure (x,y)-coords are expectedly annotated.
-    {
-      int y = 0;
-      for (Row row : keyboard.getRowList()) {
-        int x = 0;
-        for (Key key : row.getKeyList()) {
-          assertEquals(x, key.getX());
-          assertEquals(y, key.getY());
-          x += key.getWidth();
-        }
-        y += row.getHeight() + row.getVerticalGap();
-      }
-    }
-
-    // The keyboard should have 5 rows, and each row should contain 5 keys.
-    // The top row is a dummy row in order to make a space at top of the keyboard.
-    // We'll skip it in the assertions below.
-    assertEquals(5, keyboard.getRowList().size());
-    for (Row row : keyboard.getRowList().subList(1, 5)) {
-      assertEquals(5, row.getKeyList().size());
-    }
-
-    // Make sure main 12 keys' keycodes.
-    assertEquals('1', getDefaultKeyCode(keyboard, 1, 1));
-    assertEquals('2', getDefaultKeyCode(keyboard, 1, 2));
-    assertEquals('3', getDefaultKeyCode(keyboard, 1, 3));
-
-    assertEquals('4', getDefaultKeyCode(keyboard, 2, 1));
-    assertEquals('5', getDefaultKeyCode(keyboard, 2, 2));
-    assertEquals('6', getDefaultKeyCode(keyboard, 2, 3));
-
-    assertEquals('7', getDefaultKeyCode(keyboard, 3, 1));
-    assertEquals('8', getDefaultKeyCode(keyboard, 3, 2));
-    assertEquals('9', getDefaultKeyCode(keyboard, 3, 3));
-
-    assertEquals('*', getDefaultKeyCode(keyboard, 4, 1));
-    assertEquals('0', getDefaultKeyCode(keyboard, 4, 2));
-    assertEquals('#', getDefaultKeyCode(keyboard, 4, 3));
-
-    // A key to change keyboard-layout should have longPressKeycode.
-    MoreAsserts.assertNotEqual(
-        KeyEntity.INVALID_KEY_CODE,
-        keyboard.getRowList().get(4).getKeyList().get(0)
-            .getKeyState(Collections.<MetaState>emptySet()).get()
-            .getFlick(Flick.Direction.CENTER).getKeyEntity().getLongPressKeyCode());
-
-    // Heights of rows are inherited from Keyboard element.
-    for (Row row : keyboard.getRowList().subList(1, 5)) {
-      assertTrue(row.getHeight() > 0);
-    }
-
-    // Following hard-coded parameters come from kbd_12keys_flick_kana.xml.
-    // TODO(hidehiko): Use a layout resource only for testing purpose, or create a mock xml data.
-    int keyWidth = (int) Math.round(keyboardWidth * 21.8 / 100);
-    int functionKeyWidth = (int) Math.round(keyboardWidth * 17.3 / 100);
-
-    // Width of keys are inherited from Keyboard element, but can be overwritten.
-    for (Row row : keyboard.getRowList().subList(1, 5)) {
-      // Left/Right side key.
-      assertEquals(functionKeyWidth, row.getKeyList().get(0).getWidth());
-      assertEquals(functionKeyWidth, row.getKeyList().get(4).getWidth());
-
-      // Other keys.
-      assertEquals(keyWidth, row.getKeyList().get(1).getWidth());
-      assertEquals(keyWidth, row.getKeyList().get(2).getWidth());
-      assertEquals(keyWidth, row.getKeyList().get(3).getWidth());
-    }
-
-    // All right side keys (except for space key) have isRepeatable attribute.
-    for (Row row : keyboard.getRowList().subList(1, 5)) {
-      Key key = row.getKeyList().get(4);
-      boolean isSpace = key.getKeyState(Collections.<MetaState>emptySet()).get()
-                           .getFlick(Direction.CENTER).getKeyEntity().getKeyCode() == ' ';
-      assertEquals(!isSpace, key.isRepeatable());
-    }
-
-    // All keys should have popup.
-    for (Row row : keyboard.getRowList().subList(1, 5)) {
-      for (Key key : row.getKeyList()) {
-        Flick flick = key.getKeyState(Collections.<MetaState>emptySet()).get()
-            .getFlick(Flick.Direction.CENTER);
-        assertNotNull(flick.getKeyEntity().getPopUp());
-      }
-    }
-  }
-
-  @SmallTest
   public void testKeyboardParserBlackBoxTest() throws XmlPullParserException, IOException {
     // Just in order to test all keyboard xml files can be parsed without exception,
     // we'll try to just parse them.
     // TODO(hidehiko): Move this test to somewhere, when we support regression test framework
     //                 for MechaMozc.
-    int[] resourceIds = {
-        R.xml.kbd_12keys_kana,
-        R.xml.kbd_12keys_flick_kana,
-        R.xml.kbd_12keys_abc,
-        R.xml.kbd_12keys_123,
-        R.xml.kbd_12keys_qwerty_abc,
-        R.xml.kbd_qwerty_kana,
-        R.xml.kbd_qwerty_kana_123,
-        R.xml.kbd_qwerty_abc,
-        R.xml.kbd_qwerty_abc_123,
-    };
-
     Resources resources = getInstrumentation().getTargetContext().getResources();
-    for (int resourceId : resourceIds) {
-      KeyboardParser parser = new KeyboardParser(resources, resources.getXml(resourceId), 480, 200);
+    for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+      if (specification.getXmlLayoutResourceId() == 0) {
+        continue;
+      }
+      KeyboardParser parser = new KeyboardParser(resources, 480, 200, specification);
       assertNotNull(parser.parseKeyboard());
     }
   }
+
+  @SmallTest
+  public void testBuildKeyList_simpleCase() {
+    List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+        KeyAttributes.newBuilder().setWidth(50).build(),
+        KeyAttributes.newBuilder().setHorizontalLayoutWeight(4).build(),
+        KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build()),
+        0, 100);
+    assertEquals(0, keys.get(0).getX());
+    assertEquals(50, keys.get(0).getWidth());
+    assertEquals(50, keys.get(1).getX());
+    assertEquals(40, keys.get(1).getWidth());
+    assertEquals(90, keys.get(2).getX());
+    assertEquals(10, keys.get(2).getWidth());
+  }
+
+  @SmallTest
+  public void testBuildKeyList_widthAndWeight1() {
+    List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+        KeyAttributes.newBuilder().setWidth(50).build(),
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build(),
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build()),
+        0, 100);
+    assertEquals(0, keys.get(0).getX());
+    assertEquals(50, keys.get(0).getWidth());
+    assertEquals(50, keys.get(1).getX());
+    assertEquals(30, keys.get(1).getWidth());
+    assertEquals(80, keys.get(2).getX());
+    assertEquals(20, keys.get(2).getWidth());
+  }
+
+  @SmallTest
+  public void testBuildKeyList_widthAndWeight2() {
+    List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build(),
+        KeyAttributes.newBuilder().setWidth(50).build(),
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build()),
+        0, 100);
+    assertEquals(0, keys.get(0).getX());
+    assertEquals(20, keys.get(0).getWidth());
+    assertEquals(20, keys.get(1).getX());
+    assertEquals(50, keys.get(1).getWidth());
+    assertEquals(70, keys.get(2).getX());
+    assertEquals(30, keys.get(2).getWidth());
+  }
+
+  @SmallTest
+  public void testBuildKeyList_widthAndWeight3() {
+    List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build(),
+        KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build(),
+        KeyAttributes.newBuilder().setWidth(50).build()),
+        0, 100);
+    assertEquals(0, keys.get(0).getX());
+    assertEquals(20, keys.get(0).getWidth());
+    assertEquals(20, keys.get(1).getX());
+    assertEquals(30, keys.get(1).getWidth());
+    assertEquals(50, keys.get(2).getX());
+    assertEquals(50, keys.get(2).getWidth());
+  }
+
+  @SmallTest
+  public void testBuildKeyList_widthAndWeight4() {
+    List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+        KeyAttributes.newBuilder().setWidth(20).build(),
+        KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build(),
+        KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build(),
+        KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build()),
+        0, 100);
+    assertEquals(0, keys.get(0).getX());
+    assertEquals(20, keys.get(0).getWidth());
+    assertEquals(20, keys.get(1).getX());
+    assertEquals(27, keys.get(1).getWidth());
+    assertEquals(47, keys.get(2).getX());
+    assertEquals(26, keys.get(2).getWidth());
+    assertEquals(73, keys.get(3).getX());
+    assertEquals(27, keys.get(3).getWidth());
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java
new file mode 100644
index 0000000..0faf27a
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java
@@ -0,0 +1,124 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
+
+import android.app.Instrumentation;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Test for {@code Keyboard}.
+ */
+public class KeyboardTest extends InstrumentationTestCase {
+
+  public static Keyboard createKeyboard(KeyboardSpecification spec,
+      Instrumentation instrumentation) {
+    Resources resources = instrumentation.getTargetContext().getResources();
+    KeyboardParser parser = new KeyboardParser(resources, 480, 200, spec);
+    try {
+      return parser.parseKeyboard();
+    } catch (NotFoundException e) {
+      fail(e.getMessage());
+    } catch (XmlPullParserException e) {
+      fail(e.getMessage());
+    } catch (IOException e) {
+      fail(e.getMessage());
+    }
+
+    throw new AssertionError("Should never reach here");
+  }
+
+  @SmallTest
+  public void testConstructor() {
+    for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+      // when ResourceId is 0, it means this specification has no Keyboard
+      if (specification.getXmlLayoutResourceId() == 0) {
+        continue;
+      }
+      // Make sure that all specification has corresponding JapaneseKeyboard instance,
+      // and it has the given specification.
+      Keyboard keyboard = createKeyboard(specification, getInstrumentation());
+      assertEquals(specification.toString(), specification,
+          keyboard.getSpecification());
+    }
+  }
+
+  @SmallTest
+  public void testGetKeyboardName() {
+    Pattern pattern = Pattern.compile("^(\\w+)-(\\d+)\\.(\\d+)\\.(\\d+)-(\\w+)$");
+    Configuration configuration = new Configuration();
+    for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+      for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
+                                        Configuration.ORIENTATION_LANDSCAPE}) {
+        configuration.orientation = orientation;
+        KeyboardSpecificationName keyboardSpecificationName =
+            specification.getKeyboardSpecificationName();
+        String name = keyboardSpecificationName.formattedKeyboardName(configuration);
+        Matcher matcher = pattern.matcher(name);
+        assertTrue(matcher.matches());
+        assertEquals(keyboardSpecificationName.baseName, matcher.group(1));
+        assertEquals(Integer.toString(keyboardSpecificationName.major), matcher.group(2));
+        assertEquals(Integer.toString(keyboardSpecificationName.minor), matcher.group(3));
+        assertEquals(Integer.toString(keyboardSpecificationName.revision), matcher.group(4));
+        assertEquals(KeyboardSpecificationName.getDeviceOrientationString(configuration),
+                     matcher.group(5));
+      }
+    }
+  }
+
+  @SmallTest
+  public void testGetKeycodeMapper() {
+    ProbableKeyEventGuesser guesser = new ProbableKeyEventGuesser(
+        getInstrumentation().getTargetContext().getAssets());
+    Configuration configuration = new Configuration();
+    configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
+    guesser.setConfiguration(Optional.of(configuration));
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+
+    Keyboard godanKana = createKeyboard(KeyboardSpecification.GODAN_KANA, getInstrumentation());
+    assertEquals(resources.getInteger(R.integer.uchar_digit_two), godanKana.getKeyCode(10));
+    assertEquals(Integer.MIN_VALUE, godanKana.getKeyCode(123456));  // No corresponding key
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
index af883dc..aaa63fd 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
@@ -35,55 +35,75 @@
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyboardViewBackgroundSurface.SurfaceCanvas;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
 import com.google.common.base.Optional;
 
+import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.test.MoreAsserts;
-import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import org.easymock.IMocksControl;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.Set;
 
 /**
  */
 public class KeyboardViewBackgroundSurfaceTest extends InstrumentationTestCaseWithMock {
+
   private static final int WIDTH = 50;
   private static final int HEIGHT = 30;
   private static final int HORIZONTAL_GAP = 4;
 
   private DrawableCache createDrawableCacheMock() {
     return createMockBuilder(DrawableCache.class)
-        .withConstructor(MozcDrawableFactory.class)
-        .withArgs(new MozcDrawableFactory(new MockResources()))
+        .withConstructor(Resources.class)
+        .withArgs(new MockResourcesWithDisplayMetrics())
         .createMock();
   }
 
   private static Key createDummyKey(int x, int y, int iconResourceId, DrawableType drawableType) {
     KeyEntity keyEntity = new KeyEntity(
-        1, 'a', KeyEntity.INVALID_KEY_CODE, iconResourceId, drawableType, false, null);
+        1, 'a', KeyEntity.INVALID_KEY_CODE, true, iconResourceId, Optional.<String>absent(),
+        false, Optional.<PopUp>absent(), 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
     Flick centerFlick = new Flick(Direction.CENTER, keyEntity);
     KeyState keyState = new KeyState("",
                                      Collections.<MetaState>emptySet(),
                                      Collections.<MetaState>emptySet(),
                                      Collections.<MetaState>emptySet(),
                                      Collections.singletonList(centerFlick));
-    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false,
-                   Stick.EVEN, Collections.singletonList(keyState));
+    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false,
+                   Stick.EVEN, drawableType, Collections.singletonList(keyState));
+  }
+
+  private static KeyEntity createInvalidKeyEntity(
+      int sourceId, int keyCode, int keyIconResourceId) {
+    return new KeyEntity(
+        sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, keyIconResourceId,
+        Optional.<String>absent(), false, Optional.<PopUp>absent(),
+        0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
+  }
+
+  private static KeyEntity createInvalidKeyEntity() {
+    return createInvalidKeyEntity(1, 'a', 0);
   }
 
   @SmallTest
   public void testInitialize() {
-    KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(null, null);
+    Resources resources = createNiceMock(MockResourcesWithDisplayMetrics.class);
+    KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+        new BackgroundDrawableFactory(resources),
+        new DrawableCache(resources));
 
     // If the surface is an instance constructed right now, initialization is needed later.
     surface.requestUpdateSize(100, 100);
@@ -106,17 +126,14 @@
 
   @SmallTest
   public void testGetKeyEntityForRendering() {
-    KeyEntity centerEntity =
-        new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0,
-                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
-    KeyEntity leftEntity =
-        new KeyEntity(2, 'b', KeyEntity.INVALID_KEY_CODE, 0,
-                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
+    KeyEntity centerEntity = createInvalidKeyEntity(1, 'a', 0);
+    KeyEntity leftEntity = createInvalidKeyEntity(2, 'b', 0);
     Flick centerFlick = new Flick(Direction.CENTER, centerEntity);
     Flick leftFlick = new Flick(Direction.LEFT, leftEntity);
 
     Key key = new Key(
-        0, 0, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+        0, 0, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         Collections.singletonList(
             new KeyState("",
                          Collections.<MetaState>emptySet(),
@@ -128,84 +145,72 @@
     assertSame(
         centerEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, Collections.<MetaState>emptySet(), null));
+            key, Collections.<MetaState>emptySet(), Optional.<Direction>absent()).get());
 
     // If this is the pressed key without flick, the center key entity should be returned.
     assertSame(
         centerEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, Collections.<MetaState>emptySet(), Direction.CENTER));
+            key, Collections.<MetaState>emptySet(), Optional.of(Direction.CENTER)).get());
 
     // If the flick state is set to the pressedKey, it should be returned.
     assertSame(
         leftEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, Collections.<MetaState>emptySet(), Direction.LEFT));
+            key, Collections.<MetaState>emptySet(), Optional.of(Direction.LEFT)).get());
 
     // If the key doesn't have a KeyEntity for the current state, the default key entity
     // should be returned.
     assertSame(
         centerEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, EnumSet.of(MetaState.CAPS_LOCK), Direction.RIGHT));
+            key, EnumSet.of(MetaState.CAPS_LOCK), Optional.of(Direction.RIGHT)).get());
     assertSame(
         centerEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, EnumSet.of(MetaState.CAPS_LOCK), null));
+            key, EnumSet.of(MetaState.CAPS_LOCK), Optional.<Direction>absent()).get());
     assertSame(
         centerEntity,
         KeyboardViewBackgroundSurface.getKeyEntityForRendering(
-            key, EnumSet.of(MetaState.CAPS_LOCK), Direction.CENTER));
-  }
-
-  @SmallTest
-  public void testGetKeyBackground_withoutBackground() {
-    KeyboardViewBackgroundSurface surface =
-        new KeyboardViewBackgroundSurface(new BackgroundDrawableFactory(1f), null);
-
-    // Null should be returned for null KeyEntity.
-    assertNull(surface.getKeyBackground(null, true));
-    assertNull(surface.getKeyBackground(null, false));
-
-    // Null should be returned for a KeyEntity without background.
-    KeyEntity keyEntity = new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
-    assertNull(surface.getKeyBackground(keyEntity, true));
-    assertNull(surface.getKeyBackground(keyEntity, false));
+            key, EnumSet.of(MetaState.CAPS_LOCK), Optional.of(Direction.CENTER)).get());
   }
 
   @SmallTest
   public void testGetKeyBackground_withBackground() {
-    BackgroundDrawableFactory factory = new BackgroundDrawableFactory(1f);
+    BackgroundDrawableFactory factory =
+        new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
 
     Drawable background = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
     replayAll();
 
-    KeyEntity keyEntity =
-        new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0,
-                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
-
-    KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(factory, null);
+    Key key = createDummyKey(0, 0, 0, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
+    KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+        factory, new DrawableCache(new MockResourcesWithDisplayMetrics()));
 
     // The icon should be returned with appropriate state.
-    assertSame(background, surface.getKeyBackground(keyEntity, false));
+    assertSame(background, surface.getKeyBackground(key, false).get());
     MoreAsserts.assertEquals(new int[]{}, background.getState());
 
-    assertSame(background, surface.getKeyBackground(keyEntity, true));
+    assertSame(background, surface.getKeyBackground(key, true).get());
     MoreAsserts.assertEquals(new int[]{ android.R.attr.state_pressed }, background.getState());
   }
 
   @SmallTest
   public void testGetKeyIcon_withoutIcon() {
-    DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(new MockResources()));
+    DrawableCache drawableCache = new DrawableCache(new MockResourcesWithDisplayMetrics());
 
-    // Null should be returned for null KeyEntity.
-    assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, null, true));
-    assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, null, false));
+    // Optional.absent() should be returned for Optional.absent() KeyEntity.
+    assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.<KeyEntity>absent(), true).isPresent());
+    assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.<KeyEntity>absent(), false).isPresent());
 
-    // Null should be returned for a KeyEntity without icon.
-    KeyEntity keyEntity = new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
-    assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, true));
-    assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, false));
+    // Optional.absent() should be returned for a KeyEntity without icon.
+    KeyEntity keyEntity = createInvalidKeyEntity();
+    assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.of(keyEntity), true).isPresent());
+    assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.of(keyEntity), false).isPresent());
   }
 
   @SmallTest
@@ -215,14 +220,15 @@
     DrawableCache drawableCache = createDrawableCacheMock();
     expect(drawableCache.getDrawable(iconResourceId)).andStubReturn(Optional.of(icon));
     replayAll();
-    KeyEntity keyEntity =
-        new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, iconResourceId, null, false, null);
+    KeyEntity keyEntity = createInvalidKeyEntity(1, 'a', iconResourceId);
 
     // The icon should be returned with appropriate state.
-    assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, false));
+    assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.of(keyEntity), false).get());
     MoreAsserts.assertEquals(new int[]{}, icon.getState());
 
-    assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, true));
+    assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(
+        drawableCache, Optional.of(keyEntity), true).get());
     MoreAsserts.assertEquals(new int[]{ android.R.attr.state_pressed }, icon.getState());
   }
 
@@ -230,8 +236,8 @@
   public void testSenarioTest() {
     IMocksControl drawableCacheControl = createControl();
     DrawableCache drawableCache = createMockBuilder(DrawableCache.class)
-        .withConstructor(MozcDrawableFactory.class)
-        .withArgs(new MozcDrawableFactory(new MockResources()))
+        .withConstructor(Resources.class)
+        .withArgs(new MockResourcesWithDisplayMetrics())
         .createMock(drawableCacheControl);
 
     Drawable icon1 = new ColorDrawable();
@@ -274,21 +280,18 @@
     Drawable leftIcon7 = new ColorDrawable();
     int icon7ResourceId = 13;
     int leftIcon7ResourceId = 15;
-    Flick centerFlick7 = new Flick(
-        Direction.CENTER,
-        new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, icon7ResourceId,
-                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null));
-    Flick leftFlick7 = new Flick(
-        Direction.LEFT,
-        new KeyEntity(2, 'a', KeyEntity.INVALID_KEY_CODE, leftIcon7ResourceId,
-                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null));
+    Flick centerFlick7 =
+        new Flick(Direction.CENTER, createInvalidKeyEntity(1, 'a', icon7ResourceId));
+    Flick leftFlick7 =
+        new Flick(Direction.LEFT, createInvalidKeyEntity(2, 'a', leftIcon7ResourceId));
     KeyState keyState = new KeyState("",
                                      Collections.<MetaState>emptySet(),
                                      Collections.<MetaState>emptySet(),
                                      Collections.<MetaState>emptySet(),
                                      Arrays.asList(centerFlick7, leftFlick7));
-    Key key7 = new Key(0, HEIGHT * 2, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false,
-                       Stick.EVEN, Collections.singletonList(keyState));
+    Key key7 = new Key(0, HEIGHT * 2, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false,
+                       Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+                       Collections.singletonList(keyState));
     expect(drawableCache.getDrawable(icon7ResourceId)).andStubReturn(Optional.of(icon7));
     expect(drawableCache.getDrawable(leftIcon7ResourceId)).andStubReturn(Optional.of(leftIcon7));
 
@@ -311,7 +314,8 @@
             new Row(Arrays.asList(key1, key2, key3), HEIGHT, 0),
             new Row(Arrays.asList(key4, key5, key6), HEIGHT, 0),
             new Row(Arrays.asList(key7, key8, key9), HEIGHT, 0)),
-        1);
+        1,
+        KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
 
     IMocksControl canvasControl = createControl();
     final SurfaceCanvas canvas = canvasControl.createMock(SurfaceCanvas.class);
@@ -320,7 +324,8 @@
     int expectedKeyWidth = WIDTH - HORIZONTAL_GAP;
     int expectedKeyHeight = HEIGHT;
 
-    BackgroundDrawableFactory factory = new BackgroundDrawableFactory(1f);
+    BackgroundDrawableFactory factory =
+        new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
     Drawable background = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
 
     // The first case is just a simple senario, just setting a new keyboard.
@@ -362,7 +367,7 @@
       @Override
       void initialize() {
         super.initialize();
-        this.surfaceCanvas = canvas;
+        this.surfaceCanvas = Optional.of(canvas);
       }
     };
 
@@ -385,8 +390,8 @@
         leftIcon7, 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
     canvasControl.replay();
 
-    surface.requestUpdateKey(key5, Direction.CENTER);
-    surface.requestUpdateKey(key7, Direction.LEFT);
+    surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
     surface.update();
 
     canvasControl.verify();
@@ -405,18 +410,18 @@
 
     canvasControl.replay();
 
-    surface.requestUpdateKey(key8, Direction.CENTER);
-    surface.requestUpdateKey(key8, Direction.LEFT);
-    surface.requestUpdateKey(key8, Direction.RIGHT);
-    surface.requestUpdateKey(key8, Direction.CENTER);
-    surface.requestUpdateKey(key8, Direction.UP);
-    surface.requestUpdateKey(key8, Direction.DOWN);
-    surface.requestUpdateKey(key8, null);
+    surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key8, Optional.of(Direction.LEFT));
+    surface.requestUpdateKey(key8, Optional.of(Direction.RIGHT));
+    surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key8, Optional.of(Direction.UP));
+    surface.requestUpdateKey(key8, Optional.of(Direction.DOWN));
+    surface.requestUpdateKey(key8, Optional.<Direction>absent());
 
-    surface.requestUpdateKey(key1, Direction.CENTER);
-    surface.requestUpdateKey(key1, Direction.UP);
-    surface.requestUpdateKey(key1, Direction.DOWN);
-    surface.requestUpdateKey(key1, Direction.CENTER);
+    surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key1, Optional.of(Direction.UP));
+    surface.requestUpdateKey(key1, Optional.of(Direction.DOWN));
+    surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
 
     surface.update();
 
@@ -457,8 +462,8 @@
         icon9, WIDTH * 2 + 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
     canvasControl.replay();
 
-    surface.requestUpdateKey(key5, Direction.CENTER);
-    surface.requestUpdateKey(key7, Direction.LEFT);
+    surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
 
     surface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
     surface.update();
@@ -500,28 +505,75 @@
         icon9, WIDTH * 2 + 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
     canvasControl.replay();
 
-    surface.requestUpdateKey(key5, Direction.CENTER);
-    surface.requestUpdateKey(key2, Direction.LEFT);
+    surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key2, Optional.of(Direction.LEFT));
 
     surface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
 
-    surface.requestUpdateKey(key8, Direction.CENTER);
-    surface.requestUpdateKey(key8, Direction.LEFT);
-    surface.requestUpdateKey(key8, Direction.RIGHT);
-    surface.requestUpdateKey(key8, Direction.CENTER);
-    surface.requestUpdateKey(key8, Direction.UP);
-    surface.requestUpdateKey(key8, Direction.DOWN);
-    surface.requestUpdateKey(key8, null);
+    surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key8, Optional.of(Direction.LEFT));
+    surface.requestUpdateKey(key8, Optional.of(Direction.RIGHT));
+    surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key8, Optional.of(Direction.UP));
+    surface.requestUpdateKey(key8, Optional.of(Direction.DOWN));
+    surface.requestUpdateKey(key8, Optional.<Direction>absent());
 
-    surface.requestUpdateKey(key1, Direction.CENTER);
-    surface.requestUpdateKey(key1, Direction.UP);
-    surface.requestUpdateKey(key1, Direction.DOWN);
-    surface.requestUpdateKey(key1, Direction.CENTER);
+    surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
+    surface.requestUpdateKey(key1, Optional.of(Direction.UP));
+    surface.requestUpdateKey(key1, Optional.of(Direction.DOWN));
+    surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
 
-    surface.requestUpdateKey(key7, Direction.LEFT);
+    surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
 
     surface.update();
 
     canvasControl.verify();
   }
+
+  @SmallTest
+  public void testRequestMetaState() {
+    Set<MetaState> empty = EnumSet.noneOf(MetaState.class);
+    Collection<Flick> center = Collections.singleton(
+        new Flick(Direction.CENTER,
+                  new KeyEntity(0, 0, 0, true, 0,
+                                Optional.<String>absent(), false, Optional.<PopUp>absent(),
+                                0, 0, 0, 0)));
+    Key keyWithNoMetaStates = new Key(
+        0, 0, 0, 0, 0, 0, false, false,
+        Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+        Arrays.asList(
+            new KeyState("", empty, empty, empty, center)));
+    Key keyWithCapsLock = new Key(
+        0, 0, 0, 0, 0, 0, false, false,
+        Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+        Arrays.asList(
+            new KeyState("", empty, empty, empty, center),
+            new KeyState("", EnumSet.of(MetaState.CAPS_LOCK), empty, empty, center)));
+    Keyboard keyboard = new Keyboard(Optional.of(""), Arrays.asList(
+        new Row(Arrays.asList(keyWithNoMetaStates, keyWithCapsLock), 0, 0)), 0,
+        KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+
+    KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+        new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class)),
+        createDrawableCacheMock());
+
+    surface.requestUpdateKeyboard(keyboard, EnumSet.noneOf(MetaState.class));
+
+    assertTrue(surface.pendingKeys.isEmpty());
+
+    // keyWithCapsLock is requested to be redrawn.
+    surface.requestMetaState(EnumSet.of(MetaState.CAPS_LOCK));
+    assertEquals(1, surface.pendingKeys.size());
+    assertSame(keyWithCapsLock, surface.pendingKeys.keySet().toArray()[0]);
+
+    // Same metastates. No update.
+    surface.pendingKeys.clear();
+    surface.requestMetaState(EnumSet.of(MetaState.CAPS_LOCK));
+    assertTrue(surface.pendingKeys.isEmpty());
+
+    // No metastete -> keyWithGlobe and keyWithCapsLock are redrawn.
+    surface.pendingKeys.clear();
+    surface.requestMetaState(EnumSet.noneOf(MetaState.class));
+    assertEquals(1, surface.pendingKeys.size());
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
index ac879c8..a6c8d8e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
@@ -29,24 +29,25 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
+import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.same;
 
 import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
 import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
-import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.base.Optional;
 
@@ -58,10 +59,12 @@
 import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.InputType;
+import android.util.DisplayMetrics;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 
+import org.easymock.Capture;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
 
@@ -82,7 +85,7 @@
    */
   private static final int STEP_COUNT = 20;
 
-  // Followings are parameters of a dummy key.
+  // The following are parameters of a dummy key.
   private static final int WIDTH = 50;
   private static final int HEIGHT = 30;
   private static final int HORIZONTAL_GAP = 0;
@@ -124,9 +127,15 @@
     return result;
   }
 
-  static KeyState createKeyState(Set<MetaState> metaState, int keyCode) {
-    KeyEntity entity = new KeyEntity(1, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
-    Flick flick = new Flick(Flick.Direction.CENTER, entity);
+  private static KeyEntity createInvalidKeyEntity(int sourceId, int keyCode) {
+    return new KeyEntity(
+        sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, 0,
+        Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
+  }
+
+  private static KeyState createKeyStateWithKeyEntity(
+      Set<MetaState> metaState, KeyEntity keyEntity) {
+    Flick flick = new Flick(Flick.Direction.CENTER, keyEntity);
     return new KeyState(
         "",
         metaState,
@@ -135,21 +144,36 @@
         Collections.singletonList(flick));
   }
 
-  static Key createKey(int x, int y, int keyCode) {
+  private static KeyState createKeyState(Set<MetaState> metaState, int keyCode) {
+    return createKeyStateWithKeyEntity(metaState, createInvalidKeyEntity(1, keyCode));
+  }
+
+  private static Key createKey(int x, int y, int keyCode) {
     return new Key(
-        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         Collections.singletonList(createKeyState(Collections.<MetaState>emptySet(), keyCode)));
   }
 
+  private static Key createKeyWithKeyEntity(int x, int y, KeyEntity keyEntity) {
+    return new Key(
+        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+        Collections.singletonList(
+            createKeyStateWithKeyEntity(Collections.<MetaState>emptySet(), keyEntity)));
+  }
+
   private static Key createSpacer(int x, int y, Stick stick) {
     return new Key(
-        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, stick,
+        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, stick,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         Collections.<KeyState>emptyList());
   }
 
   private static Key createKeyWithModifiedState(int x, int y, int keyCode, int modifiedKeyCode) {
     return new Key(
-        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+        x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         Arrays.asList(createKeyState(Collections.<MetaState>emptySet(), keyCode),
                       createKeyState(EnumSet.of(MetaState.CAPS_LOCK), modifiedKeyCode)));
   }
@@ -157,34 +181,25 @@
   private static Key createFlickKey(
       int x, int y,
       int centerKeyCode, int leftKeyCode, int rightKeyCode, int upKeyCode, int downKeyCode) {
-    Flick center = new Flick(
-        Flick.Direction.CENTER,
-        new KeyEntity(1, centerKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
-    Flick left = new Flick(
-        Flick.Direction.LEFT,
-        new KeyEntity(1, leftKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
-    Flick right = new Flick(
-        Flick.Direction.RIGHT,
-        new KeyEntity(1, rightKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
-    Flick up = new Flick(
-        Flick.Direction.UP,
-        new KeyEntity(1, upKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
-    Flick down = new Flick(
-        Flick.Direction.DOWN,
-        new KeyEntity(1, downKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
+    Flick center = new Flick(Flick.Direction.CENTER, createInvalidKeyEntity(1, centerKeyCode));
+    Flick left = new Flick(Flick.Direction.LEFT, createInvalidKeyEntity(1, leftKeyCode));
+    Flick right = new Flick(Flick.Direction.RIGHT, createInvalidKeyEntity(1, rightKeyCode));
+    Flick up = new Flick(Flick.Direction.UP, createInvalidKeyEntity(1, upKeyCode));
+    Flick down = new Flick(Flick.Direction.DOWN, createInvalidKeyEntity(1, downKeyCode));
     KeyState keyState = new KeyState(
         "",
         Collections.<MetaState>emptySet(),
         Collections.<MetaState>emptySet(),
         Collections.<MetaState>emptySet(),
         Arrays.asList(center, left, right, up, down));
-    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+                   DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                    Collections.singletonList(keyState));
   }
 
   private static Key createModifierKey(int x, int y, int keyCode, Set<MetaState> nextAddMetaStates,
                                        Set<MetaState> nextRemoveMetaStates) {
-    KeyEntity entity = new KeyEntity(1, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
+    KeyEntity entity = createInvalidKeyEntity(1, keyCode);
     Flick flick = new Flick(Flick.Direction.CENTER, entity);
     KeyState keyState = new KeyState(
         "",
@@ -192,7 +207,8 @@
         nextAddMetaStates,
         nextRemoveMetaStates,
         Collections.singletonList(flick));
-    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, true, false, Stick.EVEN,
+    return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, true, Stick.EVEN,
+                   DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                    Collections.singletonList(keyState));
   }
 
@@ -202,7 +218,8 @@
    */
   private static Keyboard createDummyKeyboard(Key key) {
     Row row = new Row(Collections.singletonList(key), HEIGHT, VERTICAL_GAP);
-    return new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1);
+    return new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1,
+                        KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
   }
 
   private KeyEventHandler createKeyEventHandlerMock() {
@@ -217,9 +234,8 @@
   private KeyboardViewBackgroundSurface createKeyboardViewBackgroundSurfaceMock() {
     return createMockBuilder(KeyboardViewBackgroundSurface.class)
         .withConstructor(BackgroundDrawableFactory.class, DrawableCache.class)
-        .withArgs(new BackgroundDrawableFactory(1f),
-                  new DrawableCache(
-                      new MozcDrawableFactory(getInstrumentation().getContext().getResources())))
+        .withArgs(new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+                  new DrawableCache(getInstrumentation().getContext().getResources()))
         .createMock();
   }
 
@@ -240,7 +256,7 @@
 
   @SmallTest
   public void testFlushPendingKeyEventRecursiveCall() {
-    Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+    Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
     KeyEventContext keyEventContext =
         new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
 
@@ -248,7 +264,7 @@
     keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
     keyEventHandler.sendKey(
         keyEventContext.getKeyCode(),
-        Collections.singletonList(keyEventContext.getTouchEvent()));
+        Collections.singletonList(keyEventContext.getTouchEvent().get()));
     expectLastCall().andAnswer(new IAnswer<Void>() {
       @Override
       public Void answer() throws Throwable {
@@ -369,7 +385,7 @@
 
     verifyAll();
     assertEquals(1, keyEventContextMap.size());
-    assertEquals(EnumSet.of(MetaState.CAPS_LOCK), view.metaState);
+    assertEquals(EnumSet.of(MetaState.CAPS_LOCK, MetaState.HANDLING_TOUCH_EVENT), view.metaState);
   }
 
   @SmallTest
@@ -410,7 +426,7 @@
 
   @SmallTest
   public void testOnTouchEvent_release() {
-    Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+    Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
     KeyEventContext keyEventContext =
         new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
 
@@ -483,7 +499,7 @@
       view.setKeyboard(createDummyKeyboard(testData.key));
       view.layout(0, 0, 100, 60);
 
-      Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+      Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
       KeyEventContext keyEventContext =
           new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
 
@@ -516,7 +532,7 @@
   public void testOnTouchEvent_releaseModified() {
     Key key = createKeyWithModifiedState(0, 0, 'a', 'A');
     view.setKeyboard(createDummyKeyboard(key));
-    Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+    Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
     KeyEventContext keyEventContext =
         new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, EnumSet.of(MetaState.CAPS_LOCK));
 
@@ -658,7 +674,7 @@
 
   @SmallTest
   public void testOnTouchEvent_releaseModifierOneTime() {
-    Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+    Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
     KeyEventContext keyEventContext =
         new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
 
@@ -735,6 +751,15 @@
     assertEquals(Flick.Direction.RIGHT,
                  keyEventContextMap.values().iterator().next().flickDirection);
 
+    verifyAll();
+
+    resetAll();
+    keyEventHandler.cancelDelayedKeyEvent(isA(KeyEventContext.class));
+    expectLastCall().anyTimes();
+    // Delayed key event is invoked since the next flick direction is CENTER.
+    keyEventHandler.maybeStartDelayedKeyEvent(isA(KeyEventContext.class));
+    replayAll();
+
     assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 25, 15));
     assertEquals(1, keyEventContextMap.size());
     assertEquals(Flick.Direction.CENTER,
@@ -745,7 +770,7 @@
 
   @SmallTest
   public void testOnTouchEvent_cancel() {
-    Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+    Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
     KeyEventContext eventContext =
         new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
 
@@ -797,7 +822,7 @@
       resetAll();
       keyboardActionListener.onPress('a');
       keyboardActionListener.onKey(
-          eq(testCase.expectedCode), EasyMock.<List<? extends TouchEvent>>notNull());
+          eq(testCase.expectedCode), EasyMock.<List<TouchEvent>>notNull());
       keyboardActionListener.onRelease('a');
       replayAll();
 
@@ -810,7 +835,6 @@
       assertTrue(drag(view, fromX, testCase.toX, fromY, testCase.toY));
       assertTrue(view.keyEventContextMap.isEmpty());
 
-      view.setKeyEventHandler(null);
       verifyAll();
     }
   }
@@ -848,14 +872,15 @@
   public void testPopUp() {
     final Drawable icon = new ColorDrawable();
     final Drawable flickIcon = new ColorDrawable();
+    final int invalidResourceId = 0;
     final int iconResourceId = 1;
     final int flickIconResourceId = 3;
 
-    PopUp popup = new PopUp(iconResourceId, 40, 40, 0, -30);
-    PopUp flickPopup = new PopUp(flickIconResourceId, 40, 40, 0, -30);
+    PopUp popup = new PopUp(iconResourceId, invalidResourceId, 40, 0, -30, 10, 10);
+    PopUp flickPopup = new PopUp(flickIconResourceId, invalidResourceId, 40, 0, -30, 10, 10);
 
     // Inject drawables as resources.
-    Resources mockResources = new MockResources() {
+    Resources mockResources = new MockResourcesWithDisplayMetrics() {
       @Override
       public Drawable getDrawable(int resourceId) {
         if (resourceId == iconResourceId) {
@@ -867,7 +892,7 @@
         return null;
       }
     };
-    DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(mockResources));
+    DrawableCache drawableCache = new DrawableCache(mockResources);
     VisibilityProxy.setField(view, "drawableCache", drawableCache);
 
     int x1 = 0;
@@ -879,7 +904,8 @@
 
     Key popupKey = new Key(
         x2, y2,
-        WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+        WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+        DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
         Collections.singletonList(new KeyState(
             "",
             Collections.<MetaState>emptySet(),
@@ -888,11 +914,14 @@
             Arrays.asList(
                 new Flick(
                     Direction.CENTER,
-                    new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, popup)),
+                    new KeyEntity(
+                        1, 'a', KeyEntity.INVALID_KEY_CODE, true, 0,
+                        Optional.<String>absent(), false, Optional.of(popup), 0, 0, 0, 0)),
                 new Flick(
                     Direction.LEFT,
-                    new KeyEntity(2, 'b', KeyEntity.INVALID_KEY_CODE, 0, null, false,
-                                  flickPopup))))));
+                    new KeyEntity(
+                        2, 'b', KeyEntity.INVALID_KEY_CODE, true, 0,
+                        Optional.<String>absent(), false, Optional.of(flickPopup), 0, 0, 0, 0))))));
 
     Row row1 = new Row(
         Arrays.asList(createKey(x1, y1, 'c'), createKey(x2, y1, 'd'), createKey(x3, y1, 'e')),
@@ -904,13 +933,15 @@
         Arrays.asList(createKey(x1, y3, 'h'), createKey(x2, y3, 'i'), createKey(x3, y3, 'j')),
         HEIGHT, VERTICAL_GAP);
     Keyboard keyboard = new Keyboard(Optional.<String>absent(),
-                                     Arrays.asList(row1, row2, row3), 1);
+                                     Arrays.asList(row1, row2, row3), 1,
+                                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
     view.setKeyboard(keyboard);
 
     // Set mock preview.
     PopUpPreview mockPopUpPreview = createMockBuilder(PopUpPreview.class)
         .withConstructor(View.class, BackgroundDrawableFactory.class, DrawableCache.class)
-        .withArgs(view, new BackgroundDrawableFactory(1f), drawableCache)
+        .withArgs(view, new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+                                                      drawableCache)
         .createMock();
     PopUpPreview.Pool popupPreviewPool = VisibilityProxy.getField(view, "popupPreviewPool");
     VisibilityProxy.<List<PopUpPreview>>getField(
@@ -919,7 +950,7 @@
     VisibilityProxy.setField(popupPreviewPool, "dismissHandler", dismissHandler);
 
     // At first, emulate press event.
-    mockPopUpPreview.showIfNecessary(popupKey, popup);
+    mockPopUpPreview.showIfNecessary(popupKey, Optional.of(popup), false);
     replayAll();
 
     assertTrue(touchEvent(view, MotionEvent.ACTION_DOWN, 75, 45));
@@ -927,7 +958,7 @@
 
     // Then, moving to left.
     resetAll();
-    mockPopUpPreview.showIfNecessary(popupKey, flickPopup);
+    mockPopUpPreview.showIfNecessary(popupKey, Optional.of(flickPopup), false);
     replayAll();
 
     assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 25, 45));
@@ -935,7 +966,7 @@
 
     // Moving to top.
     resetAll();
-    mockPopUpPreview.showIfNecessary(popupKey, null);
+    mockPopUpPreview.showIfNecessary(popupKey, Optional.<PopUp>absent(), false);
     replayAll();
 
     assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 75, 15));
@@ -943,7 +974,7 @@
 
     // Moving to center again.
     resetAll();
-    mockPopUpPreview.showIfNecessary(popupKey, popup);
+    mockPopUpPreview.showIfNecessary(popupKey, Optional.of(popup), false);
     replayAll();
 
     assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 75, 45));
@@ -973,6 +1004,109 @@
     verifyAll();
   }
 
+  private void delayedPopupTestImpl(
+      boolean popupEnabled, boolean longPressTimeoutTrigger, boolean popupPresent,
+      boolean expectShowIfNecessaryIsCalled, boolean expectLongPressCallbackIsSet) {
+    // Set up mock drawable cache.
+    MockResources mockResources = new MockResources() {
+      @Override
+      public Drawable getDrawable(int resourceId) {
+        return new ColorDrawable();
+      }
+
+      @Override
+      public DisplayMetrics getDisplayMetrics() {
+        return new DisplayMetrics();
+      }
+    };
+    DrawableCache drawableCache = new DrawableCache(mockResources);
+    VisibilityProxy.setField(view, "drawableCache", drawableCache);
+
+    // Set up a dummy keyboard with one key entity and mock key event handler.
+    view.setPopupEnabled(popupEnabled);
+    Optional<PopUp> popup = Optional.absent();
+    if (popupPresent) {
+      popup = Optional.of(new PopUp(0, 0, 40, 0, -30, 10, 10));
+    }
+    KeyEntity keyEntity = new KeyEntity(
+        1, 'a', 'A', longPressTimeoutTrigger, 0, Optional.<String>absent(), false, popup,
+        0, 0, 0, 0);
+    Key key = createKeyWithKeyEntity(0, 0, keyEntity);
+    view.setKeyboard(createDummyKeyboard(key));
+    KeyEventHandler mockKeyEventHandler = createKeyEventHandlerMock();
+    view.setKeyEventHandler(mockKeyEventHandler);
+
+    // Set up mock popup preview.
+    PopUpPreview mockPopUpPreview = createMockBuilder(PopUpPreview.class)
+        .withConstructor(View.class, BackgroundDrawableFactory.class, DrawableCache.class)
+        .withArgs(view, new BackgroundDrawableFactory(mockResources), drawableCache)
+        .createMock();
+    PopUpPreview.Pool popupPreviewPool = VisibilityProxy.getField(view, "popupPreviewPool");
+    VisibilityProxy.<List<PopUpPreview>>getField(
+        popupPreviewPool, "freeList").add(mockPopUpPreview);
+    Handler dismissHandler = new Handler(Looper.myLooper());
+    VisibilityProxy.setField(popupPreviewPool, "dismissHandler", dismissHandler);
+
+    // Run test scenario.
+    if (expectShowIfNecessaryIsCalled) {
+      mockPopUpPreview.showIfNecessary(key, popup, false);
+    }
+    if (!popupEnabled) {
+      mockPopUpPreview.dismiss();
+    }
+    Capture<KeyEventContext> keyEventContextCapture = new Capture<KeyEventContext>();
+    mockKeyEventHandler.cancelDelayedKeyEvent(isA(KeyEventContext.class));
+    expectLastCall().anyTimes();
+    mockKeyEventHandler.maybeStartDelayedKeyEvent(capture(keyEventContextCapture));
+    mockKeyEventHandler.sendPress('a');
+    replayAll();
+
+    assertTrue(touchEvent(view, MotionEvent.ACTION_DOWN, 75, 45));
+    verifyAll();
+    KeyEventContext context = keyEventContextCapture.getValue();
+    assertEquals(expectLongPressCallbackIsSet, context.longPressCallback.isPresent());
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupEnabled_Trigger_PopupIconPresent() {
+    delayedPopupTestImpl(true, true, true, true, false);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupEnabled_Trigger_PopupIconAbsent() {
+    delayedPopupTestImpl(true, true, false, true, false);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupEnabled_NotTrigger_PopupIconPresent() {
+    delayedPopupTestImpl(true, false, true, true, true);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupEnabled_NotTrigger_PopupIconAbsent() {
+    delayedPopupTestImpl(true, false, false, true, false);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupDisabled_Trigger_PopupIconPresent() {
+    delayedPopupTestImpl(false, true, true, false, false);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupDisabled_Trigger_PopupIconAbsent() {
+    delayedPopupTestImpl(false, true, false, false, false);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupDisabled_NotTrigger_PopupIconPresent() {
+    delayedPopupTestImpl(false, false, true, false, true);
+  }
+
+  @SmallTest
+  public void testDelayedPopup_PopupDisabled_NotTrigger_PopupIconAbsent() {
+    delayedPopupTestImpl(false, false, false, false, false);
+  }
+
   // Unfortunately, there are no way to test multi-touch events because we can create neither
   // MotionEvent class instances with multi-touch events nor mock instances.
   // So, just skip the tests for those cases.
@@ -1004,54 +1138,26 @@
 
     for (TestCase testCase : testCases) {
       Row row = new Row(Arrays.asList(key1, testCase.spacer, key2), HEIGHT, VERTICAL_GAP);
-      view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1));
+      view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1,
+                                    KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA));
 
       // Center of key1.
-      assertSame(key1, view.getKeyByCoord(WIDTH / 2, HEIGHT / 2));
+      assertSame(key1, view.getKeyByCoord(WIDTH / 2, HEIGHT / 2).get());
 
       // Center of key2.
-      assertSame(key2, view.getKeyByCoord(WIDTH * 5 / 2, HEIGHT / 2));
+      assertSame(key2, view.getKeyByCoord(WIDTH * 5 / 2, HEIGHT / 2).get());
 
       // On a spacer.
-      assertSame(testCase.expectedLeftHalf, view.getKeyByCoord(WIDTH * 4 / 3, HEIGHT / 2));
-      assertSame(testCase.expectedRightHalf, view.getKeyByCoord(WIDTH * 5 / 3, HEIGHT / 2));
+      assertSame(testCase.expectedLeftHalf, view.getKeyByCoord(WIDTH * 4 / 3, HEIGHT / 2).get());
+      assertSame(testCase.expectedRightHalf, view.getKeyByCoord(WIDTH * 5 / 3, HEIGHT / 2).get());
 
       // Both outside of the keyboard.
-      assertSame(key1, view.getKeyByCoord(-WIDTH / 2, HEIGHT / 2));
-      assertSame(key2, view.getKeyByCoord(WIDTH * 7 / 2, HEIGHT / 2));
+      assertSame(key1, view.getKeyByCoord(-WIDTH / 2, HEIGHT / 2).get());
+      assertSame(key2, view.getKeyByCoord(WIDTH * 7 / 2, HEIGHT / 2).get());
     }
   }
 
   @SmallTest
-  public void testOnTouchEvent_releaseSymbolCusorkeySecondly() {
-    Resources res = view.getContext().getResources();
-    KeyEventHandler keyEventHandler = createKeyEventHandlerMock();
-    int keyCode = res.getInteger(R.integer.key_symbol);
-    resetAll();
-    Key targetKey = createKey(0, 0, keyCode);
-    KeyEventContext keyEventContext =
-        new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
-
-    // The listener should receive only onRelease event.
-    keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
-    keyEventHandler.sendRelease(keyCode);
-    replayAll();
-    view.setKeyEventHandler(keyEventHandler);
-
-    // Set pressed condition.
-    Map<Integer, KeyEventContext> keyEventContextMap = view.keyEventContextMap;
-    keyEventContextMap.put(0, keyEventContext);
-
-    assertEquals(Flick.Direction.CENTER,
-                 keyEventContextMap.values().iterator().next().flickDirection);
-    assertTrue(touchEvent(view, MotionEvent.ACTION_POINTER_UP, 0, 0));
-    assertTrue(keyEventContextMap.isEmpty());
-
-    view.setKeyEventHandler(null);
-    verifyAll();
-  }
-
-  @SmallTest
   public void testOnDetachedFromWindow() {
     KeyboardViewBackgroundSurface keyboardViewBackgroundSurface =
         createKeyboardViewBackgroundSurfaceMock();
@@ -1067,32 +1173,28 @@
   @SuppressWarnings("unchecked")
   @SmallTest
   public void testSetSkinType() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
     KeyboardViewBackgroundSurface keyboardViewBackgroundSurface =
         createKeyboardViewBackgroundSurfaceMock();
     keyboardViewBackgroundSurface.requestUpdateKeyboard(
         isA(Keyboard.class), isA(Set.class));
 
     DrawableCache drawableCache = createMockBuilder(DrawableCache.class)
-        .withConstructor(MozcDrawableFactory.class)
-        .withArgs(new MozcDrawableFactory(new MockResources()))
+        .withConstructor(Resources.class)
+        .withArgs(new MockResourcesWithDisplayMetrics())
         .createMock();
-    drawableCache.setSkinType(SkinType.ORANGE_LIGHTGRAY);
-    expect(drawableCache.getDrawable(SkinType.ORANGE_LIGHTGRAY.windowBackgroundResourceId))
-        .andReturn(Optional.<Drawable>absent());
+    drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
 
     BackgroundDrawableFactory backgroundDrawableFactory =
-        createMockBuilder(BackgroundDrawableFactory.class)
-            .withConstructor(Float.TYPE)
-            .withArgs(1f)
-            .createMock();
-    backgroundDrawableFactory.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+        new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
+    backgroundDrawableFactory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
     replayAll();
 
     VisibilityProxy.setField(view, "backgroundSurface", keyboardViewBackgroundSurface);
     VisibilityProxy.setField(view, "drawableCache", drawableCache);
     VisibilityProxy.setField(view, "backgroundDrawableFactory", backgroundDrawableFactory);
 
-    view.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+    view.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
 
     verifyAll();
   }
@@ -1101,20 +1203,21 @@
   public void testSetKeyboard() {
     KeyboardView view = new KeyboardView(getInstrumentation().getTargetContext());
     Set<MetaState> originalMetaStates = EnumSet.of(
+        MetaState.NO_GLOBE,
         MetaState.CAPS_LOCK,
         MetaState.ACTION_GO,
         MetaState.VARIATION_EMAIL_ADDRESS,
-        MetaState.COMPOSING,
-        MetaState.GLOBE);
+        MetaState.COMPOSING);
     view.updateMetaStates(originalMetaStates, EnumSet.noneOf(MetaState.class));
     assertEquals(originalMetaStates, view.getMetaStates());
-    view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0f));
+    view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0f,
+                                  KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA));
     assertEquals(
         EnumSet.of(
+            MetaState.NO_GLOBE,
             MetaState.ACTION_GO,
             MetaState.VARIATION_EMAIL_ADDRESS,
-            MetaState.COMPOSING,
-            MetaState.GLOBE),
+            MetaState.COMPOSING),
         view.getMetaStates());
   }
 
@@ -1135,26 +1238,35 @@
 
     // Keep the order. KeyboardView's state is not reset in the iteration.
     TestData[] testDataList = {
-        new TestData(0, 0, EnumSet.noneOf(MetaState.class)),
-        new TestData(EditorInfo.IME_ACTION_DONE, 0, EnumSet.of(MetaState.ACTION_DONE)),
-        new TestData(EditorInfo.IME_ACTION_GO, 0, EnumSet.of(MetaState.ACTION_GO)),
-        new TestData(EditorInfo.IME_ACTION_NEXT, 0, EnumSet.of(MetaState.ACTION_NEXT)),
-        new TestData(EditorInfo.IME_ACTION_NONE, 0, EnumSet.of(MetaState.ACTION_NONE)),
-        new TestData(EditorInfo.IME_ACTION_PREVIOUS, 0, EnumSet.of(MetaState.ACTION_PREVIOUS)),
-        new TestData(EditorInfo.IME_ACTION_SEARCH, 0, EnumSet.of(MetaState.ACTION_SEARCH)),
-        new TestData(EditorInfo.IME_ACTION_SEND, 0, EnumSet.of(MetaState.ACTION_SEND)),
+        new TestData(0, 0, EnumSet.of(MetaState.NO_GLOBE)),
+        new TestData(EditorInfo.IME_ACTION_DONE,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_DONE)),
+        new TestData(EditorInfo.IME_ACTION_GO,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_GO)),
+        new TestData(EditorInfo.IME_ACTION_NEXT,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_NEXT)),
+        new TestData(EditorInfo.IME_ACTION_NONE,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_NONE)),
+        new TestData(EditorInfo.IME_ACTION_PREVIOUS,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_PREVIOUS)),
+        new TestData(EditorInfo.IME_ACTION_SEARCH,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_SEARCH)),
+        new TestData(EditorInfo.IME_ACTION_SEND,
+                     0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_SEND)),
         new TestData(0, InputType.TYPE_TEXT_VARIATION_URI | InputType.TYPE_CLASS_TEXT,
-                     EnumSet.of(MetaState.VARIATION_URI)),
+                     EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_URI)),
         new TestData(0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
-                     EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+                     EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
         new TestData(0, InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
-                     EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+                     EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
         new TestData(0, InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE | InputType.TYPE_CLASS_TEXT,
-                     EnumSet.noneOf(MetaState.class)),
+                     EnumSet.of(MetaState.NO_GLOBE)),
         new TestData(0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
-                     EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+                     EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
         new TestData(0, InputType.TYPE_NUMBER_VARIATION_PASSWORD | InputType.TYPE_CLASS_NUMBER,
-                     EnumSet.noneOf(MetaState.class)),
+                     EnumSet.of(MetaState.NO_GLOBE)),
+        new TestData(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_ENTER_ACTION,
+                     0, EnumSet.of(MetaState.NO_GLOBE)),
     };
 
     for (TestData testData : testDataList) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
index 48563f1..5d47c03 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
@@ -34,15 +34,17 @@
 import static org.easymock.EasyMock.getCurrentArguments;
 import static org.easymock.EasyMock.isA;
 
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
 import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
+import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
 import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
 import com.google.common.base.Optional;
 
+import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -60,17 +62,19 @@
   public void testShow() {
     Drawable icon = new ColorDrawable();
     int iconResourceId = 1;
+    int longTapIconResourceId = 2;
 
+    Resources resources = getInstrumentation().getTargetContext().getResources();
     DrawableCache cache = createMockBuilder(DrawableCache.class)
-        .withConstructor(MozcDrawableFactory.class)
-        .withArgs(new MozcDrawableFactory(new MockResources()))
+        .withConstructor(Resources.class)
+        .withArgs(resources)
         .createMock();
     expect(cache.getDrawable(iconResourceId)).andStubReturn(Optional.of(icon));
 
-    int popupWidth = 40;
     int popupHeight = 80;
-    PopUp popup = new PopUp(iconResourceId, popupWidth, popupHeight, 0, -30);
-    Key key = new Key(5, 10, 30, 20, 0, 0, false, false, false, Stick.EVEN,
+    PopUp popup = new PopUp(iconResourceId, longTapIconResourceId, popupHeight, 0, -30, 10, 10);
+    Key key = new Key(5, 10, 30, 20, 0, 0, false, false, Stick.EVEN,
+                      DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
                       Collections.<KeyState>emptyList());
 
     final int parentLocationX = 100;
@@ -93,33 +97,34 @@
 
     replayAll();
 
-    PopUpPreview preview = new PopUpPreview(mockView, new BackgroundDrawableFactory(1f), cache);
-    ImageView popupView = preview.popupView;
+    PopUpPreview preview =
+        new PopUpPreview(mockView, new BackgroundDrawableFactory(resources), cache);
+    ImageView popupView = preview.popUp.getContentView();
 
-    preview.showIfNecessary(null, popup);
-    assertEquals(View.GONE, popupView.getVisibility());
-    assertNull(popupView.getDrawable());
-    assertNull(popupView.getBackground());
-
-    preview.showIfNecessary(key, null);
+    preview.showIfNecessary(key, Optional.<PopUp>absent(), false);
     assertEquals(View.GONE, popupView.getVisibility());
     assertNull(popupView.getDrawable());
     assertNull(popupView.getBackground());
 
     FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(0, 0);
     popupView.setLayoutParams(layoutParams);
-    preview.showIfNecessary(key, popup);
+    preview.showIfNecessary(key, Optional.of(popup), false);
     verifyAll();
     assertEquals(View.VISIBLE, popupView.getVisibility());
     assertSame(icon, popupView.getDrawable());
     assertNotNull(popupView.getBackground());
-    assertEquals(popupWidth, layoutParams.width);
-    assertEquals(popupHeight, layoutParams.height);
-    assertEquals(key.getX() + key.getWidth() / 2 + popup.getXOffset() - popup.getWidth() / 2
+    float density = resources.getDisplayMetrics().density;
+    int popupWindowPadding = (int) (BackgroundDrawableFactory.POPUP_WINDOW_PADDING * density);
+    assertEquals(Math.min(key.getWidth(),
+                          resources.getDimensionPixelSize(R.dimen.popup_width_limitation))
+                     + popupWindowPadding * 2,
+                 layoutParams.width);
+    assertEquals(popupHeight + popupWindowPadding * 2, layoutParams.height);
+    assertEquals(key.getX() + key.getWidth() / 2 + popup.getXOffset() - layoutParams.width / 2
                      + parentLocationX,
                  layoutParams.leftMargin);
     assertEquals(key.getY() + key.getHeight() / 2 + popup.getYOffset() - popup.getHeight() / 2
-                     + parentLocationY,
+                     + parentLocationY - popupWindowPadding,
                  layoutParams.topMargin);
     assertEquals(0, layoutParams.rightMargin);
     assertEquals(0, layoutParams.bottomMargin);
@@ -127,12 +132,53 @@
 
   @SmallTest
   public void testDismiss() {
-    PopUpPreview preview =
-        new PopUpPreview(new View(getInstrumentation().getTargetContext()), null, null);
+    PopUpPreview preview = new PopUpPreview(
+            new View(getInstrumentation().getTargetContext()),
+            new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+            new DrawableCache(new MockResourcesWithDisplayMetrics()));
     preview.dismiss();
-    ImageView popupView = preview.popupView;
+    ImageView popupView = preview.popUp.getContentView();
     assertEquals(View.GONE, popupView.getVisibility());
     assertNull(popupView.getDrawable());
     assertNull(popupView.getBackground());
   }
+
+  @SmallTest
+  public void testShowIfNecessaryWithInvalidResourceId() {
+    Drawable icon = new ColorDrawable();
+    int invalidResourceId = 0;
+    int validResourceId = 1;
+
+    DrawableCache cache = createMockBuilder(DrawableCache.class)
+        .withConstructor(Resources.class)
+        .withArgs(new MockResourcesWithDisplayMetrics())
+        .createMock();
+    expect(cache.getDrawable(invalidResourceId)).andStubReturn(Optional.<Drawable>absent());
+    expect(cache.getDrawable(validResourceId)).andStubReturn(Optional.of(icon));
+
+    PopUpPreview preview = new PopUpPreview(
+        new View(getInstrumentation().getTargetContext()),
+        new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()), cache);
+    ImageView popupView = preview.popUp.getContentView();
+
+    replayAll();
+
+    for (boolean useValidIconResourceId : new boolean[] {false, true}) {
+      for (boolean useValidLongTapIconResourceId : new boolean[] {false, true}) {
+        int iconId = useValidIconResourceId ? validResourceId : invalidResourceId;
+        int longTapIconId = useValidLongTapIconResourceId ? validResourceId : invalidResourceId;
+        Key key = new Key(
+            10, 10, 10, 10, 0, 0, false, false, Stick.EVEN,
+            DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList());
+
+        preview.showIfNecessary(
+            key, Optional.of(new PopUp(iconId, longTapIconId, 10, 0, 0, 10, 10)), false);
+        assertEquals(useValidIconResourceId, popupView.getVisibility() == View.VISIBLE);
+
+        preview.showIfNecessary(
+            key, Optional.of(new PopUp(iconId, longTapIconId, 10, 0, 0, 10, 10)), true);
+        assertEquals(useValidLongTapIconResourceId, popupView.getVisibility() == View.VISIBLE);
+      }
+    }
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
index 9425808..1401c95 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
@@ -29,9 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese.keyboard;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboardTest;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.LikelihoodCalculator;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.LikelihoodCalculatorImpl;
 import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.StatisticsLoader;
@@ -99,9 +97,9 @@
                     .addStroke(TouchPosition.newBuilder().setAction(TouchAction.TOUCH_UP))
                     .build());
 
-  private static String getFormattedKeyboardName(JapaneseKeyboard japaneseKeyboard,
+  private static String getFormattedKeyboardName(Keyboard keyboard,
                                                  Configuration configuration) {
-    return japaneseKeyboard.getSpecification().getKeyboardSpecificationName()
+    return keyboard.getSpecification().getKeyboardSpecificationName()
                .formattedKeyboardName(configuration);
   }
 
@@ -140,25 +138,25 @@
     final InputStream testStream = createStream(sourceIdList, statsList);
     final Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
-    final JapaneseKeyboard japaneseKeyboard = JapaneseKeyboardTest.createJapaneseKeyboard(
+    final Keyboard keyboard = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     final Capture<SparseArray<float[]>> capture = new Capture<SparseArray<float[]>>();
     StatisticsLoader loader = new StatisticsLoader(
         new StatsFileAccessor() {
           @Override
           public InputStream openStream(
-              JapaneseKeyboard japaneseKeyboardToLoad, Configuration configurationToLoad) {
-            assertSame(japaneseKeyboard, japaneseKeyboardToLoad);
+              Keyboard keyboardToLoad, Configuration configurationToLoad) {
+            assertSame(keyboard, keyboardToLoad);
             assertSame(configuration, configurationToLoad);
             return testStream;
           }},
-          japaneseKeyboard,
+          keyboard,
         configuration,
         new UpdateStatsListener() {
           @Override
           public void updateStats(String formattedKeyboardName, SparseArray<float[]> stats) {
             assertEquals(
-                getFormattedKeyboardName(japaneseKeyboard, configuration),
+                getFormattedKeyboardName(keyboard, configuration),
                 formattedKeyboardName);
             capture.setValue(stats);
           }
@@ -184,12 +182,11 @@
         new StatsFileAccessor() {
           @Override
           public InputStream openStream(
-              JapaneseKeyboard japaneseKeyboard, Configuration configuration) throws IOException {
+              Keyboard keyboard, Configuration configuration) throws IOException {
             throw new IOException("No file found");
           }
         },
-        JapaneseKeyboardTest.createJapaneseKeyboard(KeyboardSpecification.GODAN_KANA,
-                                                    getInstrumentation()),
+        KeyboardTest.createKeyboard(KeyboardSpecification.GODAN_KANA, getInstrumentation()),
         configuration,
         new UpdateStatsListener() {
           @Override
@@ -210,7 +207,7 @@
         new StatsFileAccessor() {
           @Override
           public InputStream openStream(
-              JapaneseKeyboard japaneseKeyboard, Configuration configuration) {
+              Keyboard keyboard, Configuration configuration) {
             return new InputStream() {
               @Override
               public int read() throws IOException {
@@ -218,7 +215,7 @@
               }
             };
           }},
-        JapaneseKeyboardTest.createJapaneseKeyboard(
+        KeyboardTest.createKeyboard(
             KeyboardSpecification.GODAN_KANA, getInstrumentation()),
         configuration,
         new UpdateStatsListener() {
@@ -273,29 +270,14 @@
 
   @SmallTest
   public void testSetJapaneseKeyboardWithNullConfig() {
-    JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+    Keyboard godanKana = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     ProbableKeyEventGuesser guesser = createFakeGuesser(0);
 
     // JapaneseKeyboard == godanKana
     // Configuration == null
-    guesser.setJapaneseKeyboard(godanKana);
-    guesser.setConfiguration(null);
-
-    MoreAsserts.assertEmpty(
-        guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
-  }
-
-  @SmallTest
-  public void testSetConfigWithNullJanapaneseKeyboard() {
-    Configuration configuration = new Configuration();
-    configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
-    ProbableKeyEventGuesser guesser = createFakeGuesser(0);
-
-    // JapaneseKeyboard == null
-    // Configuration == non-null
-    guesser.setJapaneseKeyboard(null);
-    guesser.setConfiguration(configuration);
+    guesser.setKeyboard(godanKana);
+    guesser.setConfiguration(Optional.<Configuration>absent());
 
     MoreAsserts.assertEmpty(
         guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
@@ -305,16 +287,16 @@
   public void testNonExistentJanapaneseKeyboard() {
     // This test expects that HARDWARE_QWERTY_ALPHABET doesn't have corresponding
     // typing correction stats.
-    JapaneseKeyboard keyboard =
-        new JapaneseKeyboard(
+    Keyboard keyboard =
+        new Keyboard(
             Optional.<String>absent(),
             Collections.<Row>emptyList(), 0f, KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
     Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
     ProbableKeyEventGuesser guesser = createFakeGuesser(0);
 
-    guesser.setConfiguration(configuration);
-    guesser.setJapaneseKeyboard(keyboard);
+    guesser.setConfiguration(Optional.of(configuration));
+    guesser.setKeyboard(keyboard);
 
     MoreAsserts.assertEmpty(
         guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
@@ -322,44 +304,43 @@
 
   @SmallTest
   public void testCorrectKeyboard() {
-    JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+    Keyboard godanKana = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
     ProbableKeyEventGuesser guesser = createFakeGuesser(Double.NEGATIVE_INFINITY);
 
-    guesser.setConfiguration(configuration);
-    guesser.setJapaneseKeyboard(godanKana);
+    guesser.setConfiguration(Optional.of(configuration));
+    guesser.setKeyboard(godanKana);
 
     MoreAsserts.assertNotEmpty(guesser.getProbableKeyEvents(TOUCH_DOWN_UP_EVENT_LIST));
   }
 
   @SmallTest
   public void testFilterLessProbableEvents() {
-    JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+    Keyboard godanKana = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
     ProbableKeyEventGuesser guesser = createFakeGuesser(Double.POSITIVE_INFINITY);
 
-    guesser.setConfiguration(configuration);
-    guesser.setJapaneseKeyboard(godanKana);
+    guesser.setConfiguration(Optional.of(configuration));
+    guesser.setKeyboard(godanKana);
 
     MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(TOUCH_DOWN_UP_EVENT_LIST));
   }
 
   @SmallTest
   public void testEmptyTouchEvent() {
-    JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+    Keyboard godanKana = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
     ProbableKeyEventGuesser guesser = createFakeGuesser(0);
 
-    guesser.setConfiguration(configuration);
-    guesser.setJapaneseKeyboard(godanKana);
+    guesser.setConfiguration(Optional.of(configuration));
+    guesser.setKeyboard(godanKana);
 
-    MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(null));
     MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(Collections.<TouchEvent>emptyList()));
     MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(
         Collections.<TouchEvent>singletonList(TouchEvent.getDefaultInstance())));
@@ -367,7 +348,7 @@
 
   @SmallTest
   public void testVariousStatistics() {
-    final JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+    final Keyboard godanKana = KeyboardTest.createKeyboard(
         KeyboardSpecification.GODAN_KANA, getInstrumentation());
     final Configuration configuration = new Configuration();
     configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
@@ -453,9 +434,8 @@
     for (final TestData testData : testDataList) {
       StatsFileAccessor assetManager = new StatsFileAccessor() {
         @Override
-        public InputStream openStream(
-            JapaneseKeyboard japaneseKeyboardToLoad, Configuration configurationToLoad) {
-          assertSame(godanKana, japaneseKeyboardToLoad);
+        public InputStream openStream(Keyboard keyboardToLoad, Configuration configurationToLoad) {
+          assertSame(godanKana, keyboardToLoad);
           assertSame(configuration, configurationToLoad);
           return createStream(testData.sourceIds, testData.stats);
         }
@@ -468,8 +448,8 @@
               new BlockingThreadPoolExecutor(),
               new BlockingExecutor(),
               fakeCalculator);
-      guesser.setConfiguration(configuration);
-      guesser.setJapaneseKeyboard(godanKana);
+      guesser.setConfiguration(Optional.of(configuration));
+      guesser.setKeyboard(godanKana);
 
       List<TouchEvent> touchEventList =
           Collections.singletonList(
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
index 0fc202c..6a246ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
@@ -29,7 +29,7 @@
 
 package org.mozc.android.inputmethod.japanese.model;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
@@ -99,42 +99,6 @@
         new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                      InputStyle.TOGGLE_FLICK, true,
                      KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE, false,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE, true,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.FLICK, false,
-                     KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.FLICK, true,
-                     KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE_FLICK, false,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE_FLICK, true,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE, false,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.FLICK, false,
-                     KeyboardSpecification.TWELVE_KEY_FLICK_ALPHABET),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE_FLICK, false,
-                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET),
-        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE_FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
 
         new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                      InputStyle.TOGGLE, false,
@@ -172,42 +136,6 @@
         new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                      InputStyle.TOGGLE_FLICK, true,
                      KeyboardSpecification.QWERTY_ALPHABET),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE, false,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE, true,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.FLICK, false,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.FLICK, true,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE_FLICK, false,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
-                     InputStyle.TOGGLE_FLICK, true,
-                     KeyboardSpecification.QWERTY_KANA_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.FLICK, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE_FLICK, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
-                     InputStyle.TOGGLE_FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
 
         new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                      InputStyle.TOGGLE, false,
@@ -245,24 +173,81 @@
         new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                      InputStyle.TOGGLE_FLICK, true,
                      KeyboardSpecification.QWERTY_ALPHABET),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.TOGGLE, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.TOGGLE, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.FLICK, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.TOGGLE_FLICK, false,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
-        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                      InputStyle.TOGGLE_FLICK, true,
-                     KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.TOGGLE, false,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.TOGGLE, true,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.FLICK, false,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.FLICK, true,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.TOGGLE_FLICK, false,
+                     KeyboardSpecification.NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+                     InputStyle.TOGGLE_FLICK, true,
+                     KeyboardSpecification.NUMBER),
+
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.FLICK, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.FLICK, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE_FLICK, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE_FLICK, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.FLICK, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.FLICK, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE_FLICK, false,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+                     InputStyle.TOGGLE_FLICK, true,
+                     KeyboardSpecification.SYMBOL_NUMBER),
+
     };
 
     JapaneseSoftwareKeyboardModel model = new JapaneseSoftwareKeyboardModel();
@@ -289,19 +274,17 @@
     }
 
     TestData[] testDataListForTwelveKeys = {
-        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.KANA_NUMBER),
+        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
-                     KeyboardMode.KANA_NUMBER),
+                     KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
-                     KeyboardMode.KANA_NUMBER),
+                     KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
-                     KeyboardMode.KANA_NUMBER),
-        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.KANA_NUMBER),
-        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.KANA_NUMBER),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
-                     null),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
-                     null),
+                     KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
@@ -311,14 +294,11 @@
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
                      null),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
-                     null),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI,
-                     null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
                      KeyboardMode.ALPHABET),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT,
-                     null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
                      KeyboardMode.ALPHABET),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
@@ -357,19 +337,17 @@
     }
 
     TestData[] testDataListForQwertyAndGodan = {
-        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.ALPHABET_NUMBER),
+        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
-                     KeyboardMode.ALPHABET_NUMBER),
+                     KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
-                     KeyboardMode.ALPHABET_NUMBER),
+                     KeyboardMode.NUMBER),
         new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
-                     KeyboardMode.ALPHABET_NUMBER),
-        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.ALPHABET_NUMBER),
-        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.ALPHABET_NUMBER),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
-                     null),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
-                     null),
+                     KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
@@ -379,19 +357,18 @@
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
                      null),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
-                     null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
                      KeyboardMode.ALPHABET),
-        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT,
-                     null),
+        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
                      KeyboardMode.ALPHABET),
         new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
                      KeyboardMode.ALPHABET),
     };
 
+
     // Reset to qwerty.
     model.setInputType(InputType.TYPE_NULL);
     model.setKeyboardLayout(KeyboardLayout.QWERTY);
@@ -463,7 +440,7 @@
     model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
     model.setKeyboardMode(KeyboardMode.KANA);
     model.setInputType(InputType.TYPE_CLASS_NUMBER);
-    assertEquals(KeyboardMode.KANA_NUMBER, model.getKeyboardMode());
+    assertEquals(KeyboardMode.NUMBER, model.getKeyboardMode());
     model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
     assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
     model.setInputType(InputType.TYPE_NULL);
@@ -472,8 +449,8 @@
 
     model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
     assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
-    model.setKeyboardMode(KeyboardMode.KANA_NUMBER);
-    assertEquals(KeyboardMode.KANA_NUMBER, model.getKeyboardMode());
+    model.setKeyboardMode(KeyboardMode.SYMBOL_NUMBER);
+    assertEquals(KeyboardMode.SYMBOL_NUMBER, model.getKeyboardMode());
     // Even after the keyboard mode overwriting, the keyboard mode should be revereted before
     // input-type-setting.
     model.setInputType(InputType.TYPE_NULL);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
index 718fd12..f09779a 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
@@ -50,6 +50,9 @@
       } else if (minorCategory.name().startsWith("EMOJI")) {
         assertEquals(SymbolMajorCategory.EMOJI,
                      SymbolMajorCategory.findMajorCategory(minorCategory));
+      } else if (minorCategory == SymbolMinorCategory.NUMBER) {
+        assertEquals(SymbolMajorCategory.NUMBER,
+                     SymbolMajorCategory.findMajorCategory(minorCategory));
       } else {
         fail("Unexpected category name");
       }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
index e1515f3..441ee09 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
@@ -38,6 +38,7 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.test.mock.MockPackageManager;
 
 import org.easymock.Capture;
 
@@ -48,7 +49,7 @@
  */
 public class MushroomUtilTest extends InstrumentationTestCaseWithMock {
   public void testGetMushroomApplicationList() {
-    PackageManager manager = createMock(PackageManager.class);
+    PackageManager manager = createMock(MockPackageManager.class);
     Capture<Intent> intentCapture = new Capture<Intent>();
 
     List<ResolveInfo> result = Collections.emptyList();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
index 1d8c3d0..6ae8797 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
@@ -32,6 +32,7 @@
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -42,9 +43,10 @@
 /**
  */
 public class ClearConversionHistoryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
   private ClearConversionHistoryDialogPreference preference;
   private SessionExecutor mockSessionExecutor;
-  private SessionExecutor originalSessionExecutor;
+  private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
 
   @Override
   protected void setUp() throws Exception {
@@ -55,14 +57,14 @@
     preference = new ClearConversionHistoryDialogPreference(context, attrs);
 
     mockSessionExecutor = createMock(SessionExecutor.class);
-    originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+    originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
   }
 
   @Override
   protected void tearDown() throws Exception {
     SessionExecutor.setInstanceForTest(originalSessionExecutor);
 
-    originalSessionExecutor = null;
+    originalSessionExecutor = Optional.absent();
     mockSessionExecutor = null;
     preference = null;
     super.tearDown();
@@ -77,13 +79,14 @@
 
   private void doTestOnClick(boolean expectOnClickToFire, int button) {
     resetAll();
+    DialogInterface dialogMock = createNiceMock(DialogInterface.class);
     if (expectOnClickToFire) {
       mockSessionExecutor.clearUserHistory();
       mockSessionExecutor.clearUserPrediction();
     }
     replayAll();
 
-    preference.onClick(null, button);
+    preference.onClick(dialogMock, button);
     verifyAll();
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
index f0b694f..c18e624 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
@@ -33,6 +33,7 @@
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -43,9 +44,10 @@
 /**
  */
 public class ClearSymbolHistoryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
   private ClearSymbolHistoryDialogPreference preference;
   private SessionExecutor mockSessionExecutor;
-  private SessionExecutor originalSessionExecutor;
+  private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
 
   @Override
   protected void setUp() throws Exception {
@@ -55,14 +57,14 @@
     preference = new ClearSymbolHistoryDialogPreference(context, attrs);
 
     mockSessionExecutor = createMock(SessionExecutor.class);
-    originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+    originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
   }
 
   @Override
   protected void tearDown() throws Exception {
     SessionExecutor.setInstanceForTest(originalSessionExecutor);
 
-    originalSessionExecutor = null;
+    originalSessionExecutor = Optional.absent();
     mockSessionExecutor = null;
     preference = null;
     super.tearDown();
@@ -77,6 +79,7 @@
 
   private void doTestOnClick(boolean expectOnClickToFire, int button) {
     resetAll();
+    DialogInterface dialogMock = createNiceMock(DialogInterface.class);
     if (expectOnClickToFire) {
       mockSessionExecutor.clearStorage(StorageType.EMOJI_HISTORY);
       mockSessionExecutor.clearStorage(StorageType.EMOTICON_HISTORY);
@@ -84,7 +87,7 @@
     }
     replayAll();
 
-    preference.onClick(null, button);
+    preference.onClick(dialogMock, button);
     verifyAll();
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
index dc5fb12..b5f00b9 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
@@ -37,6 +37,7 @@
 import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -47,9 +48,10 @@
 /**
  */
 public class ClearUserDictionaryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
   private ClearUserDictionaryDialogPreference preference;
   private SessionExecutor mockSessionExecutor;
-  private SessionExecutor originalSessionExecutor;
+  private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
 
   @Override
   protected void setUp() throws Exception {
@@ -59,14 +61,14 @@
     preference = new ClearUserDictionaryDialogPreference(context, attrs);
 
     mockSessionExecutor = createMock(SessionExecutor.class);
-    originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+    originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
   }
 
   @Override
   protected void tearDown() throws Exception {
     SessionExecutor.setInstanceForTest(originalSessionExecutor);
 
-    originalSessionExecutor = null;
+    originalSessionExecutor = Optional.absent();
     mockSessionExecutor = null;
     preference = null;
     super.tearDown();
@@ -81,6 +83,7 @@
 
   private void doTestOnClick(boolean expectOnClickToFire, int button) {
     resetAll();
+    DialogInterface dialogMock = createNiceMock(DialogInterface.class);
     if (expectOnClickToFire) {
       expect(mockSessionExecutor.sendUserDictionaryCommand(
           UserDictionaryCommand.newBuilder()
@@ -90,7 +93,7 @@
     }
     replayAll();
 
-    preference.onClick(null, button);
+    preference.onClick(dialogMock, button);
     verifyAll();
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
index 2001d1c..e755952 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
@@ -32,12 +32,14 @@
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
+import org.mozc.android.inputmethod.japanese.resources.R;
 import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -103,8 +105,11 @@
         sharedPreferences, PreferenceUtil.PREF_LANDSCAPE_LAYOUT_ADJUSTMENT_KEY,
         LANDSCAPE_LAYOUT_ADJUSTMENT.name());
 
+    Resources resources = getInstrumentation().getTargetContext().getResources();
     MozcPreferenceUtil.updateSharedPreference(
-        sharedPreferences, PreferenceUtil.PREF_SKIN_TYPE, SkinType.BLUE_LIGHTGRAY.name());
+        sharedPreferences,
+        resources.getString(R.string.pref_skin_type_key),
+        SkinType.BLUE_LIGHTGRAY.name());
 
     class TestData extends Parameter {
       final int orientation;
@@ -190,7 +195,7 @@
       configuration.orientation = testData.orientation;
 
       ClientSidePreference preference =
-          new ClientSidePreference(sharedPreferences, configuration.orientation);
+          new ClientSidePreference(sharedPreferences, resources, configuration.orientation);
       assertEquals(testData.toString(),
                    testData.expectedKeyboardLayout, preference.getKeyboardLayout());
       assertEquals(testData.toString(),
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
index d8e0cb7..214654e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
@@ -45,6 +45,8 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.test.UiThreadTest;
+import android.test.mock.MockContext;
+import android.test.mock.MockPackageManager;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.webkit.WebView;
 
@@ -98,8 +100,8 @@
       for (boolean isDefaultBrowserExistent : new boolean[] {true, false}) {
         MozcLog.i(testData.toString());
         resetAll();
-        PackageManager packageManager = createNiceMock(PackageManager.class);
-        Context context = createNiceMock(Context.class);
+        PackageManager packageManager = createNiceMock(MockPackageManager.class);
+        Context context = createNiceMock(MockContext.class);
         Capture<Intent> queryIntentCapture = new Capture<Intent>();
         Capture<Intent> activityIntentCapture = new Capture<Intent>();
         if (testData.expectedDelegate) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
index 6044642..981722c 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
@@ -49,6 +49,7 @@
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceGroup;
+import android.test.mock.MockContext;
 import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.AttributeSet;
@@ -151,7 +152,7 @@
           .andStubReturn(prefLandscapeGroup);
       expect(preferenceManager.findPreference(isA(String.class))).andStubReturn(null);
 
-      Context contextMock = createMock(Context.class);
+      Context contextMock = createMock(MockContext.class);
       Resources resources = createMock(MockResources.class);
       expect(prefPortraitGroup.getContext()).andStubReturn(contextMock);
       expect(contextMock.getResources()).andStubReturn(resources);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
index 7eed5ec..70d027b 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
@@ -30,11 +30,11 @@
 package org.mozc.android.inputmethod.japanese.session;
 
 import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesBuilder;
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
 import static org.easymock.EasyMock.anyLong;
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.getCurrentArguments;
-import static org.easymock.EasyMock.isNull;
 import static org.easymock.EasyMock.same;
 
 import org.mozc.android.inputmethod.japanese.KeycodeConverter;
@@ -84,6 +84,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.preference.PreferenceManager;
+import android.test.mock.MockContext;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.KeyEvent;
@@ -100,6 +101,7 @@
  *
  */
 public class SessionExecutorTest extends InstrumentationTestCaseWithMock {
+
   private SessionExecutor createSessionExecutorMock() {
     return createMockBuilder(SessionExecutor.class)
         .addMockedMethods("evaluateSynchronously", "evaluateAsynchronously")
@@ -108,12 +110,13 @@
 
   @Override
   protected void tearDown() throws Exception {
-    SessionExecutor.instance = null;
+    SessionExecutor.instance = Optional.absent();
     super.tearDown();
   }
 
   @SmallTest
   public void testGetInstanceInitializedIfNecessary() {
+    Context context = new MockContext();
     SessionHandlerFactory factory = createMockBuilder(SessionHandlerFactory.class)
         .withConstructor(Context.class)
         .withArgs(getInstrumentation().getTargetContext())
@@ -122,7 +125,7 @@
     expect(factory.create()).andReturn(mockHandler);
     replayAll();
 
-    SessionExecutor instance = SessionExecutor.getInstanceInitializedIfNecessary(factory, null);
+    SessionExecutor instance = SessionExecutor.getInstanceInitializedIfNecessary(factory, context);
 
     verifyAll();
 
@@ -130,7 +133,7 @@
     resetAll();
     replayAll();
 
-    SessionExecutor instance2 = SessionExecutor.getInstanceInitializedIfNecessary(factory, null);
+    SessionExecutor instance2 = SessionExecutor.getInstanceInitializedIfNecessary(factory, context);
 
     verifyAll();
 
@@ -140,12 +143,14 @@
 
   @SmallTest
   public void testCallbackInitializeSessionHandler() {
+    Context context = getInstrumentation().getContext();
     SessionHandler sessionHandler = createMock(SessionHandler.class);
-    sessionHandler.initialize(null);
+    sessionHandler.initialize(context);
     replayAll();
 
     ExecutorMainCallback callback = new ExecutorMainCallback(sessionHandler);
     Message message = new Message();
+    message.obj = Object.class.cast(context);
     message.what = ExecutorMainCallback.INITIALIZE_SESSION_HANDLER;
     assertTrue(callback.handleMessage(message));
 
@@ -300,8 +305,9 @@
       Capture<Message> messageCapture = new Capture<Message>();
       expect(callbackHandler.sendMessageAtTime(capture(messageCapture), anyLong())).andReturn(true);
 
-      AsynchronousEvaluationContext context =
-          new AsynchronousEvaluationContext(0, inputBuilder, null, null, callbackHandler);
+      AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
+          0, inputBuilder, Optional.<KeyEventInterface>absent(),
+          Optional.<EvaluationCallback>absent(), Optional.of(callbackHandler));
       long sessionId = 1;
 
       {
@@ -334,7 +340,7 @@
       Message message = messageCapture.getValue();
       assertEquals(data.expectedWhat, message.what);
       assertSame(context, message.obj);
-      assertNotNull(context.outCommand);
+      assertTrue(context.outCommand.isPresent());
       currentHandler.removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
     }
   }
@@ -360,7 +366,7 @@
 
     verifyAll();
     assertEquals(0, countDownLatch.getCount());
-    assertNotNull(context.outCommand);
+    assertTrue(context.outCommand.isPresent());
   }
 
   @SmallTest
@@ -388,7 +394,7 @@
 
     ExecutorMainCallback callback = new ExecutorMainCallback(sessionHandler);
     callback.sessionId = sessionId;
-    callback.request = initialRequest;
+    callback.request = Optional.of(initialRequest);
 
     callback.updateRequest(
         Input.newBuilder().setRequest(diffRequest).addAllTouchEvents(touchEventList));
@@ -417,11 +423,13 @@
     callbackHandler.cancelTimeStamp = 0;
 
     EvaluationCallback evaluationCallback = createMock(EvaluationCallback.class);
-    evaluationCallback.onCompleted(null, null);
+    evaluationCallback.onCompleted(
+        Optional.<Command>absent(), Optional.<KeyEventInterface>absent());
     replayAll();
 
-    AsynchronousEvaluationContext context =
-        new AsynchronousEvaluationContext(1, null, null, evaluationCallback, callbackHandler);
+    AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
+        1, Input.newBuilder(), Optional.<KeyEventInterface>absent(),
+        Optional.of(evaluationCallback), Optional.<Handler>of(callbackHandler));
     Message message = callbackHandler.obtainMessage(CallbackHandler.UNSQUASHABLE_OUTPUT, context);
     callbackHandler.handleMessage(message);
 
@@ -444,7 +452,7 @@
     replayAll();
 
     SessionExecutor executor = new SessionExecutor();
-    executor.handler = handler;
+    executor.handler = Optional.of(handler);
 
     executor.deleteSession();
 
@@ -460,21 +468,22 @@
     replayAll();
 
     SessionExecutor executor = new SessionExecutor();
-    executor.handler = handler;
+    executor.handler = Optional.of(handler);
 
     Input.Builder inputBuilder = Input.newBuilder();
     KeyEventInterface keyEvent = KeycodeConverter.getKeyEventInterface(KeyEvent.KEYCODE_A);
 
-    executor.evaluateAsynchronously(inputBuilder, keyEvent, null);
+    executor.evaluateAsynchronously(
+        inputBuilder, Optional.of(keyEvent), Optional.<EvaluationCallback>absent());
 
     verifyAll();
     Message message = messageCapture.getValue();
     assertEquals(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY, message.what);
     AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
     assertSame(inputBuilder, context.inputBuilder);
-    assertSame(keyEvent, context.triggeringKeyEvent);
-    assertNull(context.callback);
-    assertNull(context.callbackHandler);
+    assertSame(keyEvent, context.triggeringKeyEvent.get());
+    assertFalse(context.callback.isPresent());
+    assertFalse(context.callbackHandler.isPresent());
   }
 
   @SmallTest
@@ -485,20 +494,21 @@
     replayAll();
 
     SessionExecutor executor = new SessionExecutor();
-    executor.handler = handler;
+    executor.handler = Optional.of(handler);
 
     Input.Builder inputBuilder = Input.newBuilder();
 
-    executor.evaluateAsynchronously(inputBuilder, null, null);
+    executor.evaluateAsynchronously(
+        inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
 
     verifyAll();
     Message message = messageCapture.getValue();
     assertEquals(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY, message.what);
     AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
     assertSame(inputBuilder, context.inputBuilder);
-    assertNull(context.triggeringKeyEvent);
-    assertNull(context.callback);
-    assertNull(context.callbackHandler);
+    assertFalse(context.triggeringKeyEvent.isPresent());
+    assertFalse(context.callback.isPresent());
+    assertFalse(context.callbackHandler.isPresent());
   }
 
   @SmallTest
@@ -516,10 +526,10 @@
         Message message = Message.class.cast(getCurrentArguments()[0]);
         SynchronousEvaluationContext context =
             SynchronousEvaluationContext.class.cast(message.obj);
-        context.outCommand = Command.newBuilder()
+        context.outCommand = Optional.of(Command.newBuilder()
             .setInput(Input.newBuilder().setType(CommandType.NO_OPERATION).build())
             .setOutput(Output.getDefaultInstance())
-            .build();
+            .build());
         context.evaluationSynchronizer.countDown();
         return Boolean.TRUE;
       }
@@ -528,7 +538,7 @@
     replayAll();
 
     SessionExecutor executor = new SessionExecutor();
-    executor.handler = handler;
+    executor.handler = Optional.of(handler);
 
     executor.evaluateSynchronously(Input.getDefaultInstance());
 
@@ -549,8 +559,8 @@
             .setType(CommandType.SEND_KEY)
             .setKey(mozcKeyEvent)
             .addAllTouchEvents(touchEventList)),
-        same(triggeringKeyEvent),
-        same(evaluationCallback));
+        sameOptional(triggeringKeyEvent),
+        sameOptional(evaluationCallback));
     replayAll();
 
     executor.sendKey(mozcKeyEvent, triggeringKeyEvent, touchEventList, evaluationCallback);
@@ -567,8 +577,7 @@
             .setType(CommandType.SEND_COMMAND)
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.SUBMIT))),
-        isNull(KeyEventInterface.class),
-        same(evaluationCallback));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
     replayAll();
 
     executor.submit(evaluationCallback);
@@ -579,17 +588,19 @@
   @SmallTest
   public void testSwitchInputMode() {
     SessionExecutor executor = createSessionExecutorMock();
+    EvaluationCallback callback = createNiceMock(EvaluationCallback.class);
+
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
                 .setCompositionMode(CompositionMode.DIRECT))),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(callback));
     replayAll();
 
-    executor.switchInputMode(null, CompositionMode.DIRECT, null);
+    executor.switchInputMode(
+        Optional.<KeyEventInterface>absent(), CompositionMode.DIRECT, callback);
 
     verifyAll();
   }
@@ -604,16 +615,14 @@
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.SUBMIT_CANDIDATE)
                 .setId(3))),
-        isNull(KeyEventInterface.class),
-        same(evaluationCallback));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SUBMITTED_CANDIDATE_ROW_GE10))),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.submitCandidate(3, Optional.<Integer>of(100), evaluationCallback);
@@ -629,8 +638,7 @@
             .setType(CommandType.SEND_COMMAND)
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.RESET_CONTEXT))),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.resetContext();
@@ -649,8 +657,7 @@
                 SessionCommand.newBuilder()
                 .setType(ProtoCommands.SessionCommand.CommandType.MOVE_CURSOR)
                 .setCursorPosition(5))),
-        isNull(KeyEventInterface.class),
-        same(evaluationCallback));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
     replayAll();
 
     executor.moveCursor(5, evaluationCallback);
@@ -659,6 +666,32 @@
   }
 
   @SmallTest
+  public void testPageDownAndUp() {
+    SessionExecutor executor = createSessionExecutorMock();
+    EvaluationCallback evaluationCallback = createNiceMock(EvaluationCallback.class);
+    executor.evaluateAsynchronously(
+        matchesBuilder(Input.newBuilder()
+            .setType(CommandType.SEND_COMMAND)
+            .setCommand(SessionCommand.newBuilder()
+                .setType(ProtoCommands.SessionCommand.CommandType.CONVERT_NEXT_PAGE))),
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
+    replayAll();
+    executor.pageDown(evaluationCallback);
+    verifyAll();
+
+    resetAll();
+    executor.evaluateAsynchronously(
+        matchesBuilder(Input.newBuilder()
+            .setType(CommandType.SEND_COMMAND)
+            .setCommand(SessionCommand.newBuilder()
+                .setType(ProtoCommands.SessionCommand.CommandType.CONVERT_PREV_PAGE))),
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
+    replayAll();
+    executor.pageUp(evaluationCallback);
+    verifyAll();
+  }
+
+  @SmallTest
   public void testSwitchInputFieldType() {
     SessionExecutor executor = createSessionExecutorMock();
     executor.evaluateAsynchronously(
@@ -668,8 +701,7 @@
                 .setType(SessionCommand.CommandType.SWITCH_INPUT_FIELD_TYPE))
             .setContext(ProtoCommands.Context.newBuilder()
                 .setInputFieldType(InputFieldType.NORMAL))),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.switchInputFieldType(InputFieldType.NORMAL);
@@ -688,8 +720,7 @@
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.UNDO_OR_REWIND))
             .addAllTouchEvents(touchEventList)),
-        isNull(KeyEventInterface.class),
-        same(evaluationCallback));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
     replayAll();
 
     executor.undoOrRewind(touchEventList, evaluationCallback);
@@ -707,8 +738,7 @@
                 .setType(StorageType.EMOTICON_HISTORY)
                 .setKey("TEST_KEY")
                 .addAllValue(Collections.singletonList(ByteString.copyFromUtf8("TEST_VALUE"))))),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.insertToStorage(
@@ -727,8 +757,7 @@
             .setType(CommandType.SEND_COMMAND)
             .setCommand(
                 SessionCommand.newBuilder().setType(SessionCommand.CommandType.EXPAND_SUGGESTION))),
-        isNull(KeyEventInterface.class),
-        same(evaluationCallback));
+        same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
     replayAll();
 
     executor.expandSuggestion(evaluationCallback);
@@ -741,6 +770,7 @@
     SessionExecutor executor = createSessionExecutorMock();
 
     Context context = getInstrumentation().getContext();
+    Context targetContext = getInstrumentation().getTargetContext();
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
     assertNotNull(sharedPreferences);
 
@@ -758,7 +788,7 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
                 .setUsageStatsEventIntValue(KeyboardLayout.GODAN.getId()))),
-        isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
@@ -766,9 +796,9 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
                 .setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
-        isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
-    executor.preferenceUsageStatsEvent(sharedPreferences);
+    executor.preferenceUsageStatsEvent(sharedPreferences, targetContext.getResources());
     verifyAll();
 
     sharedPreferences.edit()
@@ -783,7 +813,7 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
                 .setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
-        isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SEND_COMMAND)
@@ -791,9 +821,9 @@
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
                 .setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
                 .setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
-        isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
-    executor.preferenceUsageStatsEvent(sharedPreferences);
+    executor.preferenceUsageStatsEvent(sharedPreferences, targetContext.getResources());
     verifyAll();
   }
 
@@ -808,8 +838,7 @@
             .setCommand(SessionCommand.newBuilder()
                 .setType(SessionCommand.CommandType.USAGE_STATS_EVENT))
             .addAllTouchEvents(touchEventList)),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.touchEventUsageStatsEvent(touchEventList);
@@ -823,8 +852,7 @@
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SYNC_DATA)),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.syncData();
@@ -856,8 +884,7 @@
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SET_CONFIG)
             .setConfig(inputConfig)),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.setConfig(inputConfig);
@@ -874,8 +901,7 @@
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.SET_IMPOSED_CONFIG)
             .setConfig(inputConfig)),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.setImposedConfig(inputConfig);
@@ -971,8 +997,7 @@
     executor.evaluateAsynchronously(
         matchesBuilder(Input.newBuilder()
             .setType(CommandType.RELOAD)),
-        isNull(KeyEventInterface.class),
-        isNull(EvaluationCallback.class));
+        same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
     replayAll();
 
     executor.reload();
@@ -1007,7 +1032,7 @@
   public void testStressConversion() throws InterruptedException {
     MemoryLogger memoryLogger = new MemoryLogger("testStressConversion", 100);
 
-    SessionExecutor session = SessionExecutor.getInstance(null);
+    SessionExecutor session = SessionExecutor.getInstance(getInstrumentation().getContext());
     Context context = getInstrumentation().getTargetContext();
     session.reset(new SessionHandlerFactory(context), context);
 
@@ -1025,14 +1050,17 @@
       }
       session.sendKey(ProtoCommands.KeyEvent.newBuilder()
                           .setKeyString(composition.toString()).build(),
-                      null, Collections.<TouchEvent>emptyList(), null);
+                      createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+                      createNiceMock(EvaluationCallback.class));
       session.sendKey(ProtoCommands.KeyEvent.newBuilder()
                           .setSpecialKey(SpecialKey.SPACE).build(),
-                      null, Collections.<TouchEvent>emptyList(), null);
+                      createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+                      createNiceMock(EvaluationCallback.class));
       final CountDownLatch latch = new CountDownLatch(1);
       session.submit(new EvaluationCallback() {
         @Override
-        public void onCompleted(Command command, KeyEventInterface triggeringKeyEvent) {
+        public void onCompleted(
+            Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
           latch.countDown();
         }
       });
@@ -1051,7 +1079,7 @@
   public void testStressConversionKao() throws InterruptedException {
     MemoryLogger memoryLogger = new MemoryLogger("testStressConversionKao", 10);
 
-    SessionExecutor session = SessionExecutor.getInstance(null);
+    SessionExecutor session = SessionExecutor.getInstance(getInstrumentation().getContext());
     Context context = getInstrumentation().getTargetContext();
     session.reset(new SessionHandlerFactory(context), context);
 
@@ -1059,14 +1087,17 @@
     memoryLogger.logMemory("start");
     session.sendKey(ProtoCommands.KeyEvent.newBuilder()
                         .setKeyString(composition.toString()).build(),
-                    null, Collections.<TouchEvent>emptyList(), null);
+                    createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+                    createNiceMock(EvaluationCallback.class));
     session.sendKey(ProtoCommands.KeyEvent.newBuilder()
                         .setSpecialKey(SpecialKey.SPACE).build(),
-                    null, Collections.<TouchEvent>emptyList(), null);
+                    createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+                    createNiceMock(EvaluationCallback.class));
     final CountDownLatch latch = new CountDownLatch(1);
     session.submit(new EvaluationCallback() {
       @Override
-      public void onCompleted(Command command, KeyEventInterface triggeringKeyEvent) {
+      public void onCompleted(
+          Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
         latch.countDown();
       }
     });
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
index a4642a2..ff00a93 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
@@ -29,6 +29,8 @@
 
 package org.mozc.android.inputmethod.japanese.session;
 
+import com.google.common.base.Optional;
+
 import android.app.Activity;
 import android.content.SharedPreferences;
 import android.test.InstrumentationTestCase;
@@ -81,14 +83,6 @@
   }
 
   @SmallTest
-  public void testCreateSessionHandler_nullParameter() {
-    // SessionHandler instance for null parameter.
-    assertEquals(
-        LocalSessionHandler.class,
-        new SessionHandlerFactory(SharedPreferences.class.cast(null)).create().getClass());
-  }
-
-  @SmallTest
   public void testCreateSessionHandler_appropriateParameter() {
       // SessionHandlerSocketClient for appropriate preference.
     SharedPreferences.Editor editor = sharedPreferences.edit();
@@ -99,7 +93,7 @@
                      Integer.toString(PORT));
     editor.commit();
     assertEquals(SocketSessionHandler.class,
-                 new SessionHandlerFactory(sharedPreferences).create().getClass());
+                 new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
   }
 
   @SmallTest
@@ -113,7 +107,7 @@
                      Integer.toString(PORT));
     editor.commit();
     assertEquals(LocalSessionHandler.class,
-                 new SessionHandlerFactory(sharedPreferences).create().getClass());
+                 new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
   }
 
   @SmallTest
@@ -127,6 +121,6 @@
                      "MALFORMED");
     editor.commit();
     assertEquals(LocalSessionHandler.class,
-                 new SessionHandlerFactory(sharedPreferences).create().getClass());
+                 new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
index 808c8a0..1b2089d 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
@@ -29,10 +29,10 @@
 
 package org.mozc.android.inputmethod.japanese.stresstest;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.MozcService;
 import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.ViewManager;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
 import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
@@ -40,7 +40,7 @@
 import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
 import org.mozc.android.inputmethod.japanese.testing.MemoryLogger;
 import org.mozc.android.inputmethod.japanese.testing.mocking.MozcMockSupport;
-import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -66,8 +66,8 @@
 public class MozcStressTest extends InstrumentationTestCase {
   class OnCreateRunner implements Runnable {
     @Override
-    public void run(){
-       service = new MozcService(){
+    public void run() {
+       service = new MozcService() {
          /*
           * In tests which is set up here, this method returns false. This blocks our
           * tests and we don't concern this method. So this is little hacky.
@@ -100,17 +100,17 @@
     Instrumentation instrumentation = getInstrumentation();
     mockSupport = new MozcMockSupport(instrumentation);
 
-    activity = launchActivity(
-        "org.mozc.android.inputmethod.japanese", Activity.class, null);
+    activity = Preconditions.checkNotNull(launchActivity(
+        "org.mozc.android.inputmethod.japanese", Activity.class, null));
     instrumentation.runOnMainSync(new OnCreateRunner());
     context = instrumentation.getTargetContext();
   }
 
   @Override
   protected void tearDown() throws Exception {
-    if (activity != null) {
-      activity.finish();
-    }
+    activity.finish();
+
+    activity = null;
     service = null;
     inputView = null;
     viewManager = null;
@@ -179,16 +179,12 @@
     viewManager.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
 
     final int actions = 500;
+    Context context = getInstrumentation().getTargetContext();
 
-    SessionExecutor session = SessionExecutor.getInstance(null);
-    KeyboardSpecification specification = viewManager.getJapaneseKeyboardSpecification();
-    Request request = MozcUtil.getRequestForKeyboard(
-        specification.getKeyboardSpecificationName(),
-        Optional.of(specification.getSpecialRomanjiTable()),
-        Optional.of(specification.getSpaceOnAlphanumeric()),
-        Optional.of(specification.isKanaModifierInsensitiveConversion()),
-        Optional.of(specification.getCrossingEdgeBehavior()),
-        getInstrumentation().getTargetContext().getResources().getConfiguration());
+    SessionExecutor session = SessionExecutor.getInstance(context);
+    KeyboardSpecification specification = viewManager.getKeyboardSpecification();
+    Request request = MozcUtil.getRequestBuilder(
+        context.getResources(), specification, context.getResources().getConfiguration()).build();
     List<TouchEvent> touchEventList = Collections.emptyList();
 
     memoryLogger.logMemory("start");
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
index 28daf90..276db1f 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
@@ -29,8 +29,8 @@
 
 package org.mozc.android.inputmethod.japanese.testing;
 
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboardView;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -113,12 +113,11 @@
     return runner.result;
   }
 
-  public void setJapaneseKeyboard(final JapaneseKeyboardView view,
-                                  final JapaneseKeyboard keyboard) {
+  public void setKeyboard(final KeyboardView view, final Keyboard keyboard) {
     runOnMainSync(new Runnable() {
       @Override
       public void run() {
-        view.setJapaneseKeyboard(keyboard);
+        view.setKeyboard(keyboard);
       }
     });
   }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java
new file mode 100644
index 0000000..e3d009c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java
@@ -0,0 +1,45 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.ContextWrapper;
+
+/**
+ * Simple mock to be mocked by EasyMock.
+ *
+ * <p>On ART VM it gets impossible to mock system-provided class directly.
+ * However indirect mocking is possible so this class is introduced for the workaround.
+ */
+public class MockContext extends ContextWrapper {
+
+  public MockContext() {
+    super(null);
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java
new file mode 100644
index 0000000..ecd0d6d
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java
@@ -0,0 +1,57 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.drawable.Drawable;
+
+/**
+ * @see MockContext
+ */
+public class MockDrawable extends Drawable {
+
+  @Override
+  public void draw(Canvas canvas) {
+  }
+
+  @Override
+  public int getOpacity() {
+    return 0;
+  }
+
+  @Override
+  public void setAlpha(int alpha) {
+  }
+
+  @Override
+  public void setColorFilter(ColorFilter cf) {
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java
new file mode 100644
index 0000000..02f9f0c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java
@@ -0,0 +1,44 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @see MockContext
+ */
+public class MockInputStream extends InputStream {
+
+  @Override
+  public int read() throws IOException {
+    return 0;
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java
new file mode 100644
index 0000000..34c5048
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java
@@ -0,0 +1,474 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.FeatureInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import java.util.List;
+
+/**
+ * @see MockContext
+ */
+public class MockPackageManager extends PackageManager {
+
+  @Deprecated
+  @Override
+  public void addPackageToPreferred(String arg0) {
+  }
+
+  @Override
+  public boolean addPermission(PermissionInfo arg0) {
+    return false;
+  }
+
+  @Override
+  public boolean addPermissionAsync(PermissionInfo arg0) {
+    return false;
+  }
+
+  @Deprecated
+  @Override
+  public void addPreferredActivity(IntentFilter arg0, int arg1,
+      ComponentName[] arg2, ComponentName arg3) {
+
+  }
+
+  @Override
+  public String[] canonicalToCurrentPackageNames(String[] arg0) {
+    return null;
+  }
+
+  @Override
+  public int checkPermission(String arg0, String arg1) {
+    return 0;
+  }
+
+  @Override
+  public int checkSignatures(String arg0, String arg1) {
+    return 0;
+  }
+
+  @Override
+  public int checkSignatures(int arg0, int arg1) {
+    return 0;
+  }
+
+  @Override
+  public void clearPackagePreferredActivities(String arg0) {
+  }
+
+  @Override
+  public String[] currentToCanonicalPackageNames(String[] arg0) {
+    return null;
+  }
+
+  @Override
+  public void extendVerificationTimeout(int arg0, int arg1, long arg2) {
+  }
+
+  @Override
+  public Drawable getActivityIcon(ComponentName arg0)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Drawable getActivityIcon(Intent arg0) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public ActivityInfo getActivityInfo(ComponentName arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Drawable getActivityLogo(ComponentName arg0)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Drawable getActivityLogo(Intent arg0) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public List<PermissionGroupInfo> getAllPermissionGroups(int arg0) {
+    return null;
+  }
+
+  @Override
+  public int getApplicationEnabledSetting(String arg0) {
+    return 0;
+  }
+
+  @Override
+  public Drawable getApplicationIcon(ApplicationInfo arg0) {
+    return null;
+  }
+
+  @Override
+  public Drawable getApplicationIcon(String arg0) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public ApplicationInfo getApplicationInfo(String arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public CharSequence getApplicationLabel(ApplicationInfo arg0) {
+    return null;
+  }
+
+  @Override
+  public Drawable getApplicationLogo(ApplicationInfo arg0) {
+    return null;
+  }
+
+  @Override
+  public Drawable getApplicationLogo(String arg0) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public int getComponentEnabledSetting(ComponentName arg0) {
+    return 0;
+  }
+
+  @Override
+  public Drawable getDefaultActivityIcon() {
+    return null;
+  }
+
+  @Override
+  public Drawable getDrawable(String arg0, int arg1, ApplicationInfo arg2) {
+    return null;
+  }
+
+  @Override
+  public List<ApplicationInfo> getInstalledApplications(int arg0) {
+    return null;
+  }
+
+  @Override
+  public List<PackageInfo> getInstalledPackages(int arg0) {
+    return null;
+  }
+
+  @Override
+  public String getInstallerPackageName(String arg0) {
+    return null;
+  }
+
+  @Override
+  public InstrumentationInfo getInstrumentationInfo(ComponentName arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Intent getLaunchIntentForPackage(String arg0) {
+    return null;
+  }
+
+  @Override
+  public String getNameForUid(int arg0) {
+    return null;
+  }
+
+  @Override
+  public int[] getPackageGids(String arg0) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public PackageInfo getPackageInfo(String arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public String[] getPackagesForUid(int arg0) {
+    return null;
+  }
+
+  @Override
+  public List<PackageInfo> getPackagesHoldingPermissions(String[] arg0,
+      int arg1) {
+    return null;
+  }
+
+  @Override
+  public PermissionGroupInfo getPermissionGroupInfo(String arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public PermissionInfo getPermissionInfo(String arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public int getPreferredActivities(List<IntentFilter> arg0,
+      List<ComponentName> arg1, String arg2) {
+    return 0;
+  }
+
+  @Override
+  public List<PackageInfo> getPreferredPackages(int arg0) {
+    return null;
+  }
+
+  @Override
+  public ProviderInfo getProviderInfo(ComponentName arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public ActivityInfo getReceiverInfo(ComponentName arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Resources getResourcesForActivity(ComponentName arg0)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Resources getResourcesForApplication(ApplicationInfo arg0)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Resources getResourcesForApplication(String arg0)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public ServiceInfo getServiceInfo(ComponentName arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public FeatureInfo[] getSystemAvailableFeatures() {
+    return null;
+  }
+
+  @Override
+  public String[] getSystemSharedLibraryNames() {
+    return null;
+  }
+
+  @Override
+  public CharSequence getText(String arg0, int arg1, ApplicationInfo arg2) {
+    return null;
+  }
+
+  @Override
+  public XmlResourceParser getXml(String arg0, int arg1, ApplicationInfo arg2) {
+    return null;
+  }
+
+  @Override
+  public boolean hasSystemFeature(String arg0) {
+    return false;
+  }
+
+  @Override
+  public boolean isSafeMode() {
+    return false;
+  }
+
+  @Override
+  public List<ResolveInfo> queryBroadcastReceivers(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public List<ProviderInfo> queryContentProviders(String arg0, int arg1, int arg2) {
+    return null;
+  }
+
+  @Override
+  public List<InstrumentationInfo> queryInstrumentation(String arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public List<ResolveInfo> queryIntentActivities(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public List<ResolveInfo> queryIntentActivityOptions(ComponentName arg0,
+      Intent[] arg1, Intent arg2, int arg3) {
+    return null;
+  }
+
+  @Override
+  public List<ResolveInfo> queryIntentContentProviders(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public List<ResolveInfo> queryIntentServices(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public List<PermissionInfo> queryPermissionsByGroup(String arg0, int arg1)
+      throws NameNotFoundException {
+    return null;
+  }
+
+  @Deprecated
+  @Override
+  public void removePackageFromPreferred(String arg0) {
+  }
+
+  @Override
+  public void removePermission(String arg0) {
+  }
+
+  @Override
+  public ResolveInfo resolveActivity(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public ProviderInfo resolveContentProvider(String arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public ResolveInfo resolveService(Intent arg0, int arg1) {
+    return null;
+  }
+
+  @Override
+  public void setApplicationEnabledSetting(String arg0, int arg1, int arg2) {
+  }
+
+  @Override
+  public void setComponentEnabledSetting(ComponentName arg0, int arg1, int arg2) {
+  }
+
+  @Override
+  public void setInstallerPackageName(String arg0, String arg1) {
+  }
+
+  @Override
+  public void verifyPendingInstall(int arg0, int arg1) {
+  }
+
+  @Override
+  public Drawable getApplicationBanner(ApplicationInfo info) {
+    return null;
+  }
+
+  @Override
+  public Drawable getApplicationBanner(String packageName) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Drawable getActivityBanner(ComponentName activityName) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Drawable getActivityBanner(Intent intent) throws NameNotFoundException {
+    return null;
+  }
+
+  @Override
+  public Intent getLeanbackLaunchIntentForPackage(String packageName) {
+    return null;
+  }
+
+  @Override
+  public PackageInstaller getPackageInstaller() {
+    return null;
+  }
+
+  @Override
+  public Drawable getUserBadgedDrawableForDensity(Drawable arg0, UserHandle arg1, Rect arg2,
+      int arg3) {
+    return null;
+  }
+
+  @Override
+  public Drawable getUserBadgedIcon(Drawable arg0, UserHandle arg1) {
+    return null;
+  }
+
+  @Override
+  public CharSequence getUserBadgedLabel(CharSequence arg0, UserHandle arg1) {
+    return null;
+  }
+
+  // Overriding hidden public abstract method.
+  @SuppressWarnings("unused")
+  public Drawable getUserBadgeForDensity(UserHandle user, int density) {
+    return null;
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java
new file mode 100644
index 0000000..82ebbde
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java
@@ -0,0 +1,46 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.util.DisplayMetrics;
+
+
+/**
+ * Mock Resources with stub DisplayMetrics.
+ */
+public class MockResourcesWithDisplayMetrics extends android.test.mock.MockResources {
+
+  @Override
+  public final DisplayMetrics getDisplayMetrics() {
+    DisplayMetrics metrics = new DisplayMetrics();
+    metrics.density = 1f;
+    return metrics;
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java
new file mode 100644
index 0000000..714a36c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java
@@ -0,0 +1,260 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.SurfaceHolder.Callback2;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.Window;
+
+/**
+ * @see MockContext
+ */
+public class MockWindow extends Window {
+
+  public MockWindow(Context context) {
+    super(context);
+  }
+
+  @Override
+  public void addContentView(View view, LayoutParams params) {
+  }
+
+  @Override
+  public void closeAllPanels() {
+  }
+
+  @Override
+  public void closePanel(int featureId) {
+  }
+
+  @Override
+  public View getCurrentFocus() {
+    return null;
+  }
+
+  @Override
+  public View getDecorView() {
+    return null;
+  }
+
+  @Override
+  public LayoutInflater getLayoutInflater() {
+    return null;
+  }
+
+  @Override
+  public int getVolumeControlStream() {
+    return 0;
+  }
+
+  @Override
+  public void invalidatePanelMenu(int featureId) {
+  }
+
+  @Override
+  public boolean isFloating() {
+    return false;
+  }
+
+  @Override
+  public boolean isShortcutKey(int keyCode, KeyEvent event) {
+    return false;
+  }
+
+  @Override
+  protected void onActive() {
+  }
+
+  @Override
+  public void onConfigurationChanged(Configuration newConfig) {
+  }
+
+  @Override
+  public void openPanel(int featureId, KeyEvent event) {
+  }
+
+  @Override
+  public View peekDecorView() {
+    return null;
+  }
+
+  @Override
+  public boolean performContextMenuIdentifierAction(int id, int flags) {
+    return false;
+  }
+
+  @Override
+  public boolean performPanelIdentifierAction(int featureId, int id, int flags) {
+    return false;
+  }
+
+  @Override
+  public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) {
+    return false;
+  }
+
+  @Override
+  public void restoreHierarchyState(Bundle savedInstanceState) {
+  }
+
+  @Override
+  public Bundle saveHierarchyState() {
+    return null;
+  }
+
+  @Override
+  public void setBackgroundDrawable(Drawable drawable) {
+  }
+
+  @Override
+  public void setChildDrawable(int featureId, Drawable drawable) {
+  }
+
+  @Override
+  public void setChildInt(int featureId, int value) {
+  }
+
+  @Override
+  public void setContentView(int layoutResID) {
+  }
+
+  @Override
+  public void setContentView(View view) {
+  }
+
+  @Override
+  public void setContentView(View view, LayoutParams params) {
+  }
+
+  @Override
+  public void setFeatureDrawable(int featureId, Drawable drawable) {
+  }
+
+  @Override
+  public void setFeatureDrawableAlpha(int featureId, int alpha) {
+  }
+
+  @Override
+  public void setFeatureDrawableResource(int featureId, int resId) {
+  }
+
+  @Override
+  public void setFeatureDrawableUri(int featureId, Uri uri) {
+  }
+
+  @Override
+  public void setFeatureInt(int featureId, int value) {
+  }
+
+  @Override
+  public void setTitle(CharSequence title) {
+  }
+
+  @Deprecated
+  @Override
+  public void setTitleColor(int textColor) {
+  }
+
+  @Override
+  public void setVolumeControlStream(int streamType) {
+  }
+
+  @Override
+  public boolean superDispatchGenericMotionEvent(MotionEvent event) {
+    return false;
+  }
+
+  @Override
+  public boolean superDispatchKeyEvent(KeyEvent event) {
+    return false;
+  }
+
+  @Override
+  public boolean superDispatchKeyShortcutEvent(KeyEvent event) {
+    return false;
+  }
+
+  @Override
+  public boolean superDispatchTouchEvent(MotionEvent event) {
+    return false;
+  }
+
+  @Override
+  public boolean superDispatchTrackballEvent(MotionEvent event) {
+    return false;
+  }
+
+  @Override
+  public void takeInputQueue(android.view.InputQueue.Callback callback) {
+  }
+
+  @Override
+  public void takeKeyEvents(boolean get) {
+  }
+
+  @Override
+  public void takeSurface(Callback2 callback) {
+  }
+
+  @Override
+  public void togglePanel(int featureId, KeyEvent event) {
+  }
+
+  // hidden public abstract method.
+  public void alwaysReadCloseOnTouchAttr() {
+  }
+
+  @Override
+  public int getStatusBarColor() {
+    return 0;
+  }
+
+  @Override
+  public void setStatusBarColor(int color) {
+  }
+
+  @Override
+  public int getNavigationBarColor() {
+    return 0;
+  }
+
+  @Override
+  public void setNavigationBarColor(int color) {
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
index 11f5582..7b801b2 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
@@ -32,10 +32,13 @@
 import static org.easymock.EasyMock.reportMatcher;
 
 import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import com.google.protobuf.Message;
 
 import android.graphics.Canvas;
 import android.graphics.Paint;
+import android.view.KeyEvent;
 
 import org.easymock.Capture;
 import org.easymock.IArgumentMatcher;
@@ -55,6 +58,7 @@
    * This subclass hold copied instance instead.
    */
   public static class DeepCopyPaintCapture extends Capture<Paint> {
+
     @Override
     public void setValue(Paint value) {
       // Don't user Paint(Paint) constructor, which doesn't copy the fields.
@@ -69,13 +73,10 @@
    * Matcher implementation for protobuf's MessageBuilder.
    */
   private static class MessageBuilderMatcher implements IArgumentMatcher {
-    private Message expected;
+    private final Message expected;
 
     MessageBuilderMatcher(Message.Builder builder) {
-      if (builder == null) {
-        throw new NullPointerException("builder is null.");
-      }
-      this.expected = builder.buildPartial();
+      this.expected = Preconditions.checkNotNull(builder).buildPartial();
     }
 
     @Override
@@ -98,20 +99,22 @@
    * Matcher implementation for KeyEvent, which matches action and key code.
    */
   private static class KeyEventMatcher implements IArgumentMatcher {
+
     private final int expectedKeyCode;
-    private final android.view.KeyEvent expectedNativeKeyEvent;
+    private final Optional<android.view.KeyEvent> expectedNativeKeyEvent;
 
     KeyEventMatcher(int expectedKeyCode) {
       this.expectedKeyCode = expectedKeyCode;
-      this.expectedNativeKeyEvent = null;
+      this.expectedNativeKeyEvent = Optional.absent();
     }
     KeyEventMatcher(android.view.KeyEvent expectedNativeKeyEvent) {
       this.expectedKeyCode = android.view.KeyEvent.KEYCODE_UNKNOWN;
-      this.expectedNativeKeyEvent = expectedNativeKeyEvent;
+      this.expectedNativeKeyEvent = Optional.of(expectedNativeKeyEvent);
     }
 
     @Override
     public void appendTo(StringBuffer sb) {
+      Preconditions.checkNotNull(sb);
       sb.append("matchesKeyEvent(");
       sb.appendCodePoint(expectedKeyCode);
       sb.append(")");
@@ -123,26 +126,26 @@
         return false;
       }
       KeyEventInterface keyEvent = KeyEventInterface.class.cast(arg);
-      if (expectedNativeKeyEvent != null) {
-        return keyEvent.getNativeEvent() == expectedNativeKeyEvent;
+      if (expectedNativeKeyEvent.isPresent()) {
+        Optional<KeyEvent> nativeEvent = keyEvent.getNativeEvent();
+        return nativeEvent.isPresent() && (nativeEvent.get() == expectedNativeKeyEvent.get());
       }
-      return keyEvent.getNativeEvent() == null && keyEvent.getKeyCode() == expectedKeyCode;
+      return !keyEvent.getNativeEvent().isPresent() && keyEvent.getKeyCode() == expectedKeyCode;
     }
   }
 
-
   /**
    * Matcher implementation for Canvas, which matches expected matrix conversion given by
    * sourcePoints and targetPoints.
    */
   private static class CanvasPointMatcher implements IArgumentMatcher {
-    private float[] sourcePoints;
-    private float[] targetPoints;
+
+    private final float[] sourcePoints;
+    private final float[] targetPoints;
 
     CanvasPointMatcher(float[] sourcePoints, float[] targetPoints) {
-      if (sourcePoints == null || targetPoints == null) {
-        throw new NullPointerException("sourcePoints and targetPoints should not be null.");
-      }
+      Preconditions.checkNotNull(sourcePoints);
+      Preconditions.checkNotNull(targetPoints);
       if (sourcePoints.length != targetPoints.length) {
         throw new IllegalArgumentException(
             "The length of sourcePoints and one of targetPoints shoudld be same. "
@@ -176,6 +179,35 @@
     }
   }
 
+  /**
+   * Matcher implementation for Optional, which contains a same object.
+   */
+  private static class SameOptionalMatcher<T> implements IArgumentMatcher {
+
+    private final T expectedValue;
+
+    SameOptionalMatcher(T value) {
+      this.expectedValue = Preconditions.checkNotNull(value);
+    }
+
+    @Override
+    public void appendTo(StringBuffer buff) {
+      buff.append("matchOptional(")
+          .append(expectedValue)
+          .append(")");
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public boolean matches(Object arg) {
+      if (!(arg instanceof Optional)) {
+        return false;
+      }
+      Optional targetValue = Optional.class.cast(arg);
+      return expectedValue == targetValue.orNull();
+    }
+  }
+
   // Disallow instantiation.
   private MozcMatcher() {
   }
@@ -212,4 +244,12 @@
     reportMatcher(new CanvasPointMatcher(sourcePoints, targetPoints));
     return null;
   }
+
+  /**
+   * Expects a {@link Optional}, which contains a same object.
+   */
+  public static <T> Optional<T> sameOptional(T value) {
+    reportMatcher(new SameOptionalMatcher<T>(value));
+    return null;
+  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
index 949a0a9..0a8fd83 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
@@ -31,22 +31,26 @@
 
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.geq;
 import static org.easymock.EasyMock.getCurrentArguments;
 import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.leq;
 import static org.easymock.EasyMock.same;
 
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
-import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
 import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
 import com.google.common.base.Optional;
 
 import android.graphics.Canvas;
+import android.graphics.Paint;
 import android.graphics.Rect;
-import android.test.mock.MockResources;
 import android.view.View;
 
 import org.easymock.IAnswer;
@@ -95,53 +99,46 @@
     }
     CandidateLayout candidateLayout = new CandidateLayout(rowList, 50, 50);
 
-    // Set up the testee instance and mocks.
-    View targetView = createViewMock(View.class);
-    resetAll();
-    expect(targetView.getResources()).andStubReturn(new MockResources());
-    replayAll();
     CandidateLayoutRenderer renderer = createMockBuilder(CandidateLayoutRenderer.class)
-        .withConstructor(View.class)
-        .withArgs(targetView)
         .addMockedMethod("drawSpan")
         .createMock();
 
-    // Inject CarrierEmojiRenderHelper mock.
-    CarrierEmojiRenderHelper carrierEmojiRenderHelper =
-        createMockBuilder(CarrierEmojiRenderHelper.class)
-        .withConstructor(View.class)
-        .withArgs(targetView)
-        .createMock();
-    VisibilityProxy.setField(renderer, "carrierEmojiRenderHelper", carrierEmojiRenderHelper);
-
-    Canvas canvas = createMock(Canvas.class);
+    // Test if the focused index is updated by setCandidateList.
     resetAll();
 
-    // Set CandidateList should affect to the carrierEmojiRenderHelper.
-    carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
     replayAll();
-
     renderer.setCandidateList(Optional.of(candidateList));
 
     verifyAll();
-    // The focused index should also be updated.
     assertEquals(6, renderer.focusedIndex);
 
+    // Test if the focused index is -1 for absent candidate list.
     resetAll();
-    carrierEmojiRenderHelper.setCandidateList(Optional.<CandidateList>absent());
-    replayAll();
 
+    replayAll();
     renderer.setCandidateList(Optional.<CandidateList>absent());
 
     verifyAll();
     assertEquals(-1, renderer.focusedIndex);
 
-    resetAll();
-    // Set the candidateList again.
-    carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
-    replayAll();
+    // drawCandidateLayout is tested below.  Set up CarrrierEmojiRenderHelper and Canvas mocks.
+    View targetView = createViewMock(View.class);
+    CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+        createMockBuilder(CarrierEmojiRenderHelper.class)
+        .withConstructor(View.class)
+        .withArgs(targetView)
+        .createNiceMock();
+    Canvas canvas = createMockBuilder(Canvas.class)
+        .addMockedMethod("getClipBounds", Rect.class)
+        .addMockedMethod("drawLine")
+        .createMock();
 
+    // Set the candidate list to both renderer and carrierEmojiRenderHelper.
+    resetAll();
+
+    replayAll();
     renderer.setCandidateList(Optional.of(candidateList));
+    carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
 
     verifyAll();
     assertEquals(6, renderer.focusedIndex);
@@ -160,33 +157,236 @@
 
     // All spans which are in the bounding box (or crossing the boundary) should be rendered.
     // (1, 1) element is focused (specified by CandidateList#getFocusedIndex), and (1, 3) element is
-    // pressed (set "8" in the drawCandidateLayout's argument below).
+    // pressed (set "8" in the drawCandidateLayout's argument below).  In this case, separators are
+    // drawn on the right edge of each span because each span to be rendered is not rightmost.
+    // Separator length is not tested but should be less than or equal to the edge length, i.e., 10.
     renderer.drawSpan(
-        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true));
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(10f), eq(10f), leq(20f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false));
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(10f), eq(20f), leq(20f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true));
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(10f), eq(30f), leq(20f), isA(Paint.class));
 
     renderer.drawSpan(
-        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false));
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(20f), eq(10f), leq(30f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false));
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(20f), eq(20f), leq(30f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false));
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(20f), eq(30f), leq(30f), isA(Paint.class));
 
     renderer.drawSpan(
-        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false));
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(30f), eq(10f), leq(40f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false));
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(30f), eq(20f), leq(40f), isA(Paint.class));
     renderer.drawSpan(
-        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false));
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(30f), eq(30f), leq(40f), isA(Paint.class));
 
     replayAll();
 
     // 8 is the pseudo pressing candidate.
-    renderer.drawCandidateLayout(canvas, candidateLayout, 8);
+    renderer.drawCandidateLayout(canvas, candidateLayout, 8, carrierEmojiRenderHelper);
 
     verifyAll();
+
+    // Next, test rendering on the whole canvas.
+    resetAll();
+
+    expect(canvas.getClipBounds(isA(Rect.class))).andStubAnswer(new IAnswer<Boolean>() {
+      @Override
+      public Boolean answer() throws Throwable {
+        Rect.class.cast(getCurrentArguments()[0]).set(0, 0, 50, 50);
+        return Boolean.TRUE;
+      }
+    });
+
+    // Note that, in each row, a separator is not drawn after the last span, i.e., drawn only
+    // between spans.  The focused and pressed spans are the same as before.
+    // Row 0
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(0)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(0f), eq(10f), leq(10f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(0f), eq(20f), leq(10f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(0f), eq(30f), leq(10f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(40f), geq(0f), eq(40f), leq(10f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(4)), eq(false),
+        same(carrierEmojiRenderHelper));
+
+    // Row 1
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(0)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(10f), eq(10f), leq(20f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(10f), eq(20f), leq(20f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(10f), eq(30f), leq(20f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(40f), geq(10f), eq(40f), leq(20f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(4)), eq(false),
+        same(carrierEmojiRenderHelper));
+
+    // Row 2
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(0)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(20f), eq(10f), leq(30f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(20f), eq(20f), leq(30f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(20f), eq(30f), leq(30f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(40f), geq(20f), eq(40f), leq(30f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(4)), eq(false),
+        same(carrierEmojiRenderHelper));
+
+    // Row 3
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(0)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(30f), eq(10f), leq(40f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(30f), eq(20f), leq(40f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(30f), eq(30f), leq(40f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(40f), geq(30f), eq(40f), leq(40f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(4)), eq(false),
+        same(carrierEmojiRenderHelper));
+
+    // Row 4
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(0)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(10f), geq(40f), eq(10f), leq(50f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(1)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(20f), geq(40f), eq(20f), leq(50f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(2)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(30f), geq(40f), eq(30f), leq(50f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(3)), eq(false),
+        same(carrierEmojiRenderHelper));
+    canvas.drawLine(eq(40f), geq(40f), eq(40f), leq(50f), isA(Paint.class));
+    renderer.drawSpan(
+        same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(4)), eq(false),
+        same(carrierEmojiRenderHelper));
+
+    replayAll();
+    renderer.drawCandidateLayout(canvas, candidateLayout, 8, carrierEmojiRenderHelper);
+
+    verifyAll();
+  }
+
+  public void testVeryLongValueAndDescription() {
+    String veryLongWord = "";
+    for (int i = 0; i < 64; ++i) {
+      veryLongWord += "ああああ";
+    }
+    CandidateList candidateList = CandidateList.newBuilder()
+        .addCandidates(CandidateWord.newBuilder()
+            .setId(0)
+            .setIndex(0)
+            .setKey(veryLongWord)
+            .setValue(veryLongWord)
+            .setAnnotation(Annotation.newBuilder()
+                .setDescription(veryLongWord)))
+        .build();
+    CandidateLayoutRenderer renderer = new CandidateLayoutRenderer();
+    renderer.setCandidateList(Optional.of(candidateList));
+    renderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.EXCLUSIVE);
+    renderer.setValueScalingPolicy(ValueScalingPolicy.HORIZONTAL);
+    int textSize = 10;
+    renderer.setValueTextSize(textSize);
+    renderer.setDescriptionTextSize(textSize);
+    Paint paint = new Paint();
+    paint.setTextSize(textSize);
+    float wordWidth = paint.measureText(veryLongWord);
+
+    Row row = new Row();
+    row.setTop(10);
+    row.setHeight(10);
+    row.setWidth(10);
+    Span span = new Span(
+        Optional.of(candidateList.getCandidates(0)), wordWidth, wordWidth,
+        Collections.<String>emptyList());
+    span.setLeft(0);
+    span.setRight(10);
+    row.addSpan(span);
+    List<Row> rowList = Collections.singletonList(row);
+    CandidateLayout candidateLayout = new CandidateLayout(rowList, 10, 10);
+
+    View targetView = createViewMock(View.class);
+    CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+        createMockBuilder(CarrierEmojiRenderHelper.class)
+        .withConstructor(View.class)
+        .withArgs(targetView)
+        .createNiceMock();
+    Canvas canvas = createMockBuilder(Canvas.class)
+        .addMockedMethod("getClipBounds", Rect.class)
+        .createNiceMock();
+    expect(canvas.getClipBounds(isA(Rect.class))).andStubAnswer(new IAnswer<Boolean>() {
+      @Override
+      public Boolean answer() throws Throwable {
+        Rect.class.cast(getCurrentArguments()[0]).set(0, 0, 10, 10);
+        return Boolean.TRUE;
+      }
+    });
+
+    replayAll();
+    renderer.drawCandidateLayout(canvas, candidateLayout, 0, carrierEmojiRenderHelper);
+    verifyAll();
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
index abb76e9..98afde0 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
@@ -200,7 +200,7 @@
     ConversionCandidateLayouter.layoutSpanList(spanList, 180, 18, DUMMY_CHUNK_METRICS, new int[18]);
 
     // The remaining chunks will be assigned to the spans.
-    float[] expectedXCoord = {0, 30, 60, 100, 140, 180};
+    float[] expectedXCoord = {0, 40, 80, 120, 150, 180};
     for (int i = 0; i < spanList.size(); ++i) {
       assertEquals(expectedXCoord[i], spanList.get(i).getLeft());
       assertEquals(expectedXCoord[i + 1], spanList.get(i).getRight());
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java
new file mode 100644
index 0000000..8fe3e73
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java
@@ -0,0 +1,186 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.ViewEventListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.MotionEvent;
+
+/**
+ * Test for FloatingCandidateLayoutRenderer.
+ */
+public class FloatingCandidateLayoutRendererTest extends InstrumentationTestCaseWithMock {
+
+  private Command generateCommandsProto(int candidatesNum) {
+    Preconditions.checkArgument(0 <= candidatesNum && candidatesNum < 10);
+    Candidates.Builder candidatesBuilder = Candidates.newBuilder();
+    for (int i = 0; i < candidatesNum; ++i) {
+      candidatesBuilder.addCandidate(Candidate.newBuilder()
+          .setIndex(i)
+          .setValue("cand_" + Integer.toString(i))
+          .setId(i)
+          .setAnnotation(Annotation.newBuilder().setShortcut(Integer.toString(i + 1))));
+    }
+    candidatesBuilder.setSize(candidatesNum);
+    candidatesBuilder.setPosition(0);
+
+    return Command.newBuilder()
+        .setOutput(Output.newBuilder().setCandidates(candidatesBuilder))
+        .buildPartial();
+  }
+
+  @SmallTest
+  public void testSetCandidates() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+    layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+    // No candidates
+    layoutRenderer.setCandidates(generateCommandsProto(0));
+    assertFalse(layoutRenderer.getWindowRect().isPresent());
+
+    layoutRenderer.setCandidates(generateCommandsProto(1));
+    Optional<Rect> candidateRect1 = layoutRenderer.getWindowRect();
+    assertTrue(candidateRect1.isPresent());
+    assertTrue(0 > candidateRect1.get().left);
+    assertEquals(0, candidateRect1.get().top);
+    assertTrue(candidateRect1.get().width() > 0);
+    assertTrue(candidateRect1.get().height() > 0);
+
+    layoutRenderer.setCandidates(generateCommandsProto(2));
+    Optional<Rect> candidateRect2 = layoutRenderer.getWindowRect();
+    assertTrue(candidateRect2.isPresent());
+    assertTrue(0 > candidateRect2.get().left);
+    assertEquals(0, candidateRect2.get().top);
+    assertTrue(candidateRect2.get().width() > 0);
+    assertTrue(candidateRect2.get().height() > 0);
+
+    int candidateHeight = candidateRect2.get().height() - candidateRect1.get().height();
+
+    layoutRenderer.setCandidates(generateCommandsProto(3));
+    Optional<Rect> candidateRect3 = layoutRenderer.getWindowRect();
+    assertTrue(candidateRect3.isPresent());
+    assertTrue(0 > candidateRect3.get().left);
+    assertEquals(0, candidateRect3.get().top);
+    assertTrue(candidateRect3.get().width() > 0);
+    assertEquals(candidateRect2.get().height() + candidateHeight, candidateRect3.get().height());
+  }
+
+  public void testSetMaxWidth() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+    layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+    layoutRenderer.setCandidates(generateCommandsProto(1));
+    Rect originalCandidateRect = layoutRenderer.getWindowRect().get();
+    int maxWidth = originalCandidateRect.width() - 1;
+
+    layoutRenderer.setMaxWidth(maxWidth);
+    Optional<Rect> candidateRectWithLimit = layoutRenderer.getWindowRect();
+    assertTrue(candidateRectWithLimit.isPresent());
+    assertEquals(maxWidth, candidateRectWithLimit.get().width());
+    assertEquals(originalCandidateRect.height(), candidateRectWithLimit.get().height());
+
+    layoutRenderer.setMaxWidth(originalCandidateRect.width());
+    assertEquals(originalCandidateRect, layoutRenderer.getWindowRect().get());
+
+    layoutRenderer.setMaxWidth(0);
+    assertFalse(layoutRenderer.getWindowRect().isPresent());
+  }
+
+  @SmallTest
+  public void testTouchEvent() {
+    Resources resources = getInstrumentation().getTargetContext().getResources();
+    FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+    layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+    layoutRenderer.setCandidates(generateCommandsProto(1));
+    int hight1 = layoutRenderer.getWindowRect().get().height();
+    layoutRenderer.setCandidates(generateCommandsProto(2));
+    int hight2 = layoutRenderer.getWindowRect().get().height();
+    int candidateHeight = hight2 - hight1;
+
+    ViewEventListener listener = createMock(ViewEventListener.class);
+    layoutRenderer.setViewEventListener(listener);
+
+    resetAll();
+    listener.onConversionCandidateSelected(0, Optional.<Integer>absent());
+    replayAll();
+    MotionEvent downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, 0, 0);
+    MotionEvent upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, 0, 0);
+    try {
+      layoutRenderer.onTouchEvent(downEvent);
+      layoutRenderer.onTouchEvent(upEvent);
+    } finally {
+      downEvent.recycle();
+      upEvent.recycle();
+    }
+    verifyAll();
+
+    resetAll();
+    listener.onConversionCandidateSelected(0, Optional.<Integer>absent());
+    replayAll();
+    downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, 0, 0);
+    upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, candidateHeight - 1, 0);
+    try {
+      layoutRenderer.onTouchEvent(downEvent);
+      layoutRenderer.onTouchEvent(upEvent);
+    } finally {
+      downEvent.recycle();
+      upEvent.recycle();
+    }
+    verifyAll();
+
+    resetAll();
+    listener.onConversionCandidateSelected(1, Optional.<Integer>absent());
+    replayAll();
+    downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, candidateHeight, 0);
+    upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, candidateHeight, 0);
+    try {
+      layoutRenderer.onTouchEvent(downEvent);
+      layoutRenderer.onTouchEvent(upEvent);
+    } finally {
+      downEvent.recycle();
+      upEvent.recycle();
+    }
+    verifyAll();
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java
new file mode 100644
index 0000000..e2f153a
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java
@@ -0,0 +1,114 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+
+import android.annotation.TargetApi;
+import android.os.Handler;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+
+/**
+ * Test for FloatingCandidateLayoutRenderer.
+ */
+@ApiLevel(21)
+@TargetApi(21)
+public class FloatingModeIndicatorTest extends InstrumentationTestCaseWithMock {
+
+  private final Command emptyCommand = Command.getDefaultInstance();
+  private final Command nonEmptyCommand = Command.newBuilder()
+      .setOutput(Output.newBuilder()
+          .setPreedit(Preedit.newBuilder()
+              .addSegment(Segment.getDefaultInstance())
+              .buildPartial())
+          .buildPartial())
+      .buildPartial();
+  private final Command switchInputModeCommand = Command.newBuilder()
+      .setInput(Input.newBuilder()
+          .setType(Input.CommandType.SEND_COMMAND)
+          .setCommand(SessionCommand.newBuilder()
+              .setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
+              .buildPartial())
+          .buildPartial())
+      .buildPartial();
+
+  private void clearMessages(Handler handler) {
+    handler.removeMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR);
+  }
+
+  @SmallTest
+  public void testBasicBehavior() {
+    View parentView = createViewMockBuilder(View.class).createNiceMock();
+    FloatingModeIndicator modeIndicator = new FloatingModeIndicator(parentView);
+
+    replayAll();
+
+    assertEquals(View.GONE, modeIndicator.popup.getContentView().getVisibility());
+    assertFalse(modeIndicator.isVisible());
+
+    modeIndicator.setCompositionMode(CompositionMode.HIRAGANA);
+    assertTrue(modeIndicator.isVisible());
+    assertTrue(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+    clearMessages(modeIndicator.handler);
+
+    modeIndicator.setCommand(nonEmptyCommand);
+    assertFalse(modeIndicator.isVisible());
+    assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+    clearMessages(modeIndicator.handler);
+
+    modeIndicator.setCompositionMode(CompositionMode.HALF_ASCII);
+    assertFalse(modeIndicator.isVisible());
+    assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+    clearMessages(modeIndicator.handler);
+
+    modeIndicator.setCommand(emptyCommand);
+    modeIndicator.setCompositionMode(CompositionMode.HALF_ASCII);
+    assertTrue(modeIndicator.isVisible());
+    assertTrue(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+    clearMessages(modeIndicator.handler);
+
+    // SWITCH_INPUT_MODE should be ignored.
+    modeIndicator.setCommand(switchInputModeCommand);
+    assertTrue(modeIndicator.isVisible());
+    assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+    clearMessages(modeIndicator.handler);
+
+    verifyAll();
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
index fd4187c..f177e92 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
@@ -46,6 +46,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.test.mock.MockContext;
+import android.test.mock.MockPackageManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import java.util.Collections;
@@ -74,7 +75,6 @@
     int[] indexToIdTable = new int[] {
         R.string.menu_item_input_method,
         R.string.menu_item_preferences,
-        R.string.menu_item_voice_input,
         R.string.menu_item_mushroom,
     };
     MenuDialogListenerHandler handler =
@@ -116,21 +116,12 @@
 
     verifyAll();
 
-    // Test for onLaunchVoiceInputActivitySelected.
-    resetAll();
-    listener.onLaunchVoiceInputActivitySelected(same(context));
-    replayAll();
-
-    handler.onClick(dialog, 2);
-
-    verifyAll();
-
     // Test for onShowMushroomSelectionDialogSelected.
     resetAll();
     listener.onShowMushroomSelectionDialogSelected(same(context));
     replayAll();
 
-    handler.onClick(dialog, 3);
+    handler.onClick(dialog, 2);
 
     verifyAll();
   }
@@ -141,24 +132,15 @@
 
     // If no mushroom-aware application is installed, Mushroom should be disabled.
     resetAll();
-    PackageManager packageManager = createMock(PackageManager.class);
+    PackageManager packageManager = createMock(MockPackageManager.class);
     expect(packageManager.queryIntentActivities(notNull(Intent.class), eq(0)))
         .andStubReturn(Collections.<ResolveInfo>emptyList());
     expect(context.getPackageManager()).andStubReturn(packageManager);
     replayAll();
-    {  // Voice: Off, Mushroom: On
-      List<Integer> result = MenuDialog.getEnabledMenuIds(context, true);
-      assertEquals(3, result.size());
-      assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
-      assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
-      assertEquals(R.string.menu_item_voice_input, result.get(2).intValue());
-    }
-    {  // Voice: Off, Mushroom: Off
-      List<Integer> result = MenuDialog.getEnabledMenuIds(context, false);
-      assertEquals(2, result.size());
-      assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
-      assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
-    }
+    List<Integer> result = MenuDialog.getEnabledMenuIds(context);
+    assertEquals(2, result.size());
+    assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
+    assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
     verifyAll();
 
     // If a mushroom-aware application is installed, Mushroom should be enabled.
@@ -167,21 +149,11 @@
         .andStubReturn(Collections.singletonList(new ResolveInfo()));
     expect(context.getPackageManager()).andStubReturn(packageManager);
     replayAll();
-    {  // Voice: On, Mushroom: On
-      List<Integer> result = MenuDialog.getEnabledMenuIds(context, true);
-      assertEquals(4, result.size());
-      assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
-      assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
-      assertEquals(R.string.menu_item_voice_input, result.get(2).intValue());
-      assertEquals(R.string.menu_item_mushroom, result.get(3).intValue());
-    }
-    {  // Voice: Off, Mushroom: On
-      List<Integer> result = MenuDialog.getEnabledMenuIds(context, false);
-      assertEquals(3, result.size());
-      assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
-      assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
-      assertEquals(R.string.menu_item_mushroom, result.get(2).intValue());
-    }
+    result = MenuDialog.getEnabledMenuIds(context);
+    assertEquals(3, result.size());
+    assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
+    assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
+    assertEquals(R.string.menu_item_mushroom, result.get(2).intValue());
     verifyAll();
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java
new file mode 100644
index 0000000..f31161b
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java
@@ -0,0 +1,97 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.isA;
+
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+
+import android.content.Context;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.easymock.Capture;
+import org.easymock.IAnswer;
+
+/**
+ * Test for PopUpLayouter class.
+ */
+public class PopUpLayouterTest extends InstrumentationTestCaseWithMock {
+
+  @SmallTest
+  public void testBasicLayout() {
+    Context context = getInstrumentation().getTargetContext();
+    FrameLayout screenContentLayout = createMockBuilder(FrameLayout.class)
+        .withConstructor(context)
+        .createMock();
+    View rootView = createViewMock(View.class);
+    View parentView = createViewMock(View.class);
+    View popUpContentView = createViewMock(View.class);
+
+    IAnswer<Void> getLocationInWindowAnswer = new IAnswer<Void>() {
+      @Override
+      public Void answer() {
+        int[] location = int[].class.cast(getCurrentArguments()[0]);
+        location[0] = 100;
+        location[1] = 200;
+        return null;
+      }
+    };
+
+    Capture<FrameLayout.LayoutParams> layoutCapture = new Capture<FrameLayout.LayoutParams>();
+
+    resetAll();
+    expect(rootView.findViewById(android.R.id.content)).andStubReturn(
+        View.class.cast(screenContentLayout));
+    screenContentLayout.addView(eq(popUpContentView), isA(FrameLayout.LayoutParams.class));
+    expect(parentView.getRootView()).andStubReturn(View.class.cast(rootView));
+    parentView.getLocationInWindow(isA(int[].class));
+    expectLastCall().andAnswer(getLocationInWindowAnswer);
+    expect(popUpContentView.getLayoutParams()).andStubReturn(
+        new FrameLayout.LayoutParams(1000, 1000));
+    popUpContentView.setLayoutParams(capture(layoutCapture));
+    replayAll();
+    PopUpLayouter<View> layouter = new PopUpLayouter<View>(parentView, popUpContentView);
+    layouter.setBounds(110, 220, 330, 550);
+    verifyAll();
+
+    assertEquals(popUpContentView, layouter.getContentView());
+    assertEquals(210, layoutCapture.getValue().leftMargin);
+    assertEquals(420, layoutCapture.getValue().topMargin);
+    assertEquals(220, layoutCapture.getValue().width);
+    assertEquals(330, layoutCapture.getValue().height);
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
index 4c78226..e9c78ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
@@ -38,11 +38,14 @@
 /**
  */
 public class ScrollGuideViewTest extends InstrumentationTestCase {
+
   @SmallTest
   public void testScrollGuideViewSkin() {
     ScrollGuideView view = new ScrollGuideView(getInstrumentation().getTargetContext());
-    Drawable drawable = view.scrollBarDrawable;
-    view.setSkinType(SkinType.TEST);
-    assertNotSame(drawable, view.scrollBarDrawable);
+    Drawable scrollBarDrawable = view.scrollBarDrawable;
+    Drawable backgroundDrawable = view.getBackground();
+    view.setSkin(SkinType.TEST.getSkin(getInstrumentation().getTargetContext().getResources()));
+    assertNotSame(scrollBarDrawable, view.scrollBarDrawable);
+    assertNotSame(backgroundDrawable, view.getBackground());
   }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
index 9be7cff..21c597e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
@@ -33,15 +33,12 @@
 
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
-import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
 
 import android.test.suitebuilder.annotation.SmallTest;
 
 import junit.framework.TestCase;
 
-import java.util.Arrays;
-
 /**
  * Unit test for {@link SpanFactory}.
  *
@@ -82,40 +79,4 @@
     assertEquals(valueSpan.getValueWidth(), mergedSpan.getValueWidth());
     assertEquals(descriptionSpan.getDescriptionWidth(), mergedSpan.getDescriptionWidth());
   }
-
-  @SmallTest
-  public void testSplitDescriptionList() {
-    class TestData extends Parameter {
-      final String description;
-      final String[] expectedResult;
-
-      TestData(String description, String[] expectedResult) {
-        super();
-        this.description = description;
-        this.expectedResult = expectedResult;
-      }
-    }
-    TestData[] testDataList = {
-        new TestData("", new String[]{}),
-        new TestData("a", new String[]{"a"}),
-        new TestData("a b", new String[]{"a", "b"}),
-        new TestData("a b c d", new String[]{"a", "b", "c", "d"}),
-        new TestData("a b c d e", new String[]{"a", "b", "c", "d", "e"}),
-        // NG words
-        new TestData("ひらがな", new String[]{}),
-        new TestData("a ひらがな b", new String[]{"a", "b"}),
-    };
-
-    SpanFactory spanFactory = new SpanFactory();
-    spanFactory.setDescriptionDelimiter(" ");
-    for (TestData testData : testDataList) {
-      CandidateWord candidateWord = CandidateWord.newBuilder()
-          .setAnnotation(Annotation.newBuilder()
-              .setDescription(testData.description))
-          .build();
-      assertEquals(testData.toString(),
-                   Arrays.asList(testData.expectedResult),
-                   spanFactory.newInstance(candidateWord).getSplitDescriptionList());
-    }
-  }
 }
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java
new file mode 100644
index 0000000..9d530f7
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java
@@ -0,0 +1,96 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.List;
+
+/**
+ * Teset for CandidateDescriptionUtil class.
+ */
+public class CandidateDescriptionUtilTest extends InstrumentationTestCase {
+
+  @SmallTest
+  public void testExtractDescriptions() {
+    class TestData extends Parameter {
+      final String input;
+      final String[] expectedDescriptions;
+
+      public TestData(String input, String[] expectedDescriptions) {
+        this.input = Preconditions.checkNotNull(input);
+        this.expectedDescriptions = Preconditions.checkNotNull(expectedDescriptions);
+      }
+    }
+
+    TestData[] testDataArray = new TestData[] {
+        new TestData("[全]", new String[] {"[全]"}),
+        new TestData("[全] てすと", new String[] {"[全]", "てすと"}),
+        new TestData("[全]\nてすと", new String[] {"[全]", "てすと"}),
+        new TestData("丸数字", new String[] {}),
+        new TestData("丸数字 [全]", new String[] {"[全]"}),
+        new TestData("[全] 丸数字", new String[] {"[全]"}),
+        new TestData("[全] 丸数字 てすと", new String[] {"[全]", "てすと"}),
+        new TestData("小書き文字", new String[] {"小書き"}),
+        new TestData("小書き文字 [全]", new String[] {"小書き", "[全]"}),
+        new TestData("[全] 小書き文字", new String[] {"[全]", "小書き"}),
+        new TestData("[全] 小書き文字 てすと", new String[] {"[全]", "小書き", "てすと"}),
+        new TestData("亜の旧字体", new String[] {}),
+        new TestData("亜の旧字体 [全]", new String[] {"[全]"}),
+        new TestData("[全] 亜の旧字体", new String[] {"[全]"}),
+        new TestData("[全] 亜の旧字体\n小書き文字 丸数字 てすと", new String[] {"[全]", "小書き", "てすと"}),
+    };
+
+    assertEquals(
+        CandidateDescriptionUtil.extractDescriptions("", Optional.<String>absent()).size(), 0);
+    assertEquals(CandidateDescriptionUtil.extractDescriptions("", Optional.of(" \n")).size(), 0);
+
+    for (TestData testData : testDataArray) {
+      List<String> descriptionsWithoutDelimiter =
+          CandidateDescriptionUtil.extractDescriptions(testData.input, Optional.<String>absent());
+      assertEquals(testData.input, 1, descriptionsWithoutDelimiter.size());
+      assertEquals(testData.input, testData.input, descriptionsWithoutDelimiter.get(0));
+
+      List<String> descriptionsWithDelimiter =
+          CandidateDescriptionUtil.extractDescriptions(testData.input, Optional.of(" \n"));
+      assertEquals(testData.input,
+                   testData.expectedDescriptions.length, descriptionsWithDelimiter.size());
+      for (int i = 0; i < testData.expectedDescriptions.length; ++i) {
+        assertEquals(testData.input + " i=" + i,
+                     testData.expectedDescriptions[i], descriptionsWithDelimiter.get(i));
+      }
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java
new file mode 100644
index 0000000..bfcc965
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java
@@ -0,0 +1,109 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+
+import android.content.SharedPreferences;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for LauncherIconManagerFactory.
+ */
+public class LauncherIconManagerFactoryTest extends InstrumentationTestCase {
+
+  /**
+   * Test for shouldLauncherIconBeVisible.
+   * Note that this test focus on the situation where PREF_LAUNCHER_ICON_VISIBILITY_KEY is not set.
+   * Preinstall version (2.16.1955.3) without showing preference screen OR first launch.
+   */
+  @SmallTest
+  public void testShouldLauncherIconBeVisible() {
+    SharedPreferences sharedPreferences = MozcPreferenceUtil.getSharedPreferences(
+        getInstrumentation().getContext(), "CLIENT_SIDE_PREF");
+    class TestData extends Parameter {
+      final boolean isSystemApplication;
+      final boolean isUpdatedSystemApplication;
+      final boolean isLaunchedAtLeastOnce;
+      final boolean expectation;
+      public TestData(boolean isSystemApplication, boolean isUpdatedSystemApplication,
+                      boolean isLaunchedAtLeastOnce, boolean expectation) {
+        this.isSystemApplication = isSystemApplication;
+        this.isUpdatedSystemApplication = isUpdatedSystemApplication;
+        this.isLaunchedAtLeastOnce = isLaunchedAtLeastOnce;
+        this.expectation = expectation;
+      }
+    }
+    // NOTE: Basically if isLaunchedAtLeastOnce is true shouldLauncherIconBeVisible is not called.
+    //       However Preinstall (2.16.1955.3) doesn't set PREF_LAUNCHER_ICON_VISIBILITY_KEY
+    //       preference so the version and the first launch after upgrade from the version
+    //       reach here.
+    TestData[] testDataList = {
+        // Launch PlayStore as the first time.
+        new TestData(false, false, false, true),
+        // Preinstall version (never launched) -> Launch PlayStore
+        // This situation should be treated as the same as usual installation from PlayStore.
+        new TestData(false, true, false, true),  // Never happen. Just in case.
+        new TestData(true, true, false, true),
+        // Launch Preinstall as the first time (2.16.1955.3) -> Launch PlayStore.
+        // The icon should be kept invisible.
+        // NOTE: PlayStore -> Playstore scenario doesn't reach here because visibility preference is
+        //       set on the first launch.
+        new TestData(false, true, true, false),  // Never happen. Just in case.
+        new TestData(true, true, true, false),
+        // Launch Preinstall (any version) as the first time.
+        new TestData(true, false, false, false),
+        // Launch Preinstall (2.16.1955.3) as the first time -> Launch Preinstall
+        new TestData(true, false, true, false),
+        // Below situation should never happen.
+        // new TestData(false, false, true, n/a),
+    };
+    for (TestData testData : testDataList) {
+      SharedPreferences.Editor editor = sharedPreferences.edit().clear();
+      if (testData.isLaunchedAtLeastOnce) {
+        editor.putInt(PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 1234);
+      }
+      editor.apply();
+      MozcUtil.setSystemApplication(Optional.of(testData.isSystemApplication));
+      MozcUtil.setUpdatedSystemApplication(Optional.of(testData.isUpdatedSystemApplication));
+      assertEquals(
+          testData.toString(),
+          testData.expectation,
+          LauncherIconManagerFactory.DefaultImplementation
+              .shouldLauncherIconBeVisible(getInstrumentation().getTargetContext(),
+                                           sharedPreferences));
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
index 152485f..0c2a520 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
@@ -36,6 +36,7 @@
 import org.mozc.android.inputmethod.japanese.MozcUtil;
 import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockInputStream;
 
 import android.annotation.TargetApi;
 import android.content.Context;
@@ -438,7 +439,7 @@
 
   @SmallTest
   public void testOpenRawResource1() {
-    InputStream stream = createMock(InputStream.class);
+    InputStream stream = createMock(MockInputStream.class);
     TypedValue value = new TypedValue();
     expect(base.openRawResource(eq(10), same(value))).andReturn(stream);
     replayAll();
@@ -450,7 +451,7 @@
 
   @SmallTest
   public void testOpenRawResource2() throws NotFoundException {
-    InputStream stream = createMock(InputStream.class);
+    InputStream stream = createMock(MockInputStream.class);
     expect(base.openRawResource(10)).andReturn(stream);
     replayAll();
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
index 47832a9..3c5aa53 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
@@ -58,7 +58,7 @@
       succeeded = true;
       return expected;
     } finally {
-      MozcUtil.close(zipInputStream, !succeeded);
+      MozcUtil.close(apkFile, !succeeded);
     }
   }
 
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java b/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java
new file mode 100644
index 0000000..c09bb45
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java
@@ -0,0 +1,71 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.vectorgraphic;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.os.Environment;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Saves given {@code Bitmap} to the external stroge.
+ */
+public class BitmapSaver {
+
+  private BitmapSaver() {
+  }
+
+  /**
+   * @param filename e.g., "test-01.png"
+   * @param bitmap a Bitmap to be saved
+   * @return fullpath to resulting .png file.
+   */
+  public static String saveAsPng(String filename, Bitmap bitmap) {
+    FileOutputStream output = null;
+    try {
+      File file = new File(Environment.getExternalStorageDirectory(), filename);
+      output = new FileOutputStream(file);
+      bitmap.compress(CompressFormat.PNG, 100, output);
+      return file.getAbsolutePath();
+    } catch (FileNotFoundException e) {
+      throw new RuntimeException(e);
+    } finally {
+      try {
+        output.close();
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
index 6d82322..cf2b409 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
@@ -44,10 +44,21 @@
  */
 public class DrawableCacheTest extends InstrumentationTestCaseWithMock {
 
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    Skin.getFallbackInstance().resetDrawableFactory();
+    for (SkinType skinType : SkinType.values()) {
+      skinType.getSkin(
+          getInstrumentation().getTargetContext().getResources()).resetDrawableFactory();
+    }
+ }
+
   @SmallTest
   public void testDrawableCache() {
     Resources resources = createMock(MockResources.class);
-    DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
+    DrawableCache drawableCache = new DrawableCache(resources);
+    drawableCache.setSkin(Skin.getFallbackInstance());
 
     // For invalid resource id (0), getDrawable returns {@code Optional.<Drawable>absent()} without
     // looking up resources.
@@ -91,7 +102,8 @@
   @SmallTest
   public void testSetSkinType() {
     Resources resources = createMock(MockResources.class);
-    DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
+    DrawableCache drawableCache = new DrawableCache(resources);
+    drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
     Drawable drawable = new ColorDrawable(Color.BLACK);
     expect(resources.getResourceTypeName(1)).andReturn("drawable");
     expect(resources.getDrawable(1)).andReturn(drawable);
@@ -106,7 +118,7 @@
     resetAll();
     replayAll();
 
-    drawableCache.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+    drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
     assertSame(drawable, drawableCache.getDrawable(1).get());
 
     verifyAll();
@@ -118,7 +130,7 @@
     expect(resources.getDrawable(1)).andReturn(drawable);
     replayAll();
 
-    drawableCache.setSkinType(SkinType.TEST);
+    drawableCache.setSkin(SkinType.TEST.getSkin(resources));
     assertSame(drawable, drawableCache.getDrawable(1).get());
 
     verifyAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
index 677abc0..5867766 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
@@ -49,7 +49,8 @@
   @SmallTest
   public void testGetDrawableRaw() {
     Resources resources = getInstrumentation().getTargetContext().getResources();
-    MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+    MozcDrawableFactory factory =
+        new MozcDrawableFactory(resources, new Skin());
 
     // Unfortunately it is difficult to check if the returned drawable renders as what we want,
     // because PictureDrawable renders in native code so we cannot intercept the Canvas,
@@ -88,7 +89,7 @@
     expect(resources.getDrawable(1)).andReturn(drawable);
     replayAll();
 
-    MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+    MozcDrawableFactory factory = new MozcDrawableFactory(resources, new Skin());
     assertSame(drawable, factory.getDrawable(1).get());
 
     verifyAll();
@@ -98,7 +99,7 @@
   public void testEmojiDrawable() {
     // Try to parse all emoji Drawable.
     Resources resources = getInstrumentation().getTargetContext().getResources();
-    MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+    MozcDrawableFactory factory = new MozcDrawableFactory(resources, new Skin());
 
     for (String prefix : new String[] { "docomo_emoji_", "softbank_emoji_", "kddi_emoji_" }) {
       for (int codePoint = 0xFE000; codePoint <= 0xFEEA0; ++codePoint) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java
new file mode 100644
index 0000000..b484dc1
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java
@@ -0,0 +1,94 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.view.SkinParser.SkinParserException;
+
+import android.content.res.Resources;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for {@code SkinParser}
+ */
+public class SkinParserTest extends InstrumentationTestCase {
+
+  @SmallTest
+  public void testParser_correctSkin() throws SkinParserException {
+    Resources resources = getInstrumentation().getContext().getResources();
+    int[] skinIds = {
+        org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_correct_drawable_test_1};
+    for (int id : skinIds) {
+      SkinParser parser = new SkinParser(resources, resources.getXml(id));
+      Skin skin = parser.parseSkin();
+      assertTrue(skin.windowBackgroundDrawable != DummyDrawable.getInstance());
+    }
+  }
+
+  @SmallTest
+  public void testParser_incorrectSkin() {
+    // Note: Use getContext() to get test packge's resources.
+    Resources resources = getInstrumentation().getContext().getResources();
+    int[] skinIds = {org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_1,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_2,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_3,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_4,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_5,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_6,
+                      org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_7};
+    for (int id : skinIds) {
+      try {
+        SkinParser parser = new SkinParser(resources, resources.getXml(id));
+        parser.parseSkin();
+      } catch (SkinParserException e) {
+        // Expected.
+        continue;
+      }
+      fail("SkinParserException must be thrown at ID 0x" + Integer.toString(id, 16));
+    }
+  }
+
+  @SmallTest
+  public void testDrawableParser_incorrectSkin() {
+    Resources resources = getInstrumentation().getContext().getResources();
+    int[] skinIds = {
+        org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_incorrect_drawable_test_1};
+    for (int id : skinIds) {
+      try {
+        SkinParser parser = new SkinParser(resources, resources.getXml(id));
+        parser.parseSkin();
+      } catch (SkinParserException e) {
+        // Expected.
+        continue;
+      }
+      fail("SkinParserException must be thrown at ID 0x" + Integer.toString(id, 16));
+    }
+  }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
index 602dfbe..4e9df97 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
@@ -30,21 +30,21 @@
 package org.mozc.android.inputmethod.japanese.view;
 
 import android.graphics.Paint;
-
-import junit.framework.TestCase;
+import android.test.InstrumentationTestCase;
 
 /**
  * Unit test for SkinType.
  */
-public class SkinTypeTest extends TestCase {
+public class SkinTypeTest extends InstrumentationTestCase {
   public void testCategorySupport() {
     // Just make sure that all known categories are supported on all skins.
     Paint paint = new Paint();
     for (SkinType skinType : SkinType.values()) {
-      skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_MAIN);
-      skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_GUIDE);
-      skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT);
-      skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT);
+      Skin skin = skinType.getSkin(getInstrumentation().getTargetContext().getResources());
+      skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_MAIN);
+      skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_GUIDE);
+      skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT);
+      skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT);
     }
   }
 }
diff --git a/src/android/userfeedback/project.properties b/src/android/userfeedback/project.properties
index 9aacf2f..c3b6d82 100644
--- a/src/android/userfeedback/project.properties
+++ b/src/android/userfeedback/project.properties
@@ -39,4 +39,4 @@
 android.library=true
 
 # Project target.
-target=android-19
+target=android-21
diff --git a/src/base/base.gyp b/src/base/base.gyp
index b1b0640..32940d8 100644
--- a/src/base/base.gyp
+++ b/src/base/base.gyp
@@ -309,20 +309,17 @@
             '../data/keymap/ms-ime.tsv',
             '../data/preedit/12keys-halfwidthascii.tsv',
             '../data/preedit/12keys-hiragana.tsv',
-            '../data/preedit/12keys-number.tsv',
             '../data/preedit/flick-halfwidthascii.tsv',
             '../data/preedit/flick-hiragana.tsv',
-            '../data/preedit/flick-number.tsv',
             '../data/preedit/hiragana-romanji.tsv',
             '../data/preedit/kana.tsv',
+            '../data/preedit/notouch-hiragana.tsv',
             '../data/preedit/godan-hiragana.tsv',
             '../data/preedit/qwerty_mobile-halfwidthascii.tsv',
-            '../data/preedit/qwerty_mobile-hiragana-number.tsv',
             '../data/preedit/qwerty_mobile-hiragana.tsv',
             '../data/preedit/romanji-hiragana.tsv',
             '../data/preedit/toggle_flick-halfwidthascii.tsv',
             '../data/preedit/toggle_flick-hiragana.tsv',
-            '../data/preedit/toggle_flick-number.tsv',
           ],
           'outputs': [
             '<(gen_out_dir)/config_file_stream_data.h',
diff --git a/src/build_mozc.py b/src/build_mozc.py
index 0a0dc44..42ea387 100644
--- a/src/build_mozc.py
+++ b/src/build_mozc.py
@@ -225,6 +225,9 @@
   elif options.target_platform == 'NaCl':
     # Add chrome NaCl Mozc gyp scripts.
     gyp_file_names.append('%s/chrome/nacl/nacl_extension.gyp' % SRC_DIR)
+  elif options.target_platform == 'Android':
+    # Add Android Mozc gyp scripts.
+    gyp_file_names.extend(glob.glob('%s/android/*/*.gyp' % SRC_DIR))
   gyp_file_names.sort()
   return gyp_file_names
 
@@ -1199,24 +1202,24 @@
       android_arch = GetMozcVersion().GetAndroidArch()
       if android_arch == 'arm':
         avd_configs = [
-            {'--name': 'Nexus5-ApiL-arm-WVGA800',
+            {'--name': 'Nexus5-Api21-arm-WVGA800',
              '--target': 'android-21',
              '--abi': 'default/armeabi-v7a',
              '--device': 'Nexus 5',
              '--skin': 'WVGA800'},
-            {'--name': 'Nexus10-ApiL-arm-WXGA800',
+            {'--name': 'Nexus10-Api21-arm-WXGA800',
              '--target': 'android-21',
              '--abi': 'default/armeabi-v7a',
              '--device': 'Nexus 10',
              '--skin': 'WXGA800'},]
       elif android_arch == 'x86':
         avd_configs = [
-            {'--name': 'Nexus5-ApiL-x86-WVGA800',
+            {'--name': 'Nexus5-Api21-x86-WVGA800',
              '--target': 'android-21',
              '--abi': 'default/x86',
              '--device': 'Nexus 5',
              '--skin': 'WVGA800'},
-            {'--name': 'Nexus10-ApiL-x86-WXGA800',
+            {'--name': 'Nexus10-Api21-x86-WXGA800',
              '--target': 'android-21',
              '--abi': 'default/x86',
              '--device': 'Nexus 10',
@@ -1247,11 +1250,18 @@
       serialnumbers.extend([emulator.serial for emulator in emulators])
 
     # Run native and Java tests.
+    # If --configuration is Release, Java tests are skipped.
+    if options.configuration == 'Release':
+      targets = ['run_native_test']
+      logging.info('As this is Relase configuration, Java tests are skipped.')
+    else:
+      # run_java_test must be executed after run_native_test
+      # because package manager, which is mandatory to run Java tests,
+      # requires minutes to get ready.
+      targets = ['run_native_test', 'run_java_test']
+
     android_gyp = os.path.join(SRC_DIR, 'android', 'android.gyp')
-    # run_java_test must be executed after run_native_test
-    # because package manager, which is mandatory to run Java tests,
-    # requires minutes to get ready.
-    for target in ('run_native_test', 'run_java_test'):
+    for target in targets:
       (build_options, build_targets) = ParseBuildOptions(
           build_args + ['%s:%s' % (android_gyp, target)])
       # Injects android_device attribute to build_options.
@@ -1334,6 +1344,9 @@
       targets.append('out_win/%s:unittests' % options.configuration)
     else:
       targets.append('%s/gyp/tests.gyp:unittests' % SRC_DIR)
+    if target_platform == 'Android' and options.configuration != 'Release':
+      targets.append('%s/android/android.gyp:build_java_test' % SRC_DIR)
+
 
   # Build the test targets
   (build_opts, build_args) = ParseBuildOptions(build_options + targets)
@@ -1346,6 +1359,7 @@
     RunTests(GetBuildBaseName(options, target_platform), options.configuration,
              options.test_jobs)
 
+
 def CleanBuildFilesAndDirectories(options, unused_args):
   """Cleans build files and directories."""
   # File and directory names to be removed.
@@ -1373,18 +1387,19 @@
                                      GetMozcVersion().GetTargetPlatform())
   if target_platform:
     directory_names.append(target_platform)
-
   if IsLinux():
     # Remove auto-generated files.
     file_names.append(os.path.join(SRC_DIR, 'android', 'AndroidManifest.xml'))
     file_names.append(os.path.join(
         SRC_DIR, 'android', 'tests', 'AndroidManifest.xml'))
+    # Remove a symbolic link to android/resources/res
+    file_names.append(os.path.join(SRC_DIR, 'android', 'resources', 'res'))
     directory_names.append(os.path.join(SRC_DIR, 'android', 'assets'))
     # Delete files/dirs generated by Android SDK/NDK.
     android_library_projects = [
         '',
         'protobuf',
-        'static_resources/resources_oss',
+        'resources',
         'tests',
         ]
     android_generated_dirs = ['bin', 'gen', 'obj', 'libs', 'gen_for_adt']
@@ -1392,11 +1407,6 @@
       for directory in android_generated_dirs:
         directory_names.append(
             os.path.join(SRC_DIR, 'android', project, directory))
-    # In addition, remove resources/res/raw directory, which contains
-    # generated .pic files.
-    directory_names.append(
-        os.path.join(SRC_DIR, 'android', 'static_resources/resources_oss',
-                     'res', 'raw'))
 
   # Remove files.
   for file_name in file_names:
diff --git a/src/build_tools/copy_file.py b/src/build_tools/copy_file.py
index 5bcf4a9..f2f42c7 100644
--- a/src/build_tools/copy_file.py
+++ b/src/build_tools/copy_file.py
@@ -32,9 +32,7 @@
 
 This script provides more features than 'copies' rule of GYP.
 1. The destination file name can be different from the original name.
-2. Changes the last update time according to a reference file.
-(This is the same as `touch -r REFERENCE_FILE'.)
-3. Is able to copy directories recursively.
+2. Is able to copy directories recursively.
 """
 
 __author__ = "yukishiino"
@@ -59,79 +57,90 @@
 
 
 def CopyFiles(src_list, dst, src_base='',
-              preserve=False, recursive=False, reference=None,
+              preserve=False, recursive=False,
               ignore_existence_check=False):
   """Copy files like 'cp' command on Unix.
 
   Args:
     src_list: List of files to be copied.
     dst: The destination file or directory.
-    src_base: The base directory which holds |src_list|.
+    src_base: Base directory of the source files.
+       The following path is copied to the destination.
+       e.g. src: a/b/c/d/e.txt , base_dir: a/b/ -> dest: c/d/e.txt
     preserve: Preserves last update time.  Permissions for files are always
         copied.
     recursive: Copies files recursively.
-    reference: Last update time in the form of (atime, mtime) to be copied
-        to files.  The reference time is prioritized over preserving.
     ignore_existence_check: Ignores existence check for src files.
   """
   if not src_list:
     return
 
-  def _CopyFile(src_file, dst_file):
-    if os.path.isdir(dst_file):
-      _ErrorExit('An unexpected dir `%s\' exists' % dst_file)
-    if ignore_existence_check and not os.path.exists(src_file):
-      # Skip non-existent src.
-      return
-    shutil.copy(src_file, dst_file)
-    _CopyUpdateTimeAndPermission(src_file, dst_file)
+  def _MakeDirs(dir):
+    if not os.path.exists(dir):
+      os.makedirs(dir)
 
-  def _CopyDir(src_dir, dst_dir, file_list=None):
-    if file_list is None:
-      file_list = os.listdir(src_dir)
-    for filename in file_list:
+  def _CopyDir(src_dir, dst_dir):
+    _MakeDirs(dst_dir)
+
+    for filename in os.listdir(src_dir):
       src = os.path.join(src_dir, filename)
-      dst = os.path.join(dst_dir, filename)
-      _Copy(src, dst)
+      _Copy(src, dst_dir)
 
   def _Copy(src, dst):
-    if os.path.isdir(src):
-      if not recursive:
-        _ErrorExit('Cannot copy a directory `%s\'' % src)
-      if not os.path.isdir(dst):
-        os.mkdir(dst)
-        _CopyDir(src, dst)
-        _CopyUpdateTimeAndPermission(src, dst)
-      else:
-        _CopyDir(src, dst)
-    else:
-      _CopyFile(src, dst)
+    if os.path.isdir(dst):
+      dst = os.path.join(dst, os.path.basename(src))
 
-  def _CopyUpdateTimeAndPermission(src, dst):
+    if os.path.isdir(src):
+      _CopyDir(src, dst)
+    else:
+      shutil.copy(src, dst)
+
+    # Copy update time and permission
     if preserve:
       shutil.copystat(src, dst)
-    if reference:
-      os.utime(dst, reference)
     # Changes the file writable so we can overwrite it later.
     os.chmod(dst, os.stat(dst).st_mode | stat.S_IWRITE)
 
-  # Create the parent directory of dst.
-  dst_parent = os.path.abspath(os.path.dirname(dst))
-  if dst_parent and not os.path.exists(dst_parent):
-    os.makedirs(dst_parent)
+  def _ErrorCheck(src, src_base):
+    if not os.path.exists(src):
+      if ignore_existence_check:
+        return False
+      else:
+        _ErrorExit('No such file or directory: "%s"' % src)
 
-  if len(src_list) is 1:
-    src = os.path.join(src_base, src_list[0])
-    if os.path.isdir(dst):
-      dst = os.path.join(dst, os.path.basename(os.path.abspath(src)))
-    _Copy(src, dst)
-  else:  # len(src_list) > 1
-    if not os.path.isdir(dst):
-      os.mkdir(dst)
-    for src in src_list:
-      src = os.path.abspath(os.path.join(src_base, src))
-      (src_dir, src_file) = os.path.split(src)
-      _CopyDir(src_dir, dst, [src_file])
+    if os.path.isdir(src) and not recursive:
+      _ErrorExit('Cannot copy a directory: "%s"' % src)
+
+    if not src.startswith(src_base):
+      _ErrorExit('Source file does not start with src_base: "%s"' % src)
+
+    return True
+
+  dst = os.path.abspath(dst)
+  if src_base:
+    src_base = os.path.abspath(src_base)
+
+  # dst may be a file instead of a directory.
+  if len(src_list) == 1 and not os.path.exists(dst) and not src_base:
+    src = os.path.abspath(src_list[0])
+    if _ErrorCheck(src, src_base):
+      _MakeDirs(os.path.dirname(dst))
+      _Copy(src, dst)
+    return
+
+  # dst should be a directory here.
+  for src in src_list:
+    src = os.path.abspath(src)
+
+    if src_base:
+      dst_dir = os.path.join(dst,
+                             os.path.relpath(os.path.dirname(src), src_base))
+    else:
+      dst_dir = dst
+
+    if _ErrorCheck(src, src_base):
+      _MakeDirs(dst_dir)
+      _Copy(src, dst_dir)
 
 
 def _GetUpdateTime(filename):
@@ -151,14 +160,15 @@
 def main():
   parser = optparse.OptionParser(
       usage='Usage: %prog [OPTION]... SOURCE... DEST')
+  parser.add_option('--src_base', dest='src_base', default='',
+                    help=('Base directory of the source files. '
+                          'The following path is copied to the destination.'))
   parser.add_option('--preserve', '-p', dest='preserve',
                     action='store_true', default=False,
                     help='Preserves last update time.')
   parser.add_option('--recursive', '-r', dest='recursive',
                     action='store_true', default=False,
                     help='Copies directories recursively.')
-  parser.add_option('--reference', dest='reference',
-                    help='Uses this file\'s last update time.')
   parser.add_option('--ignore_existence_check', dest='ignore_existence_check',
                     action='store_true', default=False,
                     help='Ignore existence check for src files.')
@@ -167,15 +177,11 @@
   if len(args) < 2:
     _ErrorExit('The arguments must be source(s) and destination files.')
 
-  reference_time = (_GetUpdateTime(options.reference)
-                    if options.reference else None)
-
   src_list = args[:-1]
   dst = args[-1]
 
-  CopyFiles(src_list, dst,
+  CopyFiles(src_list, dst, src_base=options.src_base,
             preserve=options.preserve, recursive=options.recursive,
-            reference=reference_time,
             ignore_existence_check=options.ignore_existence_check)
 
 
diff --git a/src/build_tools/util.py b/src/build_tools/util.py
index 929f7c5..e2ee846 100644
--- a/src/build_tools/util.py
+++ b/src/build_tools/util.py
@@ -40,6 +40,8 @@
 import stat
 import subprocess
 import sys
+import tempfile
+import zipfile
 
 
 def IsWindows():
@@ -237,3 +239,24 @@
       record.levelname = ColoredText(level_name, level_no)
 
     return True
+
+
+def WalkFileContainers(comma_separated_paths):
+  """Walks like os.walk() accepting comma separated directory or zip file paths.
+
+  Args:
+    comma_separated_paths: e.g., "directory/path,zip/file/path.zip"
+  Yields:
+    See os.walk()
+  """
+  for path in comma_separated_paths.split(','):
+    if os.path.isdir(path):
+      for dirpath, dirnames, filenames in os.walk(path):
+        yield dirpath, dirnames, filenames
+    else:
+      tempdir = tempfile.mkdtemp()
+      with zipfile.ZipFile(path, 'r') as z:
+        z.extractall(tempdir)
+        for dirpath, dirnames, filenames in os.walk(tempdir):
+          yield dirpath, dirnames, filenames
+
diff --git a/src/composer/table.cc b/src/composer/table.cc
index a0eadf1..cdd2745 100644
--- a/src/composer/table.cc
+++ b/src/composer/table.cc
@@ -60,28 +60,24 @@
 const char k12keysHiraganaTableFile[] = "system://12keys-hiragana.tsv";
 const char k12keysHalfwidthasciiTableFile[]
     = "system://12keys-halfwidthascii.tsv";
-const char k12keysNumberTableFile[]
-    = "system://12keys-number.tsv";
 const char kFlickHiraganaTableFile[] = "system://flick-hiragana.tsv";
 const char kFlickHalfwidthasciiTableFile[]
     = "system://flick-halfwidthascii.tsv";
-const char kFlickNumberTableFile[]
-    = "system://flick-number.tsv";
 const char kToggleFlickHiraganaTableFile[]
     = "system://toggle_flick-hiragana.tsv";
 const char kToggleFlickHalfwidthasciiTableFile[]
     = "system://toggle_flick-halfwidthascii.tsv";
-const char kToggleFlickNumberTableFile[]
-    = "system://toggle_flick-number.tsv";
 // Special tables for QWERTY mobile
 const char kQwertyMobileHiraganaTableFile[]
     = "system://qwerty_mobile-hiragana.tsv";
-const char kQwertyMobileHiraganaNumberTableFile[]
-    = "system://qwerty_mobile-hiragana-number.tsv";
 const char kQwertyMobileHalfwidthasciiTableFile[]
     = "system://qwerty_mobile-halfwidthascii.tsv";
 // Special tables for Godan
 const char kGodanHiraganaTableFile[] = "system://godan-hiragana.tsv";
+const char kNotouchHiraganaTableFile[] = "system://notouch-hiragana.tsv";
+// Reuse qwerty_mobile-halfwidthascii table
+const char kNotouchHalfwidthasciiTableFile[]
+    = "system://qwerty_mobile-halfwidthascii.tsv";
 
 const char kNewChunkPrefix[] = "\t";
 const char kSpecialKeyOpen[] = "\x0F";  // Shift-In of ASCII
@@ -139,27 +135,18 @@
       case mozc::commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII:
         table_file_name = k12keysHalfwidthasciiTableFile;
         break;
-      case mozc::commands::Request::TWELVE_KEYS_TO_NUMBER:
-        table_file_name = k12keysNumberTableFile;
-        break;
       case mozc::commands::Request::FLICK_TO_HIRAGANA:
         table_file_name = kFlickHiraganaTableFile;
         break;
       case mozc::commands::Request::FLICK_TO_HALFWIDTHASCII:
         table_file_name = kFlickHalfwidthasciiTableFile;
         break;
-      case mozc::commands::Request::FLICK_TO_NUMBER:
-        table_file_name = kFlickNumberTableFile;
-        break;
       case mozc::commands::Request::TOGGLE_FLICK_TO_HIRAGANA:
         table_file_name = kToggleFlickHiraganaTableFile;
         break;
       case mozc::commands::Request::TOGGLE_FLICK_TO_HALFWIDTHASCII:
         table_file_name = kToggleFlickHalfwidthasciiTableFile;
         break;
-      case mozc::commands::Request::TOGGLE_FLICK_TO_NUMBER:
-        table_file_name = kToggleFlickNumberTableFile;
-        break;
       case mozc::commands::Request::QWERTY_MOBILE_TO_HIRAGANA:
         // This table is almost as same as "romaji-hiragana.tsv",
         // and the diff should be only the behavior of ','.
@@ -168,15 +155,18 @@
         // TODO(hidehiko): refactor this code to clean up.
         table_file_name = kQwertyMobileHiraganaTableFile;
         break;
-      case mozc::commands::Request::QWERTY_MOBILE_TO_HIRAGANA_NUMBER:
-        table_file_name = kQwertyMobileHiraganaNumberTableFile;
-        break;
       case mozc::commands::Request::QWERTY_MOBILE_TO_HALFWIDTHASCII:
         table_file_name = kQwertyMobileHalfwidthasciiTableFile;
         break;
       case mozc::commands::Request::GODAN_TO_HIRAGANA:
         table_file_name = kGodanHiraganaTableFile;
         break;
+      case mozc::commands::Request::NOTOUCH_TO_HIRAGANA:
+        table_file_name = kNotouchHiraganaTableFile;
+        break;
+      case mozc::commands::Request::NOTOUCH_TO_HALFWIDTHASCII:
+        table_file_name = kNotouchHalfwidthasciiTableFile;
+        break;
       default:
         table_file_name = NULL;
     }
diff --git a/src/composer/table_test.cc b/src/composer/table_test.cc
index 887b8a7..c81e753 100644
--- a/src/composer/table_test.cc
+++ b/src/composer/table_test.cc
@@ -839,6 +839,20 @@
     EXPECT_EQ("\xE3\x81\x8D", entry->pending());
   }
 
+  {
+    // To Notouch -> Hiragana mode.
+    request.set_special_romanji_table(
+        mozc::commands::Request::NOTOUCH_TO_HIRAGANA);
+    Table table;
+    table.InitializeWithRequestAndConfig(request, default_config_);
+
+    size_t key_length = 0;
+    bool fixed = false;
+    const mozc::composer::Entry *entry = table.LookUpPrefix("a", &key_length,
+                                                            &fixed);
+    // "き"
+    EXPECT_EQ("\xE3\x81\x8D", entry->pending());
+  }
 }
 
 TEST_F(TableTest, OrderOfAddRule) {
@@ -1047,17 +1061,15 @@
     commands::Request::DEFAULT_TABLE,
     commands::Request::TWELVE_KEYS_TO_HIRAGANA,
     commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII,
-    commands::Request::TWELVE_KEYS_TO_NUMBER,
     commands::Request::FLICK_TO_HIRAGANA,
     commands::Request::FLICK_TO_HALFWIDTHASCII,
-    commands::Request::FLICK_TO_NUMBER,
     commands::Request::TOGGLE_FLICK_TO_HIRAGANA,
     commands::Request::TOGGLE_FLICK_TO_HALFWIDTHASCII,
-    commands::Request::TOGGLE_FLICK_TO_NUMBER,
     commands::Request::GODAN_TO_HIRAGANA,
     commands::Request::QWERTY_MOBILE_TO_HIRAGANA,
-    commands::Request::QWERTY_MOBILE_TO_HIRAGANA_NUMBER,
     commands::Request::QWERTY_MOBILE_TO_HALFWIDTHASCII,
+    commands::Request::NOTOUCH_TO_HIRAGANA,
+    commands::Request::NOTOUCH_TO_HALFWIDTHASCII,
   };
   static const config::Config::PreeditMethod preedit_method[] = {
     config::Config::ROMAN,
diff --git a/src/data/images/android/svg/emoji_disable_icon.svg b/src/data/images/android/svg/emoji_disable_icon.svg
index 218582d..e7b9857 100644
--- a/src/data/images/android/svg/emoji_disable_icon.svg
+++ b/src/data/images/android/svg/emoji_disable_icon.svg
@@ -32,9 +32,7 @@
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<circle style="fill:none;stroke:#231F20;stroke-width:0.75;stroke-miterlimit:10;" cx="8" cy="8" r="7"/>
-<g>
-	<path style="fill:#231F20;" d=""/>
-</g>
+	width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
+<circle id="style-symbol-major-emoji-disable-circle" cx="8" cy="8" r="7"/>
+<path id="style-symbol-major" d="M8.864,9.947H7.153v-5.59h1.711V9.947z M8.864,12.889H7.153v-1.5h1.711V12.889z"/>
 </svg>
diff --git a/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg b/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg
new file mode 100644
index 0000000..8d0c9f2
--- /dev/null
+++ b/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="80"
+     height="80">
+  <g transform="matrix(1,0,0,-1,7,75)">
+    <path id="shadow" style="fill:#eceff1;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,8 0,49 c 0,4.4 3.6,8 8,8 l 17.5,0 6.5,7.88 c 0.53,0.6425 1.52,0.576 2.05,0 l 7.25,-7.88 16.7,0 c 4.4,0 8,-3.6 8,-8 l 0,-49 c 0,-4.4 -3.6,-8 -8,-8 l -50,0 c -4.4,0 -8,3.6 -8,8" />
+  </g>
+  <text y="45" x="40" style="font-size:40px;text-anchor:middle;dominant-baseline:central;">En</text>
+</svg>
diff --git a/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg b/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg
new file mode 100644
index 0000000..55ccf92
--- /dev/null
+++ b/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="80"
+     height="80">
+  <g transform="matrix(1,0,0,-1,7,75)">
+    <path id="shadow" style="fill:#eceff1;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,8 0,49 c 0,4.4 3.6,8 8,8 l 17.5,0 6.5,7.88 c 0.53,0.6425 1.52,0.576 2.05,0 l 7.25,-7.88 16.7,0 c 4.4,0 8,-3.6 8,-8 l 0,-49 c 0,-4.4 -3.6,-8 -8,-8 l -50,0 c -4.4,0 -8,3.6 -8,8" />
+  </g>
+  <text y="45" x="40" style="font-size:40px;text-anchor:middle;dominant-baseline:central;">あ</text>
+</svg>
diff --git a/src/data/images/android/svg/function__action_done__icon.svg b/src/data/images/android/svg/function__action_done__icon.svg
new file mode 100644
index 0000000..f6aea24
--- /dev/null
+++ b/src/data/images/android/svg/function__action_done__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="135"
+     height="135">
+  <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="M55.68375,82.7775,37.62125,64.715,32.0525,70.285,55.68375,93.91625,102.9475,46.6525,97.3775,41.08375,55.68375,82.7775z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_go__icon.svg b/src/data/images/android/svg/function__action_go__icon.svg
new file mode 100644
index 0000000..027cbf0
--- /dev/null
+++ b/src/data/images/android/svg/function__action_go__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="135"
+     height="135">
+  <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="m67.5,36.6475-5.45375,5.45375,21.5425,21.5425-46.94125,0,0,7.7125,46.94125,0-21.5425,21.5425l5.45375,5.45375,30.8525-30.8525-30.8525-30.8525z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_next__icon.svg b/src/data/images/android/svg/function__action_next__icon.svg
new file mode 100644
index 0000000..a374e6d
--- /dev/null
+++ b/src/data/images/android/svg/function__action_next__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="135"
+     height="135">
+  <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="m51.95625,86.909375,5.72625,5.70125,25.36125-25.47-24.86125-24.75125-5.70125,5.72625,19.11875,19.05125-19.64375,19.7425z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_previous__icon.svg b/src/data/images/android/svg/function__action_previous__icon.svg
new file mode 100644
index 0000000..33acd5f
--- /dev/null
+++ b/src/data/images/android/svg/function__action_previous__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="135"
+     height="135">
+  <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="m83.04375,86.909375-5.72625,5.70125-25.36125-25.47,24.86125-24.75125,5.70125,5.72625-19.11875,19.05125,19.64375,19.7425z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_search__icon.svg b/src/data/images/android/svg/function__action_search__icon.svg
new file mode 100644
index 0000000..855b3b7
--- /dev/null
+++ b/src/data/images/android/svg/function__action_search__icon.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!--
+Preprocesses for this file;
+- Imported .ai file into Inkscape.
+- Combine all pathes into one (Path > Combine).
+- Export as optimized .svg.
+- Removed following elements manually.
+  - metadata
+  - defs
+- Removed ignorable <g> elements.
+- Added id attribute.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xml:space="preserve"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="80"
+     height="80">
+  <circle id="style-keyicon-enter-circle" cx="40" cy="40" r="40" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="m50.471876,46.325293h-2.248993l-0.843373-0.70281c2.670676-3.232928,4.357426-7.309228,4.357426-11.947777,0-10.120469-8.152603-18.273069-18.273075-18.273069-9.979907,0-18.132506,8.1526-18.132506,18.273069,0,10.12047,8.152599,18.27307,18.273068,18.27307,4.497989,0,8.714853-1.686745,11.947779-4.357424l0.843373,0.702809v2.248993l14.05621,14.056208,4.21686-4.216862-14.196769-14.056207zm-16.867452,0c-7.028103,0-12.650586-5.622483-12.650586-12.650587,0-7.028103,5.622483-12.650586,12.650586-12.650586,7.028107,0,12.65059,5.622483,12.65059,12.650586,0,7.028104-5.622483,12.650587-12.65059,12.650587z"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_send__icon.svg b/src/data/images/android/svg/function__action_send__icon.svg
new file mode 100644
index 0000000..52e06ce
--- /dev/null
+++ b/src/data/images/android/svg/function__action_send__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="135"
+     height="135">
+  <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+  <path id="style-keyicon-enter" d="m29.19,33.131875,0,25.925,48.2325,8.03875-48.2325,8.04,0,26.732495,76.62-34.772495-76.62-33.96375z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__enter__icon.svg b/src/data/images/android/svg/function__enter__icon.svg
new file mode 100644
index 0000000..93efbf0
--- /dev/null
+++ b/src/data/images/android/svg/function__enter__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="80"
+     height="80">
+ <circle id="style-keyicon-enter-circle" cx="40" cy="40" r="40" style="fill-rule:evenodd;fill:#ff0000" />
+ <path id="style-keyicon-enter" d="m56.753534,37.678614-29.468464,0,8.848119-8.886375l-3.306676-3.292239-14.645086,14.707885,14.356356,14.292115,3.29224-3.305954-8.887097-8.848118h34.875647v-14.083508h-5.08525l0.02021,9.416194z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__symbol__popup.svg b/src/data/images/android/svg/function__symbol__popup.svg
new file mode 100644
index 0000000..ee0f346
--- /dev/null
+++ b/src/data/images/android/svg/function__symbol__popup.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="75"
+     height="75">
+  <!-- Original size: 75 x 75 -->
+  <g transform="matrix(0.85,0,0,0.85,5.625,5.625)">
+    <path id="style-keyicon-main" fill-rule="nonzero" fill="#000" d="m37.499999,58.301797c14.310182,0,18.988762-13.160478,18.988762-13.160478h-37.977527s4.678584,13.160478,18.988765,13.160478m13.636802-36.074056c-3.152905,0-5.708597,2.555692-5.708597,5.708598s2.555692,5.708598,5.708597,5.708598c3.15291,0,5.7086-2.555692,5.7086-5.708598s-2.55569-5.708598-5.7086-5.708598m-27.273605,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693506,30.268142-30.2693506,16.690572,0,30.268142,13.5787736,30.268142,30.2693506,0,16.689368-13.57757,30.268145-30.268142,30.268145m0-67.7681444c-20.677649,0-37.5,16.8223504-37.5,37.4999994,0,20.676435,16.822351,37.498795,37.5,37.498795,20.677652,0,37.500002-16.82236,37.500002-37.498795,0-20.677649-16.82235-37.4999994-37.500002-37.4999994"/>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/globe.svg b/src/data/images/android/svg/globe.svg
deleted file mode 100644
index 65d915e..0000000
--- a/src/data/images/android/svg/globe.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!--
-Preprocesses for this file;
-- Imported .ai file into Inkscape.
-- Combine all pathes into one (Path > Combine).
-- Export as optimized .svg.
-- Removed following elements manually.
-  - metadata
-  - defs
-- Removed ignorable <g> elements.
-- Added id attribute.
--->
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><g transform="matrix(1.25,0,0,-1.25,0,120)">
-<path id="" fill="#373535" d="m80.23,38.866c-2.052-7.486-6.629-13.924-12.779-18.332l-4.518,15.148-2.373,0.676-5.262-0.015-3.183,1.875,0.179,3.726,4.275,8.402-0.207,1.756,0.215,1.436,2.788,1.109-0.176,0.789-0.521,0.871-0.047,0.614,6.453,4.756v0.91l-2.298,1.763-0.23,0.864,4.885,6.629,1.862,0.798,1.022-0.066c1.215-1.092,2.372-2.244,3.415-3.5l-0.445-0.135,1.211-1.242,0.211,0.088c2.844-3.775,4.931-8.156,5.968-12.941l-0.064-0.245,0.18-0.363c0.4-2.029,0.636-4.129,0.656-6.279,0.019-3.03-0.397-5.955-1.129-8.748l-0.258-0.16,0.17-0.184zm-32.939,27.121-0.762,2.188,0.287,2.072,1.202,2.82-0.702,4.686-2.422,0.312-0.344,0.629,0.174,0.85,0.889,1.275,0.435,0.236c0.569,0.036,1.131,0.094,1.705,0.099,4.373,0.032,8.539-0.8,12.373-2.292l-2.208-5.924-9.425-8.15-1.202,1.199zm-12.431,0.932-0.438-0.276-1.391,0.006-0.207,0.217,1.138,1.43,0.308-0.075,0.309-0.445,0.281-0.857zm11.28-43.28-3.655-2.697-4.114-5.267c-2.38,0.716-4.631,1.709-6.752,2.908l-0.118,4.217-3.928,7.599,0.06,1.483,1.13,2.705-0.026,1.818-1.239,1.371-9.067,3.998-3.012,5.117-0.827,0.304-0.015-0.052c-0.002,0.112-0.016,0.217-0.016,0.323-0.068,8.88,3.36,16.955,8.964,22.986l1.031-0.574,5.701,1.172,0.672,0.394,0.151-0.312-0.405-0.762-0.076-0.334,3.962,5.519,0.286,0.108,0.259,0.002,0.228-0.096,0.206-0.199-2.492-4.641,0.956-0.902,1.348,0.926,0.299,4.162,1.706,0.537-0.815-1.336,2.526,1.432,0.879-0.203,0.088-0.42-1.608-0.288,3.038-2.585,1.178-2.026-1.527-1.678,0.244-0.283-1.112-1.762-0.27,0.017-0.57-0.304-2.619,1.647,2.63,2.148-0.392,0.871-2.502,1.582-0.806-2.269-5.43-4.211-1.777-2.67,1.507-1.717,2.443-1.125,1.03-0.924,2.135,5.467,0.828,0.793,3.662-1.765,0.42,0.058,3.009-7.273-0.903-0.34-1.119,0.055-0.363,0.484,0.504,0.355,0.283,0.371,0.062,0.387-0.164,0.408-4.589-1.302,1.805-1.334,1.014-0.129-6.981-3.889-3.164-4.603,0.022-2.422-1.17,0.277-0.552,1.586-3.774,0.703-1.512-0.842-1.273-1.728-0.25-0.936,0.141-1.14,0.727-0.78,2.024,0.975,0.646-0.078,2.468-4.16,8.118-0.276,3.457-1.31,2.808-3.678,4.79-1.422,1.673-1.238-2.134-6.983zm-30.815,20.774-0.674,1.506c-0.006,0.111-0.018,0.222-0.018,0.334l0.718-1.231-0.026-0.609zm9.274,27.035,0.981,0.682-0.18,0.179c1.025,0.946,2.104,1.84,3.243,2.651l0.162-0.059,1.618,0.315-0.047-1.809-1.87-2.014-2.397-1.105-1.629,0.933,0.119,0.227zm6.526,2.715,1.25,1.377,0.486-0.25-0.182-0.895-0.65-0.765-0.908,0.132,0.004,0.401zm3.577,4.238,0.145-0.211-0.405-0.492-0.737-0.316-0.678-0.043-0.131,0.179c0.598,0.301,1.19,0.618,1.806,0.883m1.431,0.313,0.697-0.137,2.414-1.373,0.58-0.088-0.967-0.928-1.563,0.211-1.221,0.971,0.06,1.344zm3.654,0.689,0.664,0.873c1.108,0.253,2.232,0.457,3.383,0.602l-3.6-2.356-1.858-0.07,1.411,0.951zm20.287-11.639-0.949-0.74-1.477,0.143-0.122,0.301,0.048,1.363,1.094-0.242,1.148,0.257,0.539-0.216-0.281-0.866zm0.287-8.162-0.088-1.047-1.518-0.351-0.638,1.616-0.013,3.153,2.257-3.371zm-12.357,25.475c-20.476,0-37.081-16.6-37.081-37.078,0-20.479,16.605-37.076,37.081-37.076,20.474,0,37.073,16.597,37.073,37.076,0,20.478-16.599,37.078-37.073,37.078" fill-rule="nonzero"/></g></svg>
diff --git a/src/data/images/android/svg/globe_keyicon.svg b/src/data/images/android/svg/globe_keyicon.svg
new file mode 100644
index 0000000..88a5351
--- /dev/null
+++ b/src/data/images/android/svg/globe_keyicon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 40 x 40 -->
+  <g transform="matrix(0.875,0,0,0.875,16.5,10.5)">
+    <path id="style-keyicon-twelvekeys-globe" d="M20,0c-11.1,0-20,9-20,20s8.9,20,20,20,20-9,20-20-9-20-20-20zm13.8,12h-5.9c-0.6-2.5-1.6-4.9-2.8-7.1,3.8,1.2,6.8,3.8,8.7,7.1zm-13.8-7.9c1.7,2.4,3,5.1,3.8,7.9h-7.6c0.8-2.9,2.1-5.5,3.8-7.9zm-15.5,19.9c-0.3-1.3-0.5-2.6-0.5-4s0.2-2.7,0.5-4h6.8c-0.2,1.3-0.3,2.6-0.3,4s0.1,2.7,0.3,4h-6.8zm1.7,4h5.9c0.6,2.5,1.6,4.9,2.8,7.1-3.8-1.2-6.8-3.8-8.7-7.1zm5.9-16h-5.9c1.9-3.3,5-5.9,8.7-7.1-1.3,2.2-2.2,4.6-2.8,7.1zm7.9,23.9c-1.7-2.4-3-5.1-3.8-7.9h7.6c-0.8,2.9-2.1,5.5-3.8,7.9zm4.7-11.9h-9.4c-0.2-1.3-0.3-2.6-0.3-4s0.1-2.7,0.3-4h9.4c0.2,1.3,0.3,2.6,0.3,4s-0.1,2.7-0.3,4zm0.5,11.1c1.2-2.2,2.1-4.6,2.8-7.1h5.9c-2,3.3-5,5.9-8.7,7.1zm3.5-11.1c0.2-1.3,0.3-2.6,0.3-4s-0.1-2.7-0.3-4h6.8c0.3,1.3,0.5,2.6,0.5,4s-0.2,2.7-0.5,4h-6.8z"/>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/globe_qwerty_function.svg b/src/data/images/android/svg/globe_qwerty_function.svg
new file mode 100644
index 0000000..2e21c31
--- /dev/null
+++ b/src/data/images/android/svg/globe_qwerty_function.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 40 x 40 -->
+  <g transform="matrix(0.875,0,0,0.875,16.5,10.5)">
+    <path id="style-keyicon-qwerty-function" d="M20,0c-11.1,0-20,9-20,20s8.9,20,20,20,20-9,20-20-9-20-20-20zm13.8,12h-5.9c-0.6-2.5-1.6-4.9-2.8-7.1,3.8,1.2,6.8,3.8,8.7,7.1zm-13.8-7.9c1.7,2.4,3,5.1,3.8,7.9h-7.6c0.8-2.9,2.1-5.5,3.8-7.9zm-15.5,19.9c-0.3-1.3-0.5-2.6-0.5-4s0.2-2.7,0.5-4h6.8c-0.2,1.3-0.3,2.6-0.3,4s0.1,2.7,0.3,4h-6.8zm1.7,4h5.9c0.6,2.5,1.6,4.9,2.8,7.1-3.8-1.2-6.8-3.8-8.7-7.1zm5.9-16h-5.9c1.9-3.3,5-5.9,8.7-7.1-1.3,2.2-2.2,4.6-2.8,7.1zm7.9,23.9c-1.7-2.4-3-5.1-3.8-7.9h7.6c-0.8,2.9-2.1,5.5-3.8,7.9zm4.7-11.9h-9.4c-0.2-1.3-0.3-2.6-0.3-4s0.1-2.7,0.3-4h9.4c0.2,1.3,0.3,2.6,0.3,4s-0.1,2.7-0.3,4zm0.5,11.1c1.2-2.2,2.1-4.6,2.8-7.1h5.9c-2,3.3-5,5.9-8.7,7.1zm3.5-11.1c0.2-1.3,0.3-2.6,0.3-4s-0.1-2.7-0.3-4h6.8c0.3,1.3,0.5,2.6,0.5,4s-0.2,2.7-0.5,4h-6.8z"/>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/godan__function__delete__icon.svg b/src/data/images/android/svg/godan__function__delete__icon.svg
deleted file mode 100644
index dd740c2..0000000
--- a/src/data/images/android/svg/godan__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" d="M58.03,23H34.234v0.066H34.2
-	L22,35.032L34.2,47l0.034-0.032V47h23.764L60,45.033V25.064L58.03,23z M49.431,37.666l-1.797,1.766l-2.702-2.667l-2.697,2.667
-	l-1.801-1.766l2.702-2.668l-2.702-2.666l1.801-1.766l2.697,2.665l2.702-2.665l1.797,1.798l-2.695,2.634L49.431,37.666z"/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__enter__icon.svg b/src/data/images/android/svg/godan__function__enter__icon.svg
deleted file mode 100644
index a8f2bba..0000000
--- a/src/data/images/android/svg/godan__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="140px"
-	 viewBox="0 0 82 140" style="enable-background:new 0 0 82 140;" xml:space="preserve">
-<polygon id="style-keyicon-function_2_" style="fill:#DDDDDC;" points="50.026,55.419 50.026,68.398 47.99,70.5 39.148,70.5 
-	39.148,64.595 37.647,64.595 24,74.471 24,74.872 37.846,84.581 39.148,84.581 39.148,78.542 56.031,78.542 58,76.44 58,55.419 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__kana__icon.svg b/src/data/images/android/svg/godan__function__kana__icon.svg
deleted file mode 100644
index bdbb3fe..0000000
--- a/src/data/images/android/svg/godan__function__kana__icon.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="140px"
-	 viewBox="0 0 82 140" style="enable-background:new 0 0 82 140;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDC;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__left_arrow__icon.svg b/src/data/images/android/svg/godan__function__left_arrow__icon.svg
deleted file mode 100644
index d972a4d..0000000
--- a/src/data/images/android/svg/godan__function__left_arrow__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" points="33.101,34.245 
-	47.731,24.762 49,25.931 49,44.035 47.798,45.238 33,35.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__right_arrow__icon.svg b/src/data/images/android/svg/godan__function__right_arrow__icon.svg
deleted file mode 100644
index 3b648d6..0000000
--- a/src/data/images/android/svg/godan__function__right_arrow__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" points="48.9,34.245 
-	34.269,24.762 33,25.931 33,44.035 34.202,45.238 49,35.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__space__icon.svg b/src/data/images/android/svg/godan__function__space__icon.svg
deleted file mode 100644
index f328d7a..0000000
--- a/src/data/images/android/svg/godan__function__space__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_4_" style="fill:#DDDDDC;" points="52.633,35 52.633,42.266 29.366,42.266 29.366,35 24.5,35 
-	24.5,47.002 57.5,47.002 57.5,35 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__symbol__icon.svg b/src/data/images/android/svg/godan__function__symbol__icon.svg
deleted file mode 100644
index 3b83ae8..0000000
--- a/src/data/images/android/svg/godan__function__symbol__icon.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
-	<circle style="fill:#DDDDDC;" cx="35.54" cy="21.736" r="2.21"/>
-	<circle style="fill:#DDDDDC;" cx="46.31" cy="21.736" r="2.21"/>
-	<path style="fill:#DDDDDC;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" d=""/>
-	</g>
-</g>
-<g id="style-keyicon-function_2_">
-	<path style="fill:#DDDDDC;" d=""/>
-	<path style="fill:#DDDDDC;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__undo__icon.svg b/src/data/images/android/svg/godan__function__undo__icon.svg
deleted file mode 100644
index 406b081..0000000
--- a/src/data/images/android/svg/godan__function__undo__icon.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
-	 viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_3_" style="fill:#DDDDDC;" points="52.661,34.086 52.661,27.813 50.827,25.912 34.844,25.912 
-	34.844,30.35 33.542,31.251 24,24.143 24,22.875 33.676,16.869 34.844,17.803 34.844,21.407 56.232,21.407 58,23.309 58,34.086 "/>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDC;" d=""/>
-	<path style="fill:#DDDDDC;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__14.svg b/src/data/images/android/svg/godan__kana__14.svg
index 0faa64d..9382212 100644
--- a/src/data/images/android/svg/godan__kana__14.svg
+++ b/src/data/images/android/svg/godan__kana__14.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,27 +30,22 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_14"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
+<svg version="1.1" id="godan_kana_14" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,14.998 27.499,14.998 27.499,31.998 44.499,31.998 44.499,23.498 "/>
+<g id="style-keyicon-main_1_">
+  <text x="32.5" y="30" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,15 60,15 60,32 77,32 77,23.5 "/>
+<g id="style-keyicon-main_2_">
+  <text x="62.5" y="30" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
+</g>
+<g id="style-keyicon-main_3_">
+  <text x="35" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
+</g>
+<g id="style-keyicon-main_4_">
+  <text x="52.5" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
 <g id="style-keyicon-main_5_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,14.998 
-	27.499,14.998 27.499,31.998 44.499,31.998 44.499,23.498 "/>
-<polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65.5,15 60.5,15 60.5,32 
-	77.5,32 77.5,23.5 "/>
-<g id="style-keyicon-main_7_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path style="fill:#272727;" d=""/>
+  <text x="70" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
 </g>
 </svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_center.svg b/src/data/images/android/svg/godan__kana__support__01_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_down.svg b/src/data/images/android/svg/godan__kana__support__01_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_release.svg b/src/data/images/android/svg/godan__kana__support__01_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_center.svg b/src/data/images/android/svg/godan__kana__support__02_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_down.svg b/src/data/images/android/svg/godan__kana__support__02_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_release.svg b/src/data/images/android/svg/godan__kana__support__02_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_right.svg b/src/data/images/android/svg/godan__kana__support__02_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_up.svg b/src/data/images/android/svg/godan__kana__support__02_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_center.svg b/src/data/images/android/svg/godan__kana__support__03_center.svg
deleted file mode 100644
index e5ce1d9..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_down.svg b/src/data/images/android/svg/godan__kana__support__03_down.svg
deleted file mode 100644
index 3c88879..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_left.svg b/src/data/images/android/svg/godan__kana__support__03_left.svg
deleted file mode 100644
index a6fc784..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_release.svg b/src/data/images/android/svg/godan__kana__support__03_release.svg
deleted file mode 100644
index 3aad1d7..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_right.svg b/src/data/images/android/svg/godan__kana__support__03_right.svg
deleted file mode 100644
index d75e485..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_up.svg b/src/data/images/android/svg/godan__kana__support__03_up.svg
deleted file mode 100644
index 423e30c..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_center.svg b/src/data/images/android/svg/godan__kana__support__04_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_down.svg b/src/data/images/android/svg/godan__kana__support__04_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_release.svg b/src/data/images/android/svg/godan__kana__support__04_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_center.svg b/src/data/images/android/svg/godan__kana__support__05_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_down.svg b/src/data/images/android/svg/godan__kana__support__05_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_release.svg b/src/data/images/android/svg/godan__kana__support__05_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_right.svg b/src/data/images/android/svg/godan__kana__support__05_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_up.svg b/src/data/images/android/svg/godan__kana__support__05_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_center.svg b/src/data/images/android/svg/godan__kana__support__06_center.svg
deleted file mode 100644
index 6bea628..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_center"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_down.svg b/src/data/images/android/svg/godan__kana__support__06_down.svg
deleted file mode 100644
index a3ab49e..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_down"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_release.svg b/src/data/images/android/svg/godan__kana__support__06_release.svg
deleted file mode 100644
index a2aebb2..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_release"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_right.svg b/src/data/images/android/svg/godan__kana__support__06_right.svg
deleted file mode 100644
index 07c6f44..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_right.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_right"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_up.svg b/src/data/images/android/svg/godan__kana__support__06_up.svg
deleted file mode 100644
index 3fb298e..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_up"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_3_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_center.svg b/src/data/images/android/svg/godan__kana__support__07_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_down.svg b/src/data/images/android/svg/godan__kana__support__07_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_release.svg b/src/data/images/android/svg/godan__kana__support__07_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_center.svg b/src/data/images/android/svg/godan__kana__support__08_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_down.svg b/src/data/images/android/svg/godan__kana__support__08_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_release.svg b/src/data/images/android/svg/godan__kana__support__08_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_right.svg b/src/data/images/android/svg/godan__kana__support__08_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_up.svg b/src/data/images/android/svg/godan__kana__support__08_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_center.svg b/src/data/images/android/svg/godan__kana__support__09_center.svg
deleted file mode 100644
index 5d28725..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_down.svg b/src/data/images/android/svg/godan__kana__support__09_down.svg
deleted file mode 100644
index 05207fa..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_release.svg b/src/data/images/android/svg/godan__kana__support__09_release.svg
deleted file mode 100644
index 2cbdd7f..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_up.svg b/src/data/images/android/svg/godan__kana__support__09_up.svg
deleted file mode 100644
index 40a812f..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__10_center.svg b/src/data/images/android/svg/godan__kana__support__10_center.svg
deleted file mode 100644
index 5a6c66f..0000000
--- a/src/data/images/android/svg/godan__kana__support__10_center.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__10_release.svg b/src/data/images/android/svg/godan__kana__support__10_release.svg
deleted file mode 100644
index 35f567d..0000000
--- a/src/data/images/android/svg/godan__kana__support__10_release.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_center.svg b/src/data/images/android/svg/godan__kana__support__11_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_down.svg b/src/data/images/android/svg/godan__kana__support__11_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_release.svg b/src/data/images/android/svg/godan__kana__support__11_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-	<path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_center.svg b/src/data/images/android/svg/godan__kana__support__12_center.svg
deleted file mode 100644
index 765ab3c..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_center.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_center"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_5_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667 
-	61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5 
-	29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_down.svg b/src/data/images/android/svg/godan__kana__support__12_down.svg
deleted file mode 100644
index 4e5764b..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_down.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_down"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_11_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5 
-	29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_left.svg b/src/data/images/android/svg/godan__kana__support__12_left.svg
deleted file mode 100644
index 8596113..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_left.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_left"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_6_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667 
-	61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_release.svg b/src/data/images/android/svg/godan__kana__support__12_release.svg
deleted file mode 100644
index 2fd1ee7..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_release.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_release"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667 
-	61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5 
-	29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_right.svg b/src/data/images/android/svg/godan__kana__support__12_right.svg
deleted file mode 100644
index c05bc59..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_right.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_right"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_10_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667 
-	61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_9_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5 
-	29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_up.svg b/src/data/images/android/svg/godan__kana__support__12_up.svg
deleted file mode 100644
index 459903b..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_up.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_up"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
-	 viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_8_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667 
-	61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_7_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5 
-	29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__13_center.svg b/src/data/images/android/svg/godan__kana__support__13_center.svg
deleted file mode 100644
index 5a6c66f..0000000
--- a/src/data/images/android/svg/godan__kana__support__13_center.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__13_release.svg b/src/data/images/android/svg/godan__kana__support__13_release.svg
deleted file mode 100644
index 35f567d..0000000
--- a/src/data/images/android/svg/godan__kana__support__13_release.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_center.svg b/src/data/images/android/svg/godan__kana__support__15_center.svg
deleted file mode 100644
index 0e5657e..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_release.svg b/src/data/images/android/svg/godan__kana__support__15_release.svg
deleted file mode 100644
index 7f57371..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_up.svg b/src/data/images/android/svg/godan__kana__support__15_up.svg
deleted file mode 100644
index 3cb4c66..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_up.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__01.svg b/src/data/images/android/svg/godan__kana__support__popup__01.svg
deleted file mode 100644
index 9de6789..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__01.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_01"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__02.svg b/src/data/images/android/svg/godan__kana__support__popup__02.svg
deleted file mode 100644
index 3a423e1..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__02.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_02"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_1_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__03.svg b/src/data/images/android/svg/godan__kana__support__popup__03.svg
deleted file mode 100644
index 0f6523d..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__03.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_03"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_2_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__04.svg b/src/data/images/android/svg/godan__kana__support__popup__04.svg
deleted file mode 100644
index b0cdd25..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__04.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_04"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_3_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__05.svg b/src/data/images/android/svg/godan__kana__support__popup__05.svg
deleted file mode 100644
index cc38b5f..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__05.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_05"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_4_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__06.svg b/src/data/images/android/svg/godan__kana__support__popup__06.svg
deleted file mode 100644
index 51ff735..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__06.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_06"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__07.svg b/src/data/images/android/svg/godan__kana__support__popup__07.svg
deleted file mode 100644
index fb644d6..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__07.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_07"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__08.svg b/src/data/images/android/svg/godan__kana__support__popup__08.svg
deleted file mode 100644
index 5475fc0..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__08.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_08"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_7_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__09.svg b/src/data/images/android/svg/godan__kana__support__popup__09.svg
deleted file mode 100644
index 784d3ad..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__09.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_09_1_"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_8_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__10.svg b/src/data/images/android/svg/godan__kana__support__popup__10.svg
deleted file mode 100644
index ca38d66..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__10.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_10"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_9_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__11.svg b/src/data/images/android/svg/godan__kana__support__popup__11.svg
deleted file mode 100644
index b7a499f..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__11.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_11"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_10_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__12.svg b/src/data/images/android/svg/godan__kana__support__popup__12.svg
deleted file mode 100644
index 8e13053..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__12.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_12"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_11_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__13.svg b/src/data/images/android/svg/godan__kana__support__popup__13.svg
deleted file mode 100644
index 41326f4..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__13.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_13"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_12_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__15.svg b/src/data/images/android/svg/godan__kana__support__popup__15.svg
deleted file mode 100644
index b9e5fac..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__15.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_15"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_13_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/hardware__function__close.svg b/src/data/images/android/svg/hardware__function__close.svg
index fd13730..9262ef0 100644
--- a/src/data/images/android/svg/hardware__function__close.svg
+++ b/src/data/images/android/svg/hardware__function__close.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,29 +30,15 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="hardware_x5F__x5F_function_x5F__x5F_close"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" height="40px"
-	 viewBox="0 0 64 40" style="enable-background:new 0 0 64 40;" xml:space="preserve">
-<path id="" style="fill:#DDDDDC;" d="M50,32.147H14c-0.276,0-0.5-0.223-0.5-0.5V8.353
-	c0-0.276,0.224-0.5,0.5-0.5h36c0.276,0,0.5,0.224,0.5,0.5v23.295C50.5,31.925,50.276,32.147,50,32.147z M14.5,31.147h35V8.853h-35
-	V31.147z"/>
-<g id="style-keyicon-function">
-	<g>
-		<g>
-			<rect x="19.753" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.658"/>
-			<rect x="19.753" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.66"/>
-			<rect x="19.753" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.66"/>
-			<rect x="32.708" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.658"/>
-			<rect x="32.708" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.66"/>
-			<rect x="32.708" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.66"/>
-			<rect x="26.247" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.658"/>
-			<rect x="26.247" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.66"/>
-			<rect x="26.247" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.66"/>
-			<rect x="39.201" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.658"/>
-			<rect x="39.201" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.66"/>
-			<rect x="39.201" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.66"/>
-		</g>
-	</g>
-</g>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68px"
+     height="56px">
+  <!-- Original size: 64 x 40 -->
+  <g transform="matrix(1.4,0,0,1.4,-10.8,0)">
+    <path id="style-keyicon-twelvekeys-function" d="m44.95005,16.300191-3.699804,0,0-3.699805,3.699804,0,0,3.699805zm0,5.549951-3.699804,0,0-3.699804,3.699804,0,0,3.699804zm-5.549951-5.549951-3.699804,0,0-3.699805,3.699804,0,0,3.699805zm0,5.549951-3.699804,0,0-3.699804,3.699804,0,0,3.699804zm0,7.400098-14.800195,0,0-3.699805,14.800195,0,0,3.699805zm-16.649853-12.950049-3.699805,0,0-3.699805,3.699805,0,0,3.699805zm0,5.549951-3.699805,0,0-3.699804,3.699805,0,0,3.699804zm1.849658-3.700293,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm0-5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm5.549951,5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm0-5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm16.650342-5.5499514-29.600391,0c-2.043176,0-3.680746,1.6566289-3.680746,3.6998044l-0.01906,18.500489c0,2.043175,1.656629,3.699804,3.699805,3.699804h29.600391c2.043175,0,3.699804-1.656629,3.699804-3.699804v-18.500489c0-2.0431755-1.656629-3.6998044-3.699804-3.6998044" fill-rule="nonzero" style="fill:#37474f"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_background_default.svg b/src/data/images/android/svg/keyboard_fold_tab_background_default.svg
new file mode 100644
index 0000000..db12913
--- /dev/null
+++ b/src/data/images/android/svg/keyboard_fold_tab_background_default.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-keyboard-folding-button-background-default" opacity="0.55" fill="#676767" d="M0,29.11464c0-16.01304,13.101495-29.11464,29.114433-29.11464h61.771127c16.01295,0,29.11444,13.1016,29.11444,29.11464v61.77096c0,16.01304-13.10149,29.1144-29.11444,29.1144h-61.771127c-16.012938,0-29.114433-13.10136-29.114433-29.1144v-61.77096z"/>
+</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg b/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg
new file mode 100644
index 0000000..cb59962
--- /dev/null
+++ b/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-keyboard-folding-button-background-scrolled" opacity="0.55" fill="#676767" d="M0,29.11464c0-16.01304,13.101495-29.11464,29.114433-29.11464h61.771127c16.01295,0,29.11444,13.1016,29.11444,29.11464v61.77096c0,16.01304-13.10149,29.1144-29.11444,29.1144h-61.771127c-16.012938,0-29.114433-13.10136-29.114433-29.1144v-61.77096z"/>
+</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_down.svg b/src/data/images/android/svg/keyboard_fold_tab_down.svg
index d5a34ec..4680d55 100644
--- a/src/data/images/android/svg/keyboard_fold_tab_down.svg
+++ b/src/data/images/android/svg/keyboard_fold_tab_down.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,13 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<g id="style-keyboard-folding-button-background" style="opacity:0.55;">
-	<path style="fill:#676767;" d=""/>
-</g>
-<polygon style="fill:#FFFFFF;" points="8.007,11.904 11.968,7.941 10.862,6.835 8.79,8.907 8.79,4.096 7.226,4.096 7.226,8.923 
-	5.138,6.836 4.03,7.941 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="M59.650003,78.890867,90.138331,48.400866,82.848332,41.109133,59.375002,64.582467,36.388335,41.595799,29.861669,48.1242"/>
 </svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_up.svg b/src/data/images/android/svg/keyboard_fold_tab_up.svg
index 15b4187..6dff134 100644
--- a/src/data/images/android/svg/keyboard_fold_tab_up.svg
+++ b/src/data/images/android/svg/keyboard_fold_tab_up.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,13 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<g id="style-keyboard-folding-button-background" style="opacity:0.55;">
-	<path style="fill:#676767;" d=""/>
-</g>
-<polygon style="fill:#FFFFFF;" points="7.993,4.096 4.032,8.059 5.138,9.165 7.21,7.093 7.21,11.905 8.774,11.905 8.774,7.077 
-	10.862,9.164 11.97,8.059 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m59.650003,41.109133,30.488328,30.49-7.289999,7.291734l-23.47333-23.473333-22.986667,22.986666-6.526666-6.528401"/>
 </svg>
diff --git a/src/data/images/android/svg/magnifier.svg b/src/data/images/android/svg/magnifier.svg
deleted file mode 100644
index 4052d81..0000000
--- a/src/data/images/android/svg/magnifier.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!--
-Preprocesses for this file;
-- Imported .ai file into Inkscape.
-- Combine all pathes into one (Path > Combine).
-- Export as optimized .svg.
-- Removed following elements manually.
-  - metadata
-  - defs
-- Removed ignorable <g> elements.
-- Added id attribute.
--->
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="123.94037" width="126.05875" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><g transform="matrix(1.25,0,0,-1.25,0,123.94037)"><g transform="translate(29.0244,46.3398)"><path id="" fill-rule="nonzero" fill="#373535" d="m0,0c-7.104,7.109-7.104,18.632,0,25.736,7.109,7.109,18.623,7.103,25.734,0,7.105-7.104,7.105-18.623,0-25.736-7.111-7.104-18.63-7.104-25.734,0m53.585-18.533-12.165,12.168c-1.07,1.068-3.008,0.967-4.95-0.045l-5.308,5.305c6.914,9.032,6.262,22.001-2.002,30.267-8.999,8.995-23.588,8.995-32.588,0-8.994-9-8.994-23.589,0-32.588,8.269-8.263,21.237-8.916,30.271-2l5.305-5.304c-1.011-1.946-1.115-3.881-0.046-4.952l12.166-12.168c1.537-1.535,4.875-0.691,7.44,1.883,2.571,2.569,3.416,5.899,1.877,7.434"/></g></g></svg>
diff --git a/src/data/images/android/svg/microphone.svg b/src/data/images/android/svg/microphone.svg
new file mode 100644
index 0000000..96fdbfe
--- /dev/null
+++ b/src/data/images/android/svg/microphone.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3631" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" style="fill:#000" d="m71.178551,46.471336c0,12.211625-9.498462,22.535729-21.214942,22.535729-11.710514,0-21.140968-10.324104-21.140968-22.535729h-8.472375c0,15.285113,11.214174,29.288813,25.364628,31.269399l0.04057,13.908249h8.467602l0.03699-13.876035c14.163572-1.979393,25.389678-16.0165,25.389678-31.301613h-8.471183zm-21.177954,14.119431c6.601556,0,12.70558-5.831991,12.70558-12.705579v-26.827399c0-6.878361-6.104024-12.7067731-12.70558-12.7067731-6.60275,0-12.706773,5.8284121-12.706773,12.7067731v26.827399c0,6.873588,6.104023,12.705579,12.706773,12.705579"/>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__caps_on.svg b/src/data/images/android/svg/qwerty__caps_on.svg
index 75faf0c..b51d2b2 100644
--- a/src/data/images/android/svg/qwerty__caps_on.svg
+++ b/src/data/images/android/svg/qwerty__caps_on.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,17 +29,20 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_caps_x5F_on"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-qwerty-caps-on-arrow" style="fill:#C1F300;" points="38.032,58 38.032,49.299 42.5,49.299 42.5,48.2 
-	34.065,38 33.766,38 25.5,48.334 25.767,49.299 29.966,49.299 29.966,58 "/>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,1.0114943,29.865734,38.1287) -->
+  <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+    <path id="style-keyicon-qwerty-shift-on-arrow_0" d="m0,0,0-18.25,30.25,0,0,18.25,21.125-0.062-36.5,36.187l-35.562-36.063,20.687-0.062z" fill-rule="nonzero" style="fill:#000"/>
+  </g>
+  <!-- Original size: 90 x 90 -->
+  <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+    <path id="style-keyicon-qwerty-shift-on-arrow_1" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:#000; stroke:#000;"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
index cb252ae..abcfc42 100644
--- a/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,19 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 68 x 56 -->
+  <g transform="matrix(0.78,0,0,0.78,7.98,2.70)">
+    <path id="style-keyicon-function-dark" opacity="0.5" d="m16.555652,31.63854c-1.310925,0-2.715213,0.189612-4.2119,0.561137v3.650763l-0.420613,4.632512c1.870138-2.246475,3.41495-5.194612,4.632513-8.844412m-6.7384625,10.809837c-0.28105-1.590049-0.421575-3.881762-0.421575-6.878987v-2.387c-3.93085,1.965425-5.896275,4.49295-5.896275,7.581612,0,0.842188,0.3031875,1.614113,0.91245,2.315775,0.6073375,0.702626,1.2397,1.052975,1.8951625,1.052975,1.0289125,0,2.19835-0.561137,3.5102375-1.684375m5.7557495,6.0368c-0.28105-1.030837-0.656425-2.05975-1.123237-3.088662,7.392962-0.466813,11.090887-2.807612,11.090887-7.019512,0-3.180101-2.01355-5.286051-6.0368-6.316888-1.779662,5.148413-3.93085,8.938737-6.457412,11.370975-2.527525,2.435125-4.868325,3.6498-7.0195125,3.6498-1.4986125,0-2.785475-0.5852-3.8605875-1.754638-1.078-1.168475-1.615075-2.643025-1.615075-4.421725,0-4.865437,2.9481375-8.469037,8.8444125-10.809837,0-1.685338,0.0462-3.275388,0.140525-4.774h-7.58065v-3.0877c1.1232375,0.18865,2.6670875,0.280087,4.6325125,0.280087,0.9345875,0,2.011625-0.04524,3.2291875-0.140525,0-0.652575,0.140525-2.010662,0.4206125-4.070412l3.088662,0.139562-0.420612,3.791288,13.195875-0.28105,0.140525,2.948137-13.61745,0.420613c-0.09433,0.84315-0.140525,2.10595-0.140525,3.791287,1.309-0.28105,2.527525-0.421575,3.6498-0.421575,0.186725,0,0.607337,0.04909,1.263762,0.140525,0.0924-0.372487,0.186725-0.934587,0.28105-1.684375l3.088663,0.701663c0,0.18865-0.140525,0.656425-0.421575,1.403325,5.708587,1.404287,8.563363,4.49295,8.563363,9.265987,0,2.621851-0.982713,4.751863-2.948138,6.388113s-5.4285,2.82975-10.388263,3.579537" fill-rule="nonzero" fill="#000"/>
+  </g>
+  <g transform="matrix(0.76,0,0,0.76,7.66,6.72)">
+    <path id="style-keyicon-qwerty-function" opacity="0.80000299" d="m48.39496,43.654486c3.3418,0,5.607525-0.836413,8.053237-2.422613,2.445713-1.5862,3.682525-3.721025,4.55455-6.214862l0.0087-6.451638-9.010925-0.01829c-3.536225,0-5.826975,0.34265-8.12735,2.0251-2.301338,1.683412-3.239775,3.52275-3.239775,5.895312,0,2.229151,0.615037,3.805725,2.080925,5.160925,1.464925,1.356163,3.113688,2.026063,5.680675,2.026063m13.893687,3.716212c-0.282012-1.232962-0.537075-1.981787-0.7392-2.963537-0.205012-0.999075-0.290675-1.807575-0.290675-2.849-1.356162,2.131937-2.727725,3.094437-5.173437,4.486212-2.446675,1.392738-5.25525,2.088625-8.42765,2.088625-3.85,0-6.834713-1.022175-8.954138-3.069412-2.118462-2.045313-3.178175-4.82405-3.178175-8.33525s1.537113-6.594088,4.613263-8.77415c3.075187-2.1791,7.070525-3.26865,11.986975-3.26865h8.904087l-0.02695-4.443863c0-2.808575-0.668937-4.671012-2.4486-6.269725-1.780625-1.59775-3.456337-2.233-6.4218-2.253212-2.673825-0.01829-4.860625,0.389812-6.689375,1.843187-1.82875,1.452413-3.003962,3.119463-3.003962,5.322625l-4.803838,0.02021,0.0058-0.2387c-0.145399-2.953907,1.001901-5.550732,3.678613-7.791432,2.674788-2.239737,6.397738-3.360087,10.708775-3.360087,4.310075,0,7.77315,1.1020625,10.388263,3.305225,2.616075,2.204125,3.720062,5.160925,3.720062,9.277537l-0.0058,19.32315c0,1.380226,0.287788,2.755638,0.445638,4.063675,0.156888,1.307075,0.509162,2.603563,0.872025,3.886575h-5.159963z" fill-rule="nonzero" fill="#000"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__alphabet__popup.svg
deleted file mode 100644
index 92ab3bb..0000000
--- a/src/data/images/android/svg/qwerty__function__alphabet__popup.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg b/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg
new file mode 100644
index 0000000..8d320aa
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="68"
+     height="56">
+  <text id="style-keyicon-qwerty-function" x="13" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">?</text>
+  <text id="style-keyicon-qwerty-function" x="26.8" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">1</text>
+  <text id="style-keyicon-qwerty-function" x="39.3" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">2</text>
+  <text id="style-keyicon-qwerty-function" x="54.5" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">3</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__base_icon.svg b/src/data/images/android/svg/qwerty__function__alt__base_icon.svg
new file mode 100644
index 0000000..77798a0
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__alt__base_icon.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="68px"
+     height="56px">
+  <text id="style-keyicon-qwerty-function" x="34" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">= \ &lt;</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__icon.svg b/src/data/images/android/svg/qwerty__function__alt__icon.svg
deleted file mode 100644
index 3d385ad..0000000
--- a/src/data/images/android/svg/qwerty__function__alt__icon.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alt_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__comma.svg b/src/data/images/android/svg/qwerty__function__comma.svg
index 95f2fe3..8e0877a 100644
--- a/src/data/images/android/svg/qwerty__function__comma.svg
+++ b/src/data/images/android/svg/qwerty__function__comma.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
-	 x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="shadow_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">,</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__commercial_at.svg b/src/data/images/android/svg/qwerty__function__commercial_at.svg
index 586c8f7..56de7ca 100644
--- a/src/data/images/android/svg/qwerty__function__commercial_at.svg
+++ b/src/data/images/android/svg/qwerty__function__commercial_at.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="30" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">@</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__cursor__icon.svg b/src/data/images/android/svg/qwerty__function__cursor__icon.svg
deleted file mode 100644
index e290393..0000000
--- a/src/data/images/android/svg/qwerty__function__cursor__icon.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_cursor_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_17_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.881,35.445 
-	39.029,29.5 38.236,30.226 38.236,41.6 38.961,42.358 47.947,36.343 "/>
-<polygon id="style-keyicon-function_16_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="20.087,35.516 
-	28.937,29.5 29.732,30.226 29.732,41.737 29.006,42.5 20.052,36.414 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__delete__icon.svg b/src/data/images/android/svg/qwerty__function__delete__icon.svg
deleted file mode 100644
index eaf8822..0000000
--- a/src/data/images/android/svg/qwerty__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M42.434,38.667l-1.797,1.766
-	l-2.702-2.666l-2.7,2.666l-1.801-1.766l2.7-2.667l-2.7-2.667l1.801-1.766l2.7,2.666l2.702-2.666l1.797,1.8L39.735,36L42.434,38.667z
-	 M27.233,24v0.066h-0.034L15,36.033L27.199,48l0.034-0.032V48h23.769L53,46.034V26.067L51.034,24H27.233z"/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__delete__popup.svg b/src/data/images/android/svg/qwerty__function__delete__popup.svg
deleted file mode 100644
index 8c596f0..0000000
--- a/src/data/images/android/svg/qwerty__function__delete__popup.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M42.434,38.667
-	l-1.797,1.766l-2.702-2.666l-2.7,2.666l-1.801-1.766l2.7-2.667l-2.7-2.667l1.801-1.766l2.7,2.666l2.702-2.666l1.797,1.8L39.735,36
-	L42.434,38.667z M27.233,24v0.066h-0.034L15,36.033L27.199,48l0.034-0.032V48h23.769L53,46.034V26.067L51.034,24H27.233z"/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__enter__icon.svg b/src/data/images/android/svg/qwerty__function__enter__icon.svg
deleted file mode 100644
index 46a54d2..0000000
--- a/src/data/images/android/svg/qwerty__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_12_" style="fill:#DDDDDD;" points="43.026,21.421 43.026,34.398 40.99,36.501 32.147,36.501 
-	32.147,30.596 30.647,30.596 17,40.472 17,40.871 30.848,50.579 32.147,50.579 32.147,44.541 49.028,44.541 51,42.439 51,21.421 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__enter__popup.svg b/src/data/images/android/svg/qwerty__function__enter__popup.svg
deleted file mode 100644
index 5e7c63f..0000000
--- a/src/data/images/android/svg/qwerty__function__enter__popup.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_9_" style="fill:#DDDDDD;" points="43.026,21.421 43.026,34.398 40.99,36.502 
-	32.147,36.502 32.147,30.596 30.647,30.596 17,40.472 17,40.871 30.848,50.579 32.147,50.579 32.147,44.541 49.028,44.541 
-	51,42.439 51,21.421 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__exclamation_mark.svg b/src/data/images/android/svg/qwerty__function__exclamation_mark.svg
new file mode 100644
index 0000000..5542765
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__exclamation_mark.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">!</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__full_stop.svg b/src/data/images/android/svg/qwerty__function__full_stop.svg
index 95f2fe3..5666f7a 100644
--- a/src/data/images/android/svg/qwerty__function__full_stop.svg
+++ b/src/data/images/android/svg/qwerty__function__full_stop.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
-	 x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="shadow_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">.</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__ideographic_comma.svg b/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
index d2e1c06..b290f58 100644
--- a/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
+++ b/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="39" y="36" style="font-size:45px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">、</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg b/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
index d2e1c06..e9a7afe 100644
--- a/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
+++ b/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="39" y="36" style="font-size:45px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">。</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__kana__icon.svg b/src/data/images/android/svg/qwerty__function__kana__icon.svg
index 9e4fd2c..b6668bc 100644
--- a/src/data/images/android/svg/qwerty__function__kana__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__kana__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,17 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 68 x 56 -->
+  <g transform="matrix(0.78,0,0,0.78,7.48,6.16)">
+    <path id="style-keyicon-qwerty-function" opacity="0.80000299" d="m22.730855,25.555342c-1.826825,0-3.782625,0.262762-5.866438,0.782512v5.083925l-0.587125,6.453563c2.60645-3.129088,4.757638-7.235113,6.453563-12.32m-9.3863,15.05735c-0.391738-2.214713-0.587125-5.407325-0.587125-9.581687v-3.324476c-5.4756625,2.737351-8.2130125,6.257213-8.2130125,10.559588,0,1.173287,0.421575,2.249362,1.2714625,3.227263,0.8460375,0.9779,1.7257625,1.465887,2.639175,1.465887,1.4331625,0,3.061713-0.78155,4.8895-2.346575m8.017625,8.409362c-0.391738-1.436049-0.913412-2.869212-1.565025-4.302375,10.297788-0.65065,15.449087-3.910637,15.449087-9.778037,0-4.429425-2.804724-7.363125-8.4084-8.799175-2.478437,7.170625-5.475662,12.4509-8.995525,15.839862-3.519862,3.39185-6.780812,5.083925-9.778037,5.083925-2.0867,0-3.8808-0.815237-5.3774875-2.44475-1.5005375-1.62855-2.2493625-3.681562-2.2493625-6.159999,0-6.776001,4.1069875-11.797363,12.32-15.057351,0-2.346575,0.06449-4.56225,0.195387-6.64895h-10.559587v-4.302374c1.5640625,0.263725,3.71525,0.391737,6.4535625,0.391737,1.3012995,0,2.8018375-0.06449,4.4977625-0.195387,0-0.910525,0.195387-2.8028005,0.586162-5.6710505l4.302375,0.1953875-0.587125,5.279313,18.382788-0.390776,0.195387,4.106988-18.96895,0.586162c-0.1309,1.173288-0.195387,2.9337-0.195387,5.280275,1.823937-0.390775,3.519862-0.587125,5.083925-0.587125,0.260837,0,0.847,0.06834,1.760412,0.19635,0.128013-0.51975,0.259875-1.3013,0.390775-2.347537l4.302375,0.9779c0,0.263725-0.195387,0.913412-0.586162,1.9558,7.95025,1.9558,11.928262,6.258175,11.928262,12.907125,0,3.650762-1.368675,6.61815-4.106025,8.89735-2.738312,2.280163-7.562362,3.9424-14.471187,4.986712" fill-rule="nonzero" fill="#000"/>
+    <path id="style-keyicon-function-dark" opacity="0.5" d="m54.6385,41.755662c2.266688,0,3.802838-0.567875,5.462188-1.642988,1.65935-1.076075,2.497687-2.523675,3.088662-4.21575l0.0068-4.375525-6.111875-0.01251c-2.39855,0-3.952987,0.232925-5.512237,1.37445-1.561175,1.141526-2.197388,2.388926-2.197388,3.998226,0,1.511125,0.416763,2.580462,1.411025,3.49965,0.9933,0.92015,2.111725,1.37445,3.852888,1.37445m9.423799,2.520787c-0.191538-0.836412-0.364788-1.344612-0.501463-2.0097-0.139562-0.678562-0.197312-1.226225-0.197312-1.9327-0.92015,1.445675-1.849925,2.099213-3.509275,3.042463-1.65935,0.944212-3.564138,1.4168-5.715325,1.4168-2.612225,0-4.636363-0.693-6.073375-2.081888-1.437013-1.386962-2.156-3.2725-2.156-5.653725s1.04335-4.472738,3.129087-5.950175c2.085738-1.4784,4.796138-2.2176,8.130238-2.2176h6.038725l-0.01829-3.013588c0-1.90575-0.453337-3.16855-1.660312-4.252325-1.207938-1.083775-2.34465-1.514975-4.356275-1.52845-1.81335-0.01251-3.296563,0.264688-4.536263,1.250288-1.240662,0.984637-2.037612,2.114612-2.037612,3.609375l-3.258063,0.01444,0.0038-0.162662c-0.09914-2.002963,0.679525-3.764338,2.4948-5.284125,1.814313-1.518825,4.339913-2.2792,7.263988-2.2792,2.923112,0,5.271612,0.747862,7.0455,2.242625,1.773887,1.4938,2.522712,3.49965,2.522712,6.291862l-0.0038,13.105401c0,0.936512,0.195388,1.869175,0.302225,2.7566,0.106838,0.886462,0.345538,1.766187,0.591938,2.636287h-3.49965z" fill-rule="nonzero" fill="#000"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__kana__popup.svg b/src/data/images/android/svg/qwerty__function__kana__popup.svg
deleted file mode 100644
index 9f678de..0000000
--- a/src/data/images/android/svg/qwerty__function__kana__popup.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg b/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg
new file mode 100644
index 0000000..59d3024
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns="http://www.w3.org/2000/svg"
+     version="1.1"
+     width="48"
+     height="56">
+  <!--  Original: translate(-16,-15) -->
+  <g transform="matrix(0.984375,0,0,0.984375,-15.2,-14.2)">
+    <polygon id="style-keyicon-qwerty-function" points="48,52.035 46.798,53.238 32,43.684 32.101,42.245 46.731,32.762 48,33.931" fill="#DDD" fill-rule="evenodd"/>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
index 422ce28..a0280f7 100644
--- a/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,18 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_alphabet_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <text id="style-keyicon-qwerty-function" x="13" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">?</text>
+  <text id="style-keyicon-qwerty-function" x="26.8" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">1</text>
+  <text id="style-keyicon-qwerty-function" x="39.3" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">2</text>
+  <text id="style-keyicon-qwerty-function" x="54.5" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">3</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg
deleted file mode 100644
index 3be07b5..0000000
--- a/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_alphabet_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_kana__icon.svg b/src/data/images/android/svg/qwerty__function__number_kana__icon.svg
deleted file mode 100644
index 0445bed..0000000
--- a/src/data/images/android/svg/qwerty__function__number_kana__icon.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_kana_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_kana__popup.svg b/src/data/images/android/svg/qwerty__function__number_kana__popup.svg
deleted file mode 100644
index fd8ff98..0000000
--- a/src/data/images/android/svg/qwerty__function__number_kana__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_kana_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__question_mark.svg b/src/data/images/android/svg/qwerty__function__question_mark.svg
new file mode 100644
index 0000000..b445213
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__question_mark.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">?</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg b/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg
new file mode 100644
index 0000000..588a5ff
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns="http://www.w3.org/2000/svg"
+     version="1.1"
+     width="48"
+     height="56">
+  <!--  Original: translate(-16,-15) -->
+  <g transform="matrix(0.984375,0,0,0.984375,-15.2,-14.2)">
+    <polygon id="style-keyicon-qwerty-function" points="32,52.035 33.202,53.238 48,43.684 47.9,42.245 33.269,32.762 32,33.931" fill="#DDD" fill-rule="evenodd"/>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__solidus.svg b/src/data/images/android/svg/qwerty__function__solidus.svg
index 586c8f7..a686e20 100644
--- a/src/data/images/android/svg/qwerty__function__solidus.svg
+++ b/src/data/images/android/svg/qwerty__function__solidus.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,7 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+     x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+  <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">/</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__space__icon.svg b/src/data/images/android/svg/qwerty__function__space__icon.svg
index 940fab0..263bcc6 100644
--- a/src/data/images/android/svg/qwerty__function__space__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__space__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,11 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_7_" style="fill:#DDDDDD;" points="45.634,36 45.634,43.266 22.367,43.266 22.367,36 17.5,36 
-	17.5,47.999 50.5,47.999 50.5,36 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3674" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" width="285" height="122" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3679">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-keyicon-qwerty-function" x="142.5" y="61" style="font-size:45px;text-anchor:middle;dominant-baseline:central;">日本語</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__space__popup.svg b/src/data/images/android/svg/qwerty__function__space__popup.svg
deleted file mode 100644
index 0480e19..0000000
--- a/src/data/images/android/svg/qwerty__function__space__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_space_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_4_" style="fill:#DDDDDD;" points="45.634,36 45.634,43.266 22.367,43.266 22.367,36 
-	17.5,36 17.5,47.999 50.5,47.999 50.5,36 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__symbol__icon.svg b/src/data/images/android/svg/qwerty__function__symbol__icon.svg
index f4e69af..8356fc5 100644
--- a/src/data/images/android/svg/qwerty__function__symbol__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__symbol__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,21 +29,23 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function_6_">
-	<circle style="fill:#DDDDDD;" cx="28.54" cy="22.736" r="2.21"/>
-	<circle style="fill:#DDDDDD;" cx="39.31" cy="22.736" r="2.21"/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
-	</g>
-</g>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <text id="style-keyicon-twelvekeys-function_0" x="26.7228" y="28" style="font-size:30px;dominant-baseline:central">1</text>
+  <text id="style-keyicon-twelvekeys-function_1" x="38.1754" y="28" style="font-size:30px;dominant-baseline:central">2</text>
+  <text id="style-keyicon-twelvekeys-function_2" x="53.1000" y="28" style="font-size:30px;dominant-baseline:central">3</text>
+  <!-- Original size: 114 x 80 -->
+  <g id="style-keyicon-qwerty-function_3" transform="matrix(0.597,0,0,0.597,0,4.14035)" fill-rule="nonzero" fill="#37474f">
+    <path d="m24.9,58.967776c-10.459333,0-18.9672032-8.509016-18.9672032-18.967203,0-10.459333,8.5078702-18.968349,18.9672032-18.968349s18.967203,8.509016,18.967203,18.968349c0,10.458187-8.50787,18.967203-18.967203,18.967203m0-42.466059c-12.958212,0-23.5000006,10.540644-23.5000006,23.498856,0,12.957066,10.5417886,23.49771,23.5000006,23.49771s23.500001-10.540644,23.500001-23.49771c0-12.958212-10.541789-23.498856-23.500001-23.498856"/>
+    <path d="m16.354451,37.583921c1.975512,0,3.57768-1.601023,3.57768-3.57768,0-1.975512-1.602168-3.576536-3.57768-3.576536s-3.57768,1.601024-3.57768,3.576536c0,1.976657,1.602168,3.57768,3.57768,3.57768"/>
+    <path d="m33.445434,30.429591c-1.975512,0-3.57768,1.601023-3.57768,3.57768,0,1.975512,1.602168,3.576536,3.57768,3.576536s3.57768-1.601024,3.57768-3.576536c0-1.976657-1.602168-3.57768-3.57768-3.57768"/>
+    <path d="m24.9,53.035286c8.968251,0,11.898879-8.247905,11.898879-8.247905h-23.797758s2.930628,8.247905,11.898879,8.247905"/>
+  </g>
 </svg>
+
diff --git a/src/data/images/android/svg/qwerty__function__symbol__popup.svg b/src/data/images/android/svg/qwerty__function__symbol__popup.svg
deleted file mode 100644
index 400f2db..0000000
--- a/src/data/images/android/svg/qwerty__function__symbol__popup.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function_3_">
-	<circle style="fill:#DDDDDD;" cx="28.54" cy="22.736" r="2.21"/>
-	<circle style="fill:#DDDDDD;" cx="39.31" cy="22.736" r="2.21"/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
-	</g>
-</g>
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
index a3efc0e..fb2e775 100644
--- a/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
@@ -30,13 +30,10 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_alphabet_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="148"
+     height="56">
+  <text id="style-keyicon-qwerty-function" x="74" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">abc</text>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg
deleted file mode 100644
index 4ab4c03..0000000
--- a/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_alphabet_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_kana__icon.svg b/src/data/images/android/svg/qwerty__function__text_kana__icon.svg
deleted file mode 100644
index 16485fc..0000000
--- a/src/data/images/android/svg/qwerty__function__text_kana__icon.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_kana_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_kana__popup.svg b/src/data/images/android/svg/qwerty__function__text_kana__popup.svg
deleted file mode 100644
index 8a40496..0000000
--- a/src/data/images/android/svg/qwerty__function__text_kana__popup.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_kana_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ampersand.svg b/src/data/images/android/svg/qwerty__keyicon__ampersand.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ampersand.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg b/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__asterisk.svg b/src/data/images/android/svg/qwerty__keyicon__asterisk.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__asterisk.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg b/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__black_star.svg b/src/data/images/android/svg/qwerty__keyicon__black_star.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__black_star.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg b/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__colon.svg b/src/data/images/android/svg/qwerty__keyicon__colon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__colon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__comma.svg b/src/data/images/android/svg/qwerty__keyicon__comma.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__comma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg b/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg b/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_five.svg b/src/data/images/android/svg/qwerty__keyicon__digit_five.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_five.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_four.svg b/src/data/images/android/svg/qwerty__keyicon__digit_four.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_four.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg b/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_one.svg b/src/data/images/android/svg/qwerty__keyicon__digit_one.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_one.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg b/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_six.svg b/src/data/images/android/svg/qwerty__keyicon__digit_six.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_six.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_three.svg b/src/data/images/android/svg/qwerty__keyicon__digit_three.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_three.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_two.svg b/src/data/images/android/svg/qwerty__keyicon__digit_two.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_two.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg b/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__division_sign.svg b/src/data/images/android/svg/qwerty__keyicon__division_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__division_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg b/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg b/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg b/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__full_stop.svg b/src/data/images/android/svg/qwerty__keyicon__full_stop.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__full_stop.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg b/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg b/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg b/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg b/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg b/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg b/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg b/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg
deleted file mode 100644
index e25d36e..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg
deleted file mode 100644
index e25d36e..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg b/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__low_line.svg b/src/data/images/android/svg/qwerty__keyicon__low_line.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__low_line.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg b/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__number_sign.svg b/src/data/images/android/svg/qwerty__keyicon__number_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__number_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg b/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg b/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__question_mark.svg b/src/data/images/android/svg/qwerty__keyicon__question_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg b/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg b/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__semicolon.svg b/src/data/images/android/svg/qwerty__keyicon__semicolon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__semicolon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__solidus.svg b/src/data/images/android/svg/qwerty__keyicon__solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__tilde.svg b/src/data/images/android/svg/qwerty__keyicon__tilde.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__tilde.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg b/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg b/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg b/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__shift_off.svg b/src/data/images/android/svg/qwerty__shift_off.svg
index a2b38ad..7aaa6a0 100644
--- a/src/data/images/android/svg/qwerty__shift_off.svg
+++ b/src/data/images/android/svg/qwerty__shift_off.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,18 +29,20 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_shift_x5F_off"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="shadow_18_" style="fill:#424242;" points="38.035,57.998 38.035,49.298 42.5,49.298 42.5,48.199 34.067,38 33.766,38 
-	25.5,48.333 25.5,49.298 29.967,49.298 29.967,57.998 "/>
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,-1.0114943,29.865734,38.1287) -->
+  <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+    <path id="style-keyicon-qwerty-function" d="m0,0,0-18.25,30.25,0,0,18.25,21.125,0,-36.25,36.25,-35.25,-36.25,21.125,0z" fill-rule="nonzero" style="fill:#000"/>
+  </g>
+  <!-- Original size: 90 x 90 -->
+  <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+    <path id="style-keyicon-qwerty-function" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:none; stroke:#000;"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/qwerty__shift_on.svg b/src/data/images/android/svg/qwerty__shift_on.svg
index 8d9823f..5e1dfce 100644
--- a/src/data/images/android/svg/qwerty__shift_on.svg
+++ b/src/data/images/android/svg/qwerty__shift_on.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,18 +29,20 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_shift_x5F_on"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
-	 viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-qwerty-shift-on-arrow" style="fill:#FFB005;" points="38.035,57.998 38.035,49.298 42.5,49.298 
-	42.5,48.199 34.067,38 33.766,38 25.5,48.333 25.5,49.298 29.967,49.298 29.967,57.998 "/>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,-1.0114943,29.865734,38.1287) -->
+  <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+    <path id="style-keyicon-qwerty-shift-on-arrow" d="m0,0,0-18.25,30.25,0,0,18.25,21.125,0,-36.25,36.25,-35.25,-36.25,21.125,0z" fill-rule="nonzero" style="fill:#000"/>
+  </g>
+  <!-- Original size: 90 x 90 -->
+  <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+    <path id="style-keyicon-qwerty-function" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:none;stroke:#000;"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/symbol__function__close.svg b/src/data/images/android/svg/symbol__function__close.svg
index 459a6a2..5888ac0 100644
--- a/src/data/images/android/svg/symbol__function__close.svg
+++ b/src/data/images/android/svg/symbol__function__close.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,35 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_function_x5F__x5F_close"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="51px" height="70px"
-	 viewBox="0 0 51 70" style="enable-background:new 0 0 51 70;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<path id="" style="fill:#DDDDDD;" d="M43.5,34.795h-36c-0.276,0-0.5-0.224-0.5-0.5V11
-	c0-0.276,0.224-0.5,0.5-0.5h36c0.276,0,0.5,0.224,0.5,0.5v23.295C44,34.572,43.776,34.795,43.5,34.795z M8,33.795h35V11.5H8V33.795z
-	"/>
-<g id="style-keyicon-function_2_">
-	<g>
-		<g>
-			<rect x="13.253" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.658"/>
-			<rect x="13.253" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.66"/>
-			<rect x="13.253" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.66"/>
-			<rect x="26.208" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.658"/>
-			<rect x="26.208" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.66"/>
-			<rect x="26.208" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.66"/>
-			<rect x="19.747" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.658"/>
-			<rect x="19.747" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.66"/>
-			<rect x="19.747" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.66"/>
-			<rect x="32.701" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.658"/>
-			<rect x="32.701" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.66"/>
-			<rect x="32.701" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.66"/>
-		</g>
-	</g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.394531" width="71.260742" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="23.985352" x="37.258789" style="text-anchor:middle;font-size:26px;">あいう</text>
 </svg>
diff --git a/src/data/images/android/svg/symbol__function__delete.svg b/src/data/images/android/svg/symbol__function__delete.svg
deleted file mode 100644
index e52b765..0000000
--- a/src/data/images/android/svg/symbol__function__delete.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_function_x5F__x5F_delete"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="51px" height="70px"
-	 viewBox="0 0 51 70" style="enable-background:new 0 0 51 70;" xml:space="preserve">
-<g id="style-keyicon-function_2_">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M32.601,25.833L31.1,27.367
-	l-2.302-2.334l-2.266,2.334l-1.497-1.533l2.266-2.334l-2.266-2.334l1.497-1.531l2.266,2.332l2.302-2.332l1.501,1.563L30.335,23.5
-	L32.601,25.833z M19.801,13v0.067l-0.034-0.033L9.5,23.536L19.767,34l0.034-0.035V34h20l1.699-1.734V14.8L39.833,13H19.801z"/>
-</svg>
diff --git a/src/data/images/android/svg/symbol__major__emoji.svg b/src/data/images/android/svg/symbol__major__emoji.svg
index 12375cd..bffb64f 100644
--- a/src/data/images/android/svg/symbol__major__emoji.svg
+++ b/src/data/images/android/svg/symbol__major__emoji.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,17 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoji"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="66px"
-	 viewBox="0 0 37 66" style="enable-background:new 0 0 37 66;" xml:space="preserve">
-<g id="style-symbol-major">
-	<circle style="fill:#333333;" cx="12.13" cy="29.582" r="2.578"/>
-	<circle style="fill:#333333;" cx="24.694" cy="29.582" r="2.578"/>
-	<path style="fill:#333333;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#333333;" d=""/>
-	</g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3191" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="77" width="77" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3196">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-major" fill-rule="nonzero" fill="#000" d="m38.5,59.301797c14.310181,0,18.988765-13.160478,18.988765-13.160478h-37.97753s4.678584,13.160478,18.988765,13.160478m13.636803-36.074056c-3.152906,0-5.708598,2.555692-5.708598,5.708598s2.555692,5.708598,5.708598,5.708598c3.152907,0,5.708598-2.555692,5.708598-5.708598s-2.555691-5.708598-5.708598-5.708598m-27.273606,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693503,30.268142-30.2693503s30.26814,13.5787733,30.26814,30.2693503c0,16.689368-13.577563,30.268145-30.26814,30.268145m0-67.7681443c-20.677649,0-37.5,16.8223503-37.5,37.4999993,0,20.676435,16.822351,37.498795,37.5,37.498795,20.67765,0,37.5-16.82236,37.5-37.498795,0-20.677649-16.82235-37.4999993-37.5-37.4999993"/>
 </svg>
diff --git a/src/data/images/android/svg/symbol__major__emoji_selected.svg b/src/data/images/android/svg/symbol__major__emoji_selected.svg
index aa771a2..9957e18 100644
--- a/src/data/images/android/svg/symbol__major__emoji_selected.svg
+++ b/src/data/images/android/svg/symbol__major__emoji_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,17 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoji_x5F_selected"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="66px"
-	 viewBox="0 0 37 66" style="enable-background:new 0 0 37 66;" xml:space="preserve">
-<g id="style-symbol-major-selected">
-	<circle style="fill:#F9F9F9;" cx="12.13" cy="29.582" r="2.578"/>
-	<circle style="fill:#F9F9F9;" cx="24.694" cy="29.582" r="2.578"/>
-	<path style="fill:#F9F9F9;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#F9F9F9;" d=""/>
-	</g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3191" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="77" width="77" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3196">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-major-selected" fill-rule="nonzero" fill="#000" d="m38.5,59.301797c14.310181,0,18.988765-13.160478,18.988765-13.160478h-37.97753s4.678584,13.160478,18.988765,13.160478m13.636803-36.074056c-3.152906,0-5.708598,2.555692-5.708598,5.708598s2.555692,5.708598,5.708598,5.708598c3.152907,0,5.708598-2.555692,5.708598-5.708598s-2.555691-5.708598-5.708598-5.708598m-27.273606,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693503,30.268142-30.2693503s30.26814,13.5787733,30.26814,30.2693503c0,16.689368-13.577563,30.268145-30.26814,30.268145m0-67.7681443c-20.677649,0-37.5,16.8223503-37.5,37.4999993,0,20.676435,16.822351,37.498795,37.5,37.498795,20.67765,0,37.5-16.82236,37.5-37.498795,0-20.677649-16.82235-37.4999993-37.5-37.4999993"/>
 </svg>
diff --git a/src/data/images/android/svg/symbol__major__emoticon.svg b/src/data/images/android/svg/symbol__major__emoticon.svg
index b0ac2e9..fbc7c18 100644
--- a/src/data/images/android/svg/symbol__major__emoticon.svg
+++ b/src/data/images/android/svg/symbol__major__emoticon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoticon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="61px" height="66px"
-	 viewBox="0 0 61 66" style="enable-background:new 0 0 61 66;" xml:space="preserve">
-<g id="style-symbol-major_1_">
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.71875" width="74.540039" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major" y="25.763672" x="37.277344" style="text-anchor:middle;font-size:30px;">(^^)</text>
 </svg>
diff --git a/src/data/images/android/svg/symbol__major__emoticon_selected.svg b/src/data/images/android/svg/symbol__major__emoticon_selected.svg
index bfd7ed2..9b56f19 100644
--- a/src/data/images/android/svg/symbol__major__emoticon_selected.svg
+++ b/src/data/images/android/svg/symbol__major__emoticon_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoticon_x5F_selected"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="61px" height="66px"
-	 viewBox="0 0 61 66" style="enable-background:new 0 0 61 66;" xml:space="preserve">
-<g id="style-symbol-major-selected_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.71875" width="74.540039" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major-selected" y="25.763672" x="37.277344" style="text-anchor:middle;font-size:30px;">(^^)</text>
 </svg>
diff --git a/src/data/images/android/svg/symbol__major__number.svg b/src/data/images/android/svg/symbol__major__number.svg
new file mode 100644
index 0000000..f7cef5f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__major__number.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.69043" width="57.591797" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major" y="25.265625" x="28.356445" style="text-anchor:middle;font-size:30px;">123</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__major__number_selected.svg b/src/data/images/android/svg/symbol__major__number_selected.svg
new file mode 100644
index 0000000..519db6b
--- /dev/null
+++ b/src/data/images/android/svg/symbol__major__number_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.69043" width="57.591797" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major-selected" y="25.265625" x="28.356445" style="text-anchor:middle;font-size:30px;">123</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__major__symbol.svg b/src/data/images/android/svg/symbol__major__symbol.svg
index c7479f8..42f22be 100644
--- a/src/data/images/android/svg/symbol__major__symbol.svg
+++ b/src/data/images/android/svg/symbol__major__symbol.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,7 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_symbol"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="85px" height="66px"
-	 viewBox="0 0 85 66" style="enable-background:new 0 0 85 66;" xml:space="preserve">
-<g id="style-symbol-major_1_">
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-	<path style="fill:#333333;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.879883" width="54" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <text id="style-symbol-major" y="27.84375" x="28" style="text-anchor:middle;font-size:30px;">「」♪</text>
 </svg>
diff --git a/src/data/images/android/svg/symbol__major__symbol_selected.svg b/src/data/images/android/svg/symbol__major__symbol_selected.svg
index 929641c..8d7a423 100644
--- a/src/data/images/android/svg/symbol__major__symbol_selected.svg
+++ b/src/data/images/android/svg/symbol__major__symbol_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,7 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_symbol_x5F_selected"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="85px" height="66px"
-	 viewBox="0 0 85 66" style="enable-background:new 0 0 85 66;" xml:space="preserve">
-<g id="style-symbol-major-selected_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.879883" width="54" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <text id="style-symbol-major-selected" y="27.84375" x="28" style="text-anchor:middle;font-size:30px;">「」♪</text>
 </svg>
diff --git a/src/data/images/android/svg/symbol__minor__activity.svg b/src/data/images/android/svg/symbol__minor__activity.svg
new file mode 100644
index 0000000..496025a
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__activity.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3507" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3512">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g224" transform="matrix(1.25,0,0,-1.25,65.22575,1048.3876)">
+   <path id="style-symbol-minor" d="m0,0c0-0.664-0.539-1.203-1.203-1.203h-38.11c-0.665,0-1.203,0.539-1.203,1.203v1.286c0,0.663,0.538,1.202,1.203,1.202h38.11c0.664,0,1.203-0.539,1.203-1.202v-1.286zm-6.5723,9.3829c-1.358,0-2.46,1.102-2.46,2.461,0,1.357,1.102,2.459,2.46,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m-13.646,0c-1.754,0-3.176,1.422-3.176,3.175s1.422,3.175,3.176,3.175c1.752,0,3.173-1.422,3.173-3.175s-1.421-3.175-3.173-3.175m-12.928,0c-1.36,0-2.461,1.102-2.461,2.461,0,1.357,1.101,2.459,2.461,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m30.457,9.645-35.498,0c-1.285,0-2.328-1.043-2.328-2.329v-9.31c0-1.285,1.043-2.328,2.328-2.328h35.498c1.285,0,2.326,1.043,2.326,2.328v9.31c0,1.286-1.041,2.329-2.326,2.329m6.8592,28.4087,1.477-0.675c-0.126-1.076-0.565-2.394-1.211-3.817-2.686-5.905-8.969-13.603-11.501-13.236-3.593,0.52-3.404,3.682-3.515,6.494-0.213,5.391,0.165,9.891,1.465,14.883,0.002,0.01,0.002,0.016,0.006,0.026l2.011-0.371-1.824,8.103-4.801-7.022,1.957-0.255c0.031-0.76,0.031-1.803-0.096-3.197-0.427-4.681-1.206-8.047-3.42-11.888-3.048-5.287-6.825-5.39-9.588-0.067-2.164,4.167-4.009,10.472-3.281,15.328,0.008,0.061,0.014,0.103,0.023,0.158l1.421,0.262-4.672,6.681-1.566-7.832,1.746,0.322c1.998-5.55,2.252-12.421,0.242-18.117-1.588-4.504-3.35-5.041-7.047-1.957-3.035,2.531-4.752,6.137-6.526,9.46-0.794,1.878-1.132,3.15-1.609,4.685l1.609,0.734-5.978,5.392,0.58-7.855,1.328,0.606c1.319-1.375,1.969-3.834,2.957-5.748,1.235-3.76,2.637-7.473,3.649-11.289,0.932-3.514,1.03-5.036,4.701-4.973,8.096,0.139,25.082,0.029,33.18,0.029,2.082,0,3.76,0.397,4.716,3.199,1.963,5.754,4.549,13.598,5.678,16.323,0.594,1.437,1.201,3.033,1.727,3.852l1.558-0.701,0.581,7.855-5.977-5.392z" fill-rule="nonzero" style="fill:#777"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__activity_selected.svg b/src/data/images/android/svg/symbol__minor__activity_selected.svg
new file mode 100644
index 0000000..e843c3d
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__activity_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3507" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3512">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g224" transform="matrix(1.25,0,0,-1.25,65.22575,1048.3876)">
+   <path id="style-symbol-minor-selected" d="m0,0c0-0.664-0.539-1.203-1.203-1.203h-38.11c-0.665,0-1.203,0.539-1.203,1.203v1.286c0,0.663,0.538,1.202,1.203,1.202h38.11c0.664,0,1.203-0.539,1.203-1.202v-1.286zm-6.5723,9.3829c-1.358,0-2.46,1.102-2.46,2.461,0,1.357,1.102,2.459,2.46,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m-13.646,0c-1.754,0-3.176,1.422-3.176,3.175s1.422,3.175,3.176,3.175c1.752,0,3.173-1.422,3.173-3.175s-1.421-3.175-3.173-3.175m-12.928,0c-1.36,0-2.461,1.102-2.461,2.461,0,1.357,1.101,2.459,2.461,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m30.457,9.645-35.498,0c-1.285,0-2.328-1.043-2.328-2.329v-9.31c0-1.285,1.043-2.328,2.328-2.328h35.498c1.285,0,2.326,1.043,2.326,2.328v9.31c0,1.286-1.041,2.329-2.326,2.329m6.8592,28.4087,1.477-0.675c-0.126-1.076-0.565-2.394-1.211-3.817-2.686-5.905-8.969-13.603-11.501-13.236-3.593,0.52-3.404,3.682-3.515,6.494-0.213,5.391,0.165,9.891,1.465,14.883,0.002,0.01,0.002,0.016,0.006,0.026l2.011-0.371-1.824,8.103-4.801-7.022,1.957-0.255c0.031-0.76,0.031-1.803-0.096-3.197-0.427-4.681-1.206-8.047-3.42-11.888-3.048-5.287-6.825-5.39-9.588-0.067-2.164,4.167-4.009,10.472-3.281,15.328,0.008,0.061,0.014,0.103,0.023,0.158l1.421,0.262-4.672,6.681-1.566-7.832,1.746,0.322c1.998-5.55,2.252-12.421,0.242-18.117-1.588-4.504-3.35-5.041-7.047-1.957-3.035,2.531-4.752,6.137-6.526,9.46-0.794,1.878-1.132,3.15-1.609,4.685l1.609,0.734-5.978,5.392,0.58-7.855,1.328,0.606c1.319-1.375,1.969-3.834,2.957-5.748,1.235-3.76,2.637-7.473,3.649-11.289,0.932-3.514,1.03-5.036,4.701-4.973,8.096,0.139,25.082,0.029,33.18,0.029,2.082,0,3.76,0.397,4.716,3.199,1.963,5.754,4.549,13.598,5.678,16.323,0.594,1.437,1.201,3.033,1.727,3.852l1.558-0.701,0.581,7.855-5.977-5.392z" fill-rule="nonzero" style="fill:#777"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__arrow.svg b/src/data/images/android/svg/symbol__minor__arrow.svg
new file mode 100644
index 0000000..8105bfe
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__arrow.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3398" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3403">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <path id="style-symbol-minor" d="m10.206875,1000.7484,0,22.5638,41.655,0,0,15.935,37.93125-28.2038-37.93125-25.56623,0,15.55503-41.655-0.2838z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__arrow_selected.svg b/src/data/images/android/svg/symbol__minor__arrow_selected.svg
new file mode 100644
index 0000000..cf18903
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__arrow_selected.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3398" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3403">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <path id="style-symbol-minor-selected" d="m10.206875,1000.7484,0,22.5638,41.655,0,0,15.935,37.93125-28.2038-37.93125-25.56623,0,15.55503-41.655-0.2838z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__city.svg b/src/data/images/android/svg/symbol__minor__city.svg
new file mode 100644
index 0000000..d6e8a11
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__city.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3556" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3561">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor" fill-rule="nonzero" fill="#000" d="m63.495858,47.667609c-3.674569,0-6.65334-2.978771-6.65334-6.65334s2.978771-6.652155,6.65334-6.652155,6.652155,2.977586,6.652155,6.652155-2.977586,6.65334-6.652155,6.65334m-45.621551,0c-3.674569,0-6.652155-2.978771-6.652155-6.65334s2.977586-6.652155,6.652155-6.652155,6.653341,2.977586,6.653341,6.652155-2.978772,6.65334-6.653341,6.65334m1.901293-29.663254c0.950647-1.901293,2.85194-1.901293,2.85194-1.901293h35.165624c1.901293,0,1.901293,1.901293,1.901293,1.901293l5.701509,12.89181h-50.372413s3.801401-10.990517,4.752047-12.89181m43.720258-2.651616s-0.950647-3.801401-4.752047-3.801401h-37.066918c-3.802586,0-4.752047,3.801401-4.752047,3.801401l-9.9248919,22.810775v14.256142h65.9999989v-14.256142l-9.504095-22.810775zm-56.4959039,49.830236c0,2.846013,3.4137929,3.265625,3.4137929,3.265625h6.615409c2.846013,0,2.488039-3.265625,2.488039-3.265625v-5.837823h41.15043v5.837823c0,2.846013,2.846013,3.265625,2.846013,3.265625h6.640302c2.846013,0,2.846013-3.265625,2.846013-3.265625v-9.251616h-65.9999989v9.251616z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__city_selected.svg b/src/data/images/android/svg/symbol__minor__city_selected.svg
new file mode 100644
index 0000000..b0c32b8
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__city_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3556" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3561">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" fill="#000" d="m63.495858,47.667609c-3.674569,0-6.65334-2.978771-6.65334-6.65334s2.978771-6.652155,6.65334-6.652155,6.652155,2.977586,6.652155,6.652155-2.977586,6.65334-6.652155,6.65334m-45.621551,0c-3.674569,0-6.652155-2.978771-6.652155-6.65334s2.977586-6.652155,6.652155-6.652155,6.653341,2.977586,6.653341,6.652155-2.978772,6.65334-6.653341,6.65334m1.901293-29.663254c0.950647-1.901293,2.85194-1.901293,2.85194-1.901293h35.165624c1.901293,0,1.901293,1.901293,1.901293,1.901293l5.701509,12.89181h-50.372413s3.801401-10.990517,4.752047-12.89181m43.720258-2.651616s-0.950647-3.801401-4.752047-3.801401h-37.066918c-3.802586,0-4.752047,3.801401-4.752047,3.801401l-9.9248919,22.810775v14.256142h65.9999989v-14.256142l-9.504095-22.810775zm-56.4959039,49.830236c0,2.846013,3.4137929,3.265625,3.4137929,3.265625h6.615409c2.846013,0,2.488039-3.265625,2.488039-3.265625v-5.837823h41.15043v5.837823c0,2.846013,2.846013,3.265625,2.846013,3.265625h6.640302c2.846013,0,2.846013-3.265625,2.846013-3.265625v-9.251616h-65.9999989v9.251616z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__displeasure.svg b/src/data/images/android/svg/symbol__minor__displeasure.svg
new file mode 100644
index 0000000..108b2e0
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__displeasure.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">怒</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__displeasure_selected.svg b/src/data/images/android/svg/symbol__minor__displeasure_selected.svg
new file mode 100644
index 0000000..2d6cc49
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__displeasure_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">怒</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__face.svg b/src/data/images/android/svg/symbol__minor__face.svg
new file mode 100644
index 0000000..7d93d36
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__face.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3338" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3343">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36217)">
+  <path id="style-symbol-minor" d="m62.461706,1021.0934c-1.49375,2.99-9.87125,12.6912-21.15375,12.6912-10.9275,0-15.51125-4.23-19.7425-8.4612-6.0575-6.0575-2.1925-6.765-2.1925-6.765s20.375,16.3512,38.8575,1.125c2.8175-2.3213,5.64125-1.4113,4.23125,1.41m-35.96125-25.16752c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m27.49875,0c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m-13.24125-16.05c-40.63624018-1.80625-37.9274902,51.47002-37.9274902,51.47002s9.2475002,13.5475,35.7762402,13.5475c27.85625,0,38.4675-11.9388,38.4675-11.9388s4.32-51.27372-36.31625-53.07872" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__face_selected.svg b/src/data/images/android/svg/symbol__minor__face_selected.svg
new file mode 100644
index 0000000..e95d39f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__face_selected.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3338" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3343">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36217)">
+  <path id="style-symbol-minor-selected" d="m62.461706,1021.0934c-1.49375,2.99-9.87125,12.6912-21.15375,12.6912-10.9275,0-15.51125-4.23-19.7425-8.4612-6.0575-6.0575-2.1925-6.765-2.1925-6.765s20.375,16.3512,38.8575,1.125c2.8175-2.3213,5.64125-1.4113,4.23125,1.41m-35.96125-25.16752c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m27.49875,0c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m-13.24125-16.05c-40.63624018-1.80625-37.9274902,51.47002-37.9274902,51.47002s9.2475002,13.5475,35.7762402,13.5475c27.85625,0,38.4675-11.9388,38.4675-11.9388s4.32-51.27372-36.31625-53.07872" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__food.svg b/src/data/images/android/svg/symbol__minor__food.svg
new file mode 100644
index 0000000..eb5be7a
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__food.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3403" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3408">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g212" style="fill:#000" transform="matrix(1.25,0,0,-1.25,50.274198,1020.5943)">
+   <path id="style-symbol-minor" d="m0,0c-1.971-2.592-5.055-4.291-8.563-4.291-3.534,0-6.642,1.723-8.609,4.35-1.35,1.8-2.18,4.015-2.18,6.441,0,2.439,0.84,4.666,2.206,6.473,1.97,2.606,5.065,4.316,8.583,4.316,3.488,0,6.556-1.682,8.528-4.248,1.398-1.82,2.263-4.07,2.263-6.541,0-2.453-0.85-4.688-2.228-6.5m12.927,0.033c4.555,0.05,8.891,3.14,8.709,6.721-0.173,3.363-4.378,6.418-8.638,6.134-1.461-0.097-2.893-0.583-4.352-0.824-1.328-0.216-3.292-0.758-3.792,0.278-0.499,1.037,4.035,3.397,6.013,5.028,3.737,3.078,4.303,7.263,1.674,10.17-2.719,3.007-6.517,2.593-10.012-1.282-1.772-1.963-4.137-6.781-5.377-6.373-1.236,0.408,0.223,4.838,0.346,6.982,0.189,3.238,0.138,6.354-2.871,8.456-1.826,1.276-3.856,1.494-5.738,0.298-3.232-2.055-3.592-5.317-3.424-8.795,0.104-2.159,1.424-6.307,0.205-6.836-1.221-0.529-4.012,5.045-6.096,7.075-2.562,2.497-5.664,3.847-8.788,0.789-3.165-3.097-2.397-6.473,0.198-9.372,2.079-2.318,7.83-4.774,7.045-5.998-0.787-1.223-4.98,0.366-7.437,0.428-3.167,0.078-5.913-0.512-7.7-3.271-1.298-2.004-1.296-4.274,0.004-6.274,1.79-2.757,4.555-3.585,7.702-3.174,1.453,0.192,2.881,0.593,4.322,0.896,1.213,0.254,2.931,0.532,3.25-0.434,0.322-0.967-4.758-3.613-6.797-5.702-2.871-2.938-3.971-6.449-0.582-9.769,3.361-3.294,6.538-1.528,9.188,1.142,1.716,1.729,2.517,3.523,4.345,5.91,0.3,0.392,1.086,1.67,1.945,1.203,0.857-0.466-1.612-7.669-0.643-11.115,0.862-3.061,2.31-5.638,5.923-5.56,3.476,0.076,5.451,2.311,5.829,5.584,0.246,2.155-0.267,4.392-0.38,6.595-0.057,1.095-0.926,2.848,0.074,3.371,1,0.524,4.227-4.317,6.309-6.351,2.564-2.506,5.664-3.852,8.797-0.799,3.179,3.1,2.382,6.463-0.194,9.384-2.07,2.35-7.951,4.856-7.062,6.345,0.889,1.486,5.488-0.887,8.005-0.86" fill-rule="nonzero" style="fill:#000"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__food_selected.svg b/src/data/images/android/svg/symbol__minor__food_selected.svg
new file mode 100644
index 0000000..53c3305
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__food_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3403" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3408">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g212" style="fill:#000" transform="matrix(1.25,0,0,-1.25,50.274198,1020.5943)">
+   <path id="style-symbol-minor-selected" d="m0,0c-1.971-2.592-5.055-4.291-8.563-4.291-3.534,0-6.642,1.723-8.609,4.35-1.35,1.8-2.18,4.015-2.18,6.441,0,2.439,0.84,4.666,2.206,6.473,1.97,2.606,5.065,4.316,8.583,4.316,3.488,0,6.556-1.682,8.528-4.248,1.398-1.82,2.263-4.07,2.263-6.541,0-2.453-0.85-4.688-2.228-6.5m12.927,0.033c4.555,0.05,8.891,3.14,8.709,6.721-0.173,3.363-4.378,6.418-8.638,6.134-1.461-0.097-2.893-0.583-4.352-0.824-1.328-0.216-3.292-0.758-3.792,0.278-0.499,1.037,4.035,3.397,6.013,5.028,3.737,3.078,4.303,7.263,1.674,10.17-2.719,3.007-6.517,2.593-10.012-1.282-1.772-1.963-4.137-6.781-5.377-6.373-1.236,0.408,0.223,4.838,0.346,6.982,0.189,3.238,0.138,6.354-2.871,8.456-1.826,1.276-3.856,1.494-5.738,0.298-3.232-2.055-3.592-5.317-3.424-8.795,0.104-2.159,1.424-6.307,0.205-6.836-1.221-0.529-4.012,5.045-6.096,7.075-2.562,2.497-5.664,3.847-8.788,0.789-3.165-3.097-2.397-6.473,0.198-9.372,2.079-2.318,7.83-4.774,7.045-5.998-0.787-1.223-4.98,0.366-7.437,0.428-3.167,0.078-5.913-0.512-7.7-3.271-1.298-2.004-1.296-4.274,0.004-6.274,1.79-2.757,4.555-3.585,7.702-3.174,1.453,0.192,2.881,0.593,4.322,0.896,1.213,0.254,2.931,0.532,3.25-0.434,0.322-0.967-4.758-3.613-6.797-5.702-2.871-2.938-3.971-6.449-0.582-9.769,3.361-3.294,6.538-1.528,9.188,1.142,1.716,1.729,2.517,3.523,4.345,5.91,0.3,0.392,1.086,1.67,1.945,1.203,0.857-0.466-1.612-7.669-0.643-11.115,0.862-3.061,2.31-5.638,5.923-5.56,3.476,0.076,5.451,2.311,5.829,5.584,0.246,2.155-0.267,4.392-0.38,6.595-0.057,1.095-0.926,2.848,0.074,3.371,1,0.524,4.227-4.317,6.309-6.351,2.564-2.506,5.664-3.852,8.797-0.799,3.179,3.1,2.382,6.463-0.194,9.384-2.07,2.35-7.951,4.856-7.062,6.345,0.889,1.486,5.488-0.887,8.005-0.86" fill-rule="nonzero" style="fill:#000"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__fullhalf.svg b/src/data/images/android/svg/symbol__minor__fullhalf.svg
new file mode 100644
index 0000000..92f585c
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__fullhalf.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="60" style="font-size:48px;dominant-baseline:central;text-anchor:middle;">全/半</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg b/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg
new file mode 100644
index 0000000..8e49ee8
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="60" style="font-size:48px;dominant-baseline:central;text-anchor:middle;">全/半</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__general.svg b/src/data/images/android/svg/symbol__minor__general.svg
new file mode 100644
index 0000000..76caf1b
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__general.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3303" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3308">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">♥</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__general_selected.svg b/src/data/images/android/svg/symbol__minor__general_selected.svg
new file mode 100644
index 0000000..f28df05
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__general_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3303" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3308">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">♥</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__history.svg b/src/data/images/android/svg/symbol__minor__history.svg
new file mode 100644
index 0000000..74f5f0f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__history.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3195" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3200">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.3622)">
+  <g id="g164" style="fill:#000" transform="matrix(1.25,0,0,-1.25,71.251875,1025.9501)">
+   <path id="style-symbol-minor" fill-rule="nonzero" style="fill:#000" d="m0,0-19,10.87-2-4,19-10l2,3.13zm-20,30.87008-0.646-23.963,5,1-1.041,23.025-3.313-0.062zm2.998,5.6172c-14.126,0-25.62-11.49-25.62-25.617s11.494-25.617,25.62-25.617,25.62,11.49,25.62,25.617-11.494,25.617-25.62,25.617m0-55.617c-16.541,0-29.998,13.459-29.998,30s13.457,30,29.998,30,29.999-13.459,29.999-30-13.458-30-29.999-30"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__history_selected.svg b/src/data/images/android/svg/symbol__minor__history_selected.svg
new file mode 100644
index 0000000..91236ab
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__history_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3195" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3200">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.3622)">
+  <g id="g164" style="fill:#000" transform="matrix(1.25,0,0,-1.25,71.251875,1025.9501)">
+   <path id="style-symbol-minor-selected" fill-rule="nonzero" style="fill:#000" d="m0,0-19,10.87-2-4,19-10l2,3.13zm-20,30.87008-0.646-23.963,5,1-1.041,23.025-3.313-0.062zm2.998,5.6172c-14.126,0-25.62-11.49-25.62-25.617s11.494-25.617,25.62-25.617,25.62,11.49,25.62,25.617-11.494,25.617-25.62,25.617m0-55.617c-16.541,0-29.998,13.459-29.998,30s13.457,30,29.998,30,29.999-13.459,29.999-30-13.458-30-29.999-30"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__math.svg b/src/data/images/android/svg/symbol__minor__math.svg
new file mode 100644
index 0000000..0493128
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__math.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3175" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3180">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor" fill-rule="nonzero" fill="#000" d="m69.810889,77.500001,7.075445,0,0-7.075445-7.075445,0,0,7.075445zm-12.735801-14.15089,32.547047,0,0-5.660356-32.547047,0,0,5.660356zm19.811246-18.396157-7.075445,0,0,7.075445,7.075445,0,0-7.075445zm-39.621784,2.829895-9.905623,11.320712-9.905623-11.320712-4.245267,4.245267,10.388168,10.689582-10.167414,10.383923,4.024513,4.398097,9.905623-9.905623,10.290527,9.427323,3.918382-3.919797l-10.198547-10.383923,10.198547-10.385338-4.303286-4.549511zm46.697229-31.131675-19.811246,0,0,5.660356,19.811246,0,0-5.660356zm-53.772674-14.1511729h-7.075445v14.1508899h-12.735801v5.660356h12.735801v14.15089h7.075445v-14.15089h12.735801v-5.660356h-12.735801v-14.1508899z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__math_selected.svg b/src/data/images/android/svg/symbol__minor__math_selected.svg
new file mode 100644
index 0000000..b629d36
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__math_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3175" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3180">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" fill="#000" d="m69.810889,77.500001,7.075445,0,0-7.075445-7.075445,0,0,7.075445zm-12.735801-14.15089,32.547047,0,0-5.660356-32.547047,0,0,5.660356zm19.811246-18.396157-7.075445,0,0,7.075445,7.075445,0,0-7.075445zm-39.621784,2.829895-9.905623,11.320712-9.905623-11.320712-4.245267,4.245267,10.388168,10.689582-10.167414,10.383923,4.024513,4.398097,9.905623-9.905623,10.290527,9.427323,3.918382-3.919797l-10.198547-10.383923,10.198547-10.385338-4.303286-4.549511zm46.697229-31.131675-19.811246,0,0,5.660356,19.811246,0,0-5.660356zm-53.772674-14.1511729h-7.075445v14.1508899h-12.735801v5.660356h12.735801v14.15089h7.075445v-14.15089h12.735801v-5.660356h-12.735801v-14.1508899z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__nature.svg b/src/data/images/android/svg/symbol__minor__nature.svg
new file mode 100644
index 0000000..50a5384
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__nature.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3623" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3628">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g236" transform="matrix(1.25,0,0,-1.25,38.75,983.61218)">
+   <path id="style-symbol-minor" fill-rule="nonzero" style="fill:#777" d="M0,0-28-46,30-46,0,0z"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__nature_selected.svg b/src/data/images/android/svg/symbol__minor__nature_selected.svg
new file mode 100644
index 0000000..0b43dc2
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__nature_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3623" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3628">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+  <g id="g236" transform="matrix(1.25,0,0,-1.25,38.75,983.61218)">
+   <path id="style-symbol-minor-selected" fill-rule="nonzero" style="fill:#777777" d="M0,0-28-46,30-46,0,0z"/>
+  </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__parenthesis.svg b/src/data/images/android/svg/symbol__minor__parenthesis.svg
new file mode 100644
index 0000000..723fdc5
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__parenthesis.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:55px;dominant-baseline:central;text-anchor:middle;">(   )</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg b/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg
new file mode 100644
index 0000000..68f3c67
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:55px;dominant-baseline:central;text-anchor:middle;">(   )</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sadness.svg b/src/data/images/android/svg/symbol__minor__sadness.svg
new file mode 100644
index 0000000..0fc3d9e
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sadness.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">悲</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sadness_selected.svg b/src/data/images/android/svg/symbol__minor__sadness_selected.svg
new file mode 100644
index 0000000..9953245
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sadness_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">悲</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__smile.svg b/src/data/images/android/svg/symbol__minor__smile.svg
new file mode 100644
index 0000000..fb2cba4
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__smile.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">喜</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__smile_selected.svg b/src/data/images/android/svg/symbol__minor__smile_selected.svg
new file mode 100644
index 0000000..3b24ea3
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__smile_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">喜</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__surprise.svg b/src/data/images/android/svg/symbol__minor__surprise.svg
new file mode 100644
index 0000000..c0bfaea
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__surprise.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">驚</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__surprise_selected.svg b/src/data/images/android/svg/symbol__minor__surprise_selected.svg
new file mode 100644
index 0000000..df1ad2e
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__surprise_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">驚</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sweat.svg b/src/data/images/android/svg/symbol__minor__sweat.svg
new file mode 100644
index 0000000..cb6893f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sweat.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">焦</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sweat_selected.svg b/src/data/images/android/svg/symbol__minor__sweat_selected.svg
new file mode 100644
index 0000000..81d2b64
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sweat_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:title/>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">焦</text>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__01.svg b/src/data/images/android/svg/twelvekeys__alphabet__01.svg
deleted file mode 100644
index d0e4803..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__01.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_01"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__02.svg b/src/data/images/android/svg/twelvekeys__alphabet__02.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__02.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__03.svg b/src/data/images/android/svg/twelvekeys__alphabet__03.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__03.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__04.svg b/src/data/images/android/svg/twelvekeys__alphabet__04.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__04.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__05.svg b/src/data/images/android/svg/twelvekeys__alphabet__05.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__05.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__06.svg b/src/data/images/android/svg/twelvekeys__alphabet__06.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__06.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__07.svg b/src/data/images/android/svg/twelvekeys__alphabet__07.svg
deleted file mode 100644
index 4fb7dbf..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__07.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__08.svg b/src/data/images/android/svg/twelvekeys__alphabet__08.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__08.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__09.svg b/src/data/images/android/svg/twelvekeys__alphabet__09.svg
deleted file mode 100644
index 4fb7dbf..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__09.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__10.svg b/src/data/images/android/svg/twelvekeys__alphabet__10.svg
index b3fc5ef..b55eb8c 100644
--- a/src/data/images/android/svg/twelvekeys__alphabet__10.svg
+++ b/src/data/images/android/svg/twelvekeys__alphabet__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,17 +30,14 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_10"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
+<svg version="1.1" id="twelvekeys_alphabet_10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
 <g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
+  <text x="33" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">a</text>
 </g>
 <g id="style-keyicon-main_2_">
-	<path style="fill:#272727;" d=""/>
+  <text x="52.5" y="43.5" style="font-size:20px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
+<g id="style-keyicon-main_3_">
+  <text x="72" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">A</text>
 </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__11.svg b/src/data/images/android/svg/twelvekeys__alphabet__11.svg
deleted file mode 100644
index 7f1a0fc..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__11.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_11"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__12.svg b/src/data/images/android/svg/twelvekeys__alphabet__12.svg
deleted file mode 100644
index 88c9dc5..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__12.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_12"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg b/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg
new file mode 100644
index 0000000..6ee950e
--- /dev/null
+++ b/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xml:space="preserve"
+     version="1.1"
+     width="87px"
+     height="87px">
+  <!-- Original size: 105 x 87 -->
+  <g id="style-keyicon-main" transform="matrix(1.2,0,0,1.2,-19.5,-8.7)">
+    <text x="33" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">a</text>
+    <text x="52.5" y="43.5" style="font-size:20px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+    <text x="72" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">A</text>
+  </g>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg
deleted file mode 100644
index 372346f..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""
-		/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg
deleted file mode 100644
index 8fff803..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""
-		/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg b/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
index 316ba4a..31548a9 100644
--- a/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,18 +29,19 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 68 x 56 -->
+  <g transform="matrix(0.78,0,0,0.78,7.98,2.70)">
+    <path id="style-keyicon-function-dark" opacity="0.5" d="m16.555652,31.63854c-1.310925,0-2.715213,0.189612-4.2119,0.561137v3.650763l-0.420613,4.632512c1.870138-2.246475,3.41495-5.194612,4.632513-8.844412m-6.7384625,10.809837c-0.28105-1.590049-0.421575-3.881762-0.421575-6.878987v-2.387c-3.93085,1.965425-5.896275,4.49295-5.896275,7.581612,0,0.842188,0.3031875,1.614113,0.91245,2.315775,0.6073375,0.702626,1.2397,1.052975,1.8951625,1.052975,1.0289125,0,2.19835-0.561137,3.5102375-1.684375m5.7557495,6.0368c-0.28105-1.030837-0.656425-2.05975-1.123237-3.088662,7.392962-0.466813,11.090887-2.807612,11.090887-7.019512,0-3.180101-2.01355-5.286051-6.0368-6.316888-1.779662,5.148413-3.93085,8.938737-6.457412,11.370975-2.527525,2.435125-4.868325,3.6498-7.0195125,3.6498-1.4986125,0-2.785475-0.5852-3.8605875-1.754638-1.078-1.168475-1.615075-2.643025-1.615075-4.421725,0-4.865437,2.9481375-8.469037,8.8444125-10.809837,0-1.685338,0.0462-3.275388,0.140525-4.774h-7.58065v-3.0877c1.1232375,0.18865,2.6670875,0.280087,4.6325125,0.280087,0.9345875,0,2.011625-0.04524,3.2291875-0.140525,0-0.652575,0.140525-2.010662,0.4206125-4.070412l3.088662,0.139562-0.420612,3.791288,13.195875-0.28105,0.140525,2.948137-13.61745,0.420613c-0.09433,0.84315-0.140525,2.10595-0.140525,3.791287,1.309-0.28105,2.527525-0.421575,3.6498-0.421575,0.186725,0,0.607337,0.04909,1.263762,0.140525,0.0924-0.372487,0.186725-0.934587,0.28105-1.684375l3.088663,0.701663c0,0.18865-0.140525,0.656425-0.421575,1.403325,5.708587,1.404287,8.563363,4.49295,8.563363,9.265987,0,2.621851-0.982713,4.751863-2.948138,6.388113s-5.4285,2.82975-10.388263,3.579537" fill-rule="nonzero" fill="#000"/>
+  </g>
+  <g transform="matrix(0.76,0,0,0.76,7.66,6.72)">
+    <path id="style-keyicon-twelvekeys-function" opacity="0.80000299" d="m48.39496,43.654486c3.3418,0,5.607525-0.836413,8.053237-2.422613,2.445713-1.5862,3.682525-3.721025,4.55455-6.214862l0.0087-6.451638-9.010925-0.01829c-3.536225,0-5.826975,0.34265-8.12735,2.0251-2.301338,1.683412-3.239775,3.52275-3.239775,5.895312,0,2.229151,0.615037,3.805725,2.080925,5.160925,1.464925,1.356163,3.113688,2.026063,5.680675,2.026063m13.893687,3.716212c-0.282012-1.232962-0.537075-1.981787-0.7392-2.963537-0.205012-0.999075-0.290675-1.807575-0.290675-2.849-1.356162,2.131937-2.727725,3.094437-5.173437,4.486212-2.446675,1.392738-5.25525,2.088625-8.42765,2.088625-3.85,0-6.834713-1.022175-8.954138-3.069412-2.118462-2.045313-3.178175-4.82405-3.178175-8.33525s1.537113-6.594088,4.613263-8.77415c3.075187-2.1791,7.070525-3.26865,11.986975-3.26865h8.904087l-0.02695-4.443863c0-2.808575-0.668937-4.671012-2.4486-6.269725-1.780625-1.59775-3.456337-2.233-6.4218-2.253212-2.673825-0.01829-4.860625,0.389812-6.689375,1.843187-1.82875,1.452413-3.003962,3.119463-3.003962,5.322625l-4.803838,0.02021,0.0058-0.2387c-0.145399-2.953907,1.001901-5.550732,3.678613-7.791432,2.674788-2.239737,6.397738-3.360087,10.708775-3.360087,4.310075,0,7.77315,1.1020625,10.388263,3.305225,2.616075,2.204125,3.720062,5.160925,3.720062,9.277537l-0.0058,19.32315c0,1.380226,0.287788,2.755638,0.445638,4.063675,0.156888,1.307075,0.509162,2.603563,0.872025,3.886575h-5.159963z" fill-rule="nonzero" fill="#000"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg b/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg
deleted file mode 100644
index f47ef89..0000000
--- a/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-popup-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__delete__icon.svg b/src/data/images/android/svg/twelvekeys__function__delete__icon.svg
deleted file mode 100644
index 8a4291f..0000000
--- a/src/data/images/android/svg/twelvekeys__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M57.03,31H33.234v0.066H33.2
-	L21,43.032L33.2,55l0.034-0.032V55h23.764L59,53.033V33.064L57.03,31z M48.431,45.666l-1.797,1.766l-2.702-2.667l-2.698,2.667
-	l-1.801-1.766l2.702-2.668l-2.702-2.666l1.801-1.766l2.698,2.665l2.702-2.665l1.797,1.798l-2.695,2.634L48.431,45.666z"/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__enter__icon.svg b/src/data/images/android/svg/twelvekeys__function__enter__icon.svg
deleted file mode 100644
index 0c93169..0000000
--- a/src/data/images/android/svg/twelvekeys__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_9_" style="fill:#DDDDDD;" points="49.026,28.419 49.026,41.398 46.99,43.5 38.148,43.5 
-	38.148,37.595 36.647,37.595 23,47.471 23,47.872 36.846,57.581 38.148,57.581 38.148,51.542 55.031,51.542 57,49.44 57,28.419 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__kana__icon.svg b/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
index 74a3136..46d50a4 100644
--- a/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,18 +29,17 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 68 x 56 -->
+  <g transform="matrix(0.78,0,0,0.78,7.48,6.16)">
+    <path id="style-keyicon-twelvekeys-function" opacity="0.80000299" d="m22.730855,25.555342c-1.826825,0-3.782625,0.262762-5.866438,0.782512v5.083925l-0.587125,6.453563c2.60645-3.129088,4.757638-7.235113,6.453563-12.32m-9.3863,15.05735c-0.391738-2.214713-0.587125-5.407325-0.587125-9.581687v-3.324476c-5.4756625,2.737351-8.2130125,6.257213-8.2130125,10.559588,0,1.173287,0.421575,2.249362,1.2714625,3.227263,0.8460375,0.9779,1.7257625,1.465887,2.639175,1.465887,1.4331625,0,3.061713-0.78155,4.8895-2.346575m8.017625,8.409362c-0.391738-1.436049-0.913412-2.869212-1.565025-4.302375,10.297788-0.65065,15.449087-3.910637,15.449087-9.778037,0-4.429425-2.804724-7.363125-8.4084-8.799175-2.478437,7.170625-5.475662,12.4509-8.995525,15.839862-3.519862,3.39185-6.780812,5.083925-9.778037,5.083925-2.0867,0-3.8808-0.815237-5.3774875-2.44475-1.5005375-1.62855-2.2493625-3.681562-2.2493625-6.159999,0-6.776001,4.1069875-11.797363,12.32-15.057351,0-2.346575,0.06449-4.56225,0.195387-6.64895h-10.559587v-4.302374c1.5640625,0.263725,3.71525,0.391737,6.4535625,0.391737,1.3012995,0,2.8018375-0.06449,4.4977625-0.195387,0-0.910525,0.195387-2.8028005,0.586162-5.6710505l4.302375,0.1953875-0.587125,5.279313,18.382788-0.390776,0.195387,4.106988-18.96895,0.586162c-0.1309,1.173288-0.195387,2.9337-0.195387,5.280275,1.823937-0.390775,3.519862-0.587125,5.083925-0.587125,0.260837,0,0.847,0.06834,1.760412,0.19635,0.128013-0.51975,0.259875-1.3013,0.390775-2.347537l4.302375,0.9779c0,0.263725-0.195387,0.913412-0.586162,1.9558,7.95025,1.9558,11.928262,6.258175,11.928262,12.907125,0,3.650762-1.368675,6.61815-4.106025,8.89735-2.738312,2.280163-7.562362,3.9424-14.471187,4.986712" fill-rule="nonzero" fill="#000"/>
+    <path id="style-keyicon-function-dark" opacity="0.5" d="m54.6385,41.755662c2.266688,0,3.802838-0.567875,5.462188-1.642988,1.65935-1.076075,2.497687-2.523675,3.088662-4.21575l0.0068-4.375525-6.111875-0.01251c-2.39855,0-3.952987,0.232925-5.512237,1.37445-1.561175,1.141526-2.197388,2.388926-2.197388,3.998226,0,1.511125,0.416763,2.580462,1.411025,3.49965,0.9933,0.92015,2.111725,1.37445,3.852888,1.37445m9.423799,2.520787c-0.191538-0.836412-0.364788-1.344612-0.501463-2.0097-0.139562-0.678562-0.197312-1.226225-0.197312-1.9327-0.92015,1.445675-1.849925,2.099213-3.509275,3.042463-1.65935,0.944212-3.564138,1.4168-5.715325,1.4168-2.612225,0-4.636363-0.693-6.073375-2.081888-1.437013-1.386962-2.156-3.2725-2.156-5.653725s1.04335-4.472738,3.129087-5.950175c2.085738-1.4784,4.796138-2.2176,8.130238-2.2176h6.038725l-0.01829-3.013588c0-1.90575-0.453337-3.16855-1.660312-4.252325-1.207938-1.083775-2.34465-1.514975-4.356275-1.52845-1.81335-0.01251-3.296563,0.264688-4.536263,1.250288-1.240662,0.984637-2.037612,2.114612-2.037612,3.609375l-3.258063,0.01444,0.0038-0.162662c-0.09914-2.002963,0.679525-3.764338,2.4948-5.284125,1.814313-1.518825,4.339913-2.2792,7.263988-2.2792,2.923112,0,5.271612,0.747862,7.0455,2.242625,1.773887,1.4938,2.522712,3.49965,2.522712,6.291862l-0.0038,13.105401c0,0.936512,0.195388,1.869175,0.302225,2.7566,0.106838,0.886462,0.345538,1.766187,0.591938,2.636287h-3.49965z" fill-rule="nonzero" fill="#000"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__kana__popup.svg b/src/data/images/android/svg/twelvekeys__function__kana__popup.svg
deleted file mode 100644
index 92c34bd..0000000
--- a/src/data/images/android/svg/twelvekeys__function__kana__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg b/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
index 33320d9..07eacad 100644
--- a/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,15 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_8_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="32.101,42.245 
-	46.731,32.762 48,33.931 48,52.035 46.798,53.238 32,43.684 "/>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns="http://www.w3.org/2000/svg"
+     version="1.1"
+     width="68"
+     height="56">
+  <!--  Original: translate(-16,-15) -->
+  <g transform="matrix(0.984375,0,0,0.984375,-5.2,-14.2)">
+    <polygon id="style-keyicon-twelvekeys-function" points="48,52.035 46.798,53.238 32,43.684 32.101,42.245 46.731,32.762 48,33.931" fill="#DDD" fill-rule="evenodd"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg b/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg
deleted file mode 100644
index dda085e..0000000
--- a/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="32.101,42.245 
-	46.731,32.762 48,33.931 48,52.035 46.798,53.238 32,43.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__number__icon.svg b/src/data/images/android/svg/twelvekeys__function__number__icon.svg
deleted file mode 100644
index 95e9006..0000000
--- a/src/data/images/android/svg/twelvekeys__function__number__icon.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_number_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-dark_2_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_3_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__number__popup.svg b/src/data/images/android/svg/twelvekeys__function__number__popup.svg
deleted file mode 100644
index 4c81992..0000000
--- a/src/data/images/android/svg/twelvekeys__function__number__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_number_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-popup-function-dark_2_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark_3_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg b/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
index 3d9061b..0839c84 100644
--- a/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,16 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_7_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.9,42.245 
-	33.269,32.762 32,33.931 32,52.035 33.202,53.238 48,43.684 "/>
+<!-- 10% width key on qwerty keyboard. -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns="http://www.w3.org/2000/svg"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original: transform="translate(-16,-15) -->
+  <g transform="matrix(0.984375,0,0,0.984375,-5.2,-14.2)">
+    <polygon id="style-keyicon-twelvekeys-function" points="32,52.035 33.202,53.238 48,43.684 47.9,42.245 33.269,32.762 32,33.931" fill="#DDD" fill-rule="evenodd"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg b/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg
deleted file mode 100644
index 3b7833f..0000000
--- a/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.9,42.245 
-	33.269,32.762 32,33.931 32,52.035 33.202,53.238 48,43.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__space__icon.svg b/src/data/images/android/svg/twelvekeys__function__space__icon.svg
index e1a2914..0631d4a 100644
--- a/src/data/images/android/svg/twelvekeys__function__space__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__space__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,10 +30,15 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_6_" style="fill:#DDDDDD;" points="51.633,43 51.633,50.266 28.366,50.266 28.366,43 23.5,43 
-	23.5,55.002 56.5,55.002 56.5,43 "/>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 51.5 x 13.773256 -->
+  <g transform="matrix(0.985437,0,0,0.985437,8.625,21.2137)">
+    <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m47.906977,0,0,9.581395-44.313954,0v-9.581395h-3.593023v13.773256h51.5v-13.773256h-3.593023z"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg b/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
index cfcdccb..87a6e0b 100644
--- a/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,21 +29,22 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function_3_">
-	<circle style="fill:#DDDDDD;" cx="34.54" cy="29.736" r="2.21"/>
-	<circle style="fill:#DDDDDD;" cx="45.31" cy="29.736" r="2.21"/>
-	<path style="fill:#DDDDDD;" d=""/>
-	<g>
-		<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
-	</g>
-</g>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <text id="style-keyicon-twelvekeys-function_0" x="26.7228" y="28" style="font-size:30px;dominant-baseline:central">1</text>
+  <text id="style-keyicon-twelvekeys-function_1" x="38.1754" y="28" style="font-size:30px;dominant-baseline:central">2</text>
+  <text id="style-keyicon-twelvekeys-function_2" x="53.1000" y="28" style="font-size:30px;dominant-baseline:central">3</text>
+  <!-- Original size: 114 x 80 -->
+  <g id="style-keyicon-twelvekeys-function_3" transform="matrix(0.597,0,0,0.597,0,4.14035)" fill-rule="nonzero" fill="#37474f">
+    <path d="m24.9,58.967776c-10.459333,0-18.9672032-8.509016-18.9672032-18.967203,0-10.459333,8.5078702-18.968349,18.9672032-18.968349s18.967203,8.509016,18.967203,18.968349c0,10.458187-8.50787,18.967203-18.967203,18.967203m0-42.466059c-12.958212,0-23.5000006,10.540644-23.5000006,23.498856,0,12.957066,10.5417886,23.49771,23.5000006,23.49771s23.500001-10.540644,23.500001-23.49771c0-12.958212-10.541789-23.498856-23.500001-23.498856"/>
+    <path d="m16.354451,37.583921c1.975512,0,3.57768-1.601023,3.57768-3.57768,0-1.975512-1.602168-3.576536-3.57768-3.576536s-3.57768,1.601024-3.57768,3.576536c0,1.976657,1.602168,3.57768,3.57768,3.57768"/>
+    <path d="m33.445434,30.429591c-1.975512,0-3.57768,1.601023-3.57768,3.57768,0,1.975512,1.602168,3.576536,3.57768,3.576536s3.57768-1.601024,3.57768-3.576536c0-1.976657-1.602168-3.57768-3.57768-3.57768"/>
+    <path d="m24.9,53.035286c8.968251,0,11.898879-8.247905,11.898879-8.247905h-23.797758s2.930628,8.247905,11.898879,8.247905"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__undo__icon.svg b/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
index f6af645..15a45b1 100644
--- a/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -29,15 +29,16 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_icon"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_5_" style="fill:#DDDDDD;" points="51.661,42.086 51.661,35.813 49.827,33.912 33.844,33.912 
-	33.844,38.35 32.542,39.251 23,32.143 23,30.875 32.676,24.869 33.844,25.803 33.844,29.407 55.232,29.407 57,31.309 57,42.086 "/>
-<g id="style-keyicon-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     version="1.1"
+     width="68"
+     height="56">
+  <!-- Original size: 45 x 21.778248 matrix(0.7142517,0,0,-0.7142517,42.2737011,21.77824647) -->
+  <g fill="#000" transform="matrix(0.753656,0,0,-0.753656,54.8647,39.4899)">
+    <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m0,0,0,13.337-38.133,0,0-13.337-21.053,15.245,21.053,15.246,0-13.345,41.95,0v-17.146h-3.817z"/>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__undo__popup.svg b/src/data/images/android/svg/twelvekeys__function__undo__popup.svg
deleted file mode 100644
index 7b233ee..0000000
--- a/src/data/images/android/svg/twelvekeys__function__undo__popup.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_popup"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
-	 viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_4_" style="fill:#DDDDDD;" points="51.661,42.086 51.661,35.813 49.827,33.912 
-	33.844,33.912 33.844,38.35 32.542,39.251 23,32.143 23,30.875 32.676,24.869 33.844,25.803 33.844,29.407 55.232,29.407 57,31.309 
-	57,42.086 "/>
-<g id="style-keyicon-popup-function">
-	<path style="fill:#DDDDDD;" d=""/>
-	<path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__10.svg b/src/data/images/android/svg/twelvekeys__kana__10.svg
index 27b275f..39e3ac1 100644
--- a/src/data/images/android/svg/twelvekeys__kana__10.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,27 +30,22 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_10"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
+<svg version="1.1" id="twelvekeys_kana_10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,24.998 27.499,24.998 27.499,41.998 44.499,41.998 44.499,33.498 "/>
 <g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
+  <text x="32.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
 </g>
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="31.999,24.998 
-	26.999,24.998 26.999,41.998 43.999,41.998 43.999,33.498 "/>
-<polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42 
-	77,33.5 "/>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42 77,33.5 "/>
 <g id="style-keyicon-main_2_">
-	<path style="fill:#272727;" d=""/>
+  <text x="62.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
 </g>
 <g id="style-keyicon-main_3_">
-	<path style="fill:#272727;" d=""/>
+  <text x="35" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
 </g>
 <g id="style-keyicon-main_4_">
-	<path style="fill:#272727;" d=""/>
+  <text x="52.5" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
+<g id="style-keyicon-main_5_">
+  <text x="70" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
 </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg
deleted file mode 100644
index bd8840b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg
deleted file mode 100644
index bd8840b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__10.svg b/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
index 80ad650..85a5675 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,27 +30,19 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_10"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="27,28 18,28 18,52 42,52 
-	42,39 "/>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="77,28 68,28 68,52 92,52 
-	92,39 "/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="112px"
+     height="112px">
+  <!-- Original size: 105 x 87 -->
+  <g transform="matrix(1.42,0,0,1.42,-18.55,-5.77)">
+    <polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,24.998 27.499,24.998 27.499,41.998 44.499,41.998 44.499,33.498 "/>
+    <text id="style-keyicon-main_1_" x="32.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
+    <polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42 77,33.5 "/>
+    <text id="style-keyicon-main_2_" x="62.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
+    <text id="style-keyicon-main_3_" x="35" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
+    <text id="style-keyicon-main_4_" x="52.5" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+    <text id="style-keyicon-main_5_" x="70" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
+  </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg b/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
index bdf4fb1..6e81988 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,13 +30,11 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_semi_x5F_voiced_x5F_mark"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="46,32 32,32 32,80 80,80 
-	80,56 "/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="112px"
+     height="112px">
+  <polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="56,34 34,34 34,78 78,78 78,56 "/>
+  <text id="style-keyicon-main" x="53" y="62" style="font-size:90px;text-anchor:middle;dominant-baseline:central;">゜</text>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__small.svg b/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
index 21499e1..5d7d6aa 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,12 +30,9 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_small"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<svg version="1.1" id="twelvekeys_kana_popup_small" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
 <rect id="style-keyicon-bound" x="36" y="36" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" width="40" height="40"/>
 <g id="style-keyicon-main_1_">
-	<path d=""/>
+  <text x="56" y="56" style="font-size:36px;text-anchor:middle;dominant-baseline:central;">小</text>
 </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg b/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
index 87b8647..bb8ff39 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,13 +30,11 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_voiced_x5F_mark"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
-	 viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="46,32 32,32 32,80 80,80 
-	80,56 "/>
-<g id="style-keyicon-main">
-	<path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="112px"
+     height="112px">
+  <polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="56,34 34,34 34,78 78,78 78,56 "/>
+  <text id="style-keyicon-main" x="53" y="62" style="font-size:90px;text-anchor:middle;dominant-baseline:central;">゛</text>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__simple__12.svg b/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
index 0d1b5c8..49b6e9d 100644
--- a/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--
  Copyright 2010-2014, Google Inc.
  All rights reserved.
@@ -30,14 +30,17 @@
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_simple_x5F__x5F_12"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<svg version="1.1" id="twelvekeys_kana_simple_12" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
 <g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
+    <text x="32.5" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">、</text>
+</g>
+<g id="style-keyicon-main">
+    <text x="50" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">。</text>
+</g>
+<g id="style-keyicon-main">
+    <text x="60" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">?</text>
+</g>
+<g id="style-keyicon-main">
+    <text x="80" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">!</text>
 </g>
 </svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg
deleted file mode 100644
index 641c53f..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg
deleted file mode 100644
index a4378b8..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg
deleted file mode 100644
index 8703c3f..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg
deleted file mode 100644
index f724ea9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg
deleted file mode 100644
index 576f5f4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg
deleted file mode 100644
index 6595329..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg
deleted file mode 100644
index 34b65cc..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg
deleted file mode 100644
index ef55df9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg
deleted file mode 100644
index c4bbe4e..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg
deleted file mode 100644
index b98b75b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg
deleted file mode 100644
index 5940d34..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""
-		/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg
deleted file mode 100644
index 0e11fd7..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg
deleted file mode 100644
index e850d07..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg
deleted file mode 100644
index 16d9808..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg
deleted file mode 100644
index f65000c..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg
deleted file mode 100644
index 4370cd9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg
deleted file mode 100644
index 3854f2e..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg
deleted file mode 100644
index 10b7967..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-</g>
-<g id="style-keyicon-guide_7_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg
deleted file mode 100644
index 19491e3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg
deleted file mode 100644
index 7a59237..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg
deleted file mode 100644
index 08b03d3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_center"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
-	60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 
-	30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg
new file mode 100644
index 0000000..5ddff9e
--- /dev/null
+++ b/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
+	60.5,33.5 60.5,50.5 52,50.5 "/>
+<g id="style-keyicon-main_1_">
+  <text x="52.5" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">、</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 
+	30.5,33.5 30.5,50.5 22,50.5 "/>
+<g id="style-keyicon-main_2_">
+  <text x="20" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">。</text>
+</g>
+<g id="style-keyicon-main_3_">
+  <text x="52.5" y="14.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">?</text>
+</g>
+<g id="style-keyicon-main_4_">
+  <text x="85" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">!</text>
+</g>
+<g id="style-keyicon-guide-highlight_5_">
+  <text x="52.5" y="72.5" style="font-size:18px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">…</text>
+</g>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg
deleted file mode 100644
index 470ec95..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_left"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight_1_">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
-	60.5,33.5 60.5,50.5 52,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg
deleted file mode 100644
index ef13fc2..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_release"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_10_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
-	60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_9_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 
-	30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg
deleted file mode 100644
index 2d29c81..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_right"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_8_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
-	60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_7_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 
-	30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg
deleted file mode 100644
index 2bd1794..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_up"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
-	<path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
-	<path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_6_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 
-	60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_5_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 
-	30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg
deleted file mode 100644
index 1780b39..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""
-		/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg
deleted file mode 100644
index 1f9b193..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""
-		/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""
-		/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg
deleted file mode 100644
index 7e3ecf3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__01.svg b/src/data/images/android/svg/twelvekeys__number__01.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__01.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__02.svg b/src/data/images/android/svg/twelvekeys__number__02.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__02.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__03.svg b/src/data/images/android/svg/twelvekeys__number__03.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__03.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__04.svg b/src/data/images/android/svg/twelvekeys__number__04.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__04.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__05.svg b/src/data/images/android/svg/twelvekeys__number__05.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__05.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__06.svg b/src/data/images/android/svg/twelvekeys__number__06.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__06.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__07.svg b/src/data/images/android/svg/twelvekeys__number__07.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__07.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__08.svg b/src/data/images/android/svg/twelvekeys__number__08.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__08.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__09.svg b/src/data/images/android/svg/twelvekeys__number__09.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__09.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__10.svg b/src/data/images/android/svg/twelvekeys__number__10.svg
deleted file mode 100644
index e567969..0000000
--- a/src/data/images/android/svg/twelvekeys__number__10.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_number_x5F__x5F_10"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__11.svg b/src/data/images/android/svg/twelvekeys__number__11.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__11.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__12.svg b/src/data/images/android/svg/twelvekeys__number__12.svg
deleted file mode 100644
index 066efc3..0000000
--- a/src/data/images/android/svg/twelvekeys__number__12.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_number_x5F__x5F_12"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
-	 viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_2_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
-	<path style="fill:#272727;" d=""/>
-	<path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg b/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-     * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
-     * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
-	<path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
-	<path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/template/godan__kana__support__12__template.svg b/src/data/images/android/template/godan__kana__support__12__template.svg
new file mode 100644
index 0000000..d1b85d2
--- /dev/null
+++ b/src/data/images/android/template/godan__kana__support__12__template.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="65px" height="50px" viewBox="0 0 65 50" style="enable-background:new 0 0 65 50;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}_1_">
+  <text x="32.5" y="24.5" style="font-size:28px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="9.25,24.5 9.25,20 18.25,20 18.25,29 13.75,29 "/>
+<g id="style-keyicon-guide{id_suffix_left}_2_">
+  <text x="13" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_up}_3_">
+  <text x="32.5" y="7" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_right}_4_">
+  <text x="51" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+</g>
+<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="27.75,42.834 27.75,38.334 36.75,38.334 36.75,47.334 32.25,47.334 "/>
+<g id="style-keyicon-guide{id_suffix_down}_5_">
+  <text x="31.5" y="43" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/godan__kana__support__template.svg b/src/data/images/android/template/godan__kana__support__template.svg
new file mode 100644
index 0000000..50285f1
--- /dev/null
+++ b/src/data/images/android/template/godan__kana__support__template.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="65px" height="50px" style="enable-background:new 0 0 65 50;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}_1_">
+  <text x="32.5" y="24.5" style="font-size:28px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_left}_2_">
+  <text x="12" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_up}_3_">
+  <text x="32.5" y="7" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_right}_4_">
+  <text x="53" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_down}_5_">
+  <text x="32.5" y="43" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/qwerty__keyicon__template.svg b/src/data/images/android/template/qwerty__keyicon__template.svg
new file mode 100644
index 0000000..a83cf34
--- /dev/null
+++ b/src/data/images/android/template/qwerty__keyicon__template.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!--
+     NOTE: - '中' must be located at the center. Otherwise popup will broken.
+           - qwerty_keyicon_template and qwerty_popup_template must be the same in their size.
+-->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="56" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+<g>
+  <text id="style-keyicon-guide" x="43.5" y="6.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#272727;">副</text>
+  <text id="style-keyicon-main" x="24" y="28" style="font-size:39.5px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/qwerty__popup__template.svg b/src/data/images/android/template/qwerty__popup__template.svg
new file mode 100644
index 0000000..f2ae3d2
--- /dev/null
+++ b/src/data/images/android/template/qwerty__popup__template.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!--
+     NOTE: '中' must be located at the center. Otherwise popup will broken.
+-->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xml:space="preserve"
+     version="1.1"
+     width="48"
+     height="56">
+  <text id="style-keyicon-main" x="24" y="26" style="font-size:39.5px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</svg>
diff --git a/src/data/images/android/template/support__popup__template.svg b/src/data/images/android/template/support__popup__template.svg
new file mode 100644
index 0000000..7056362
--- /dev/null
+++ b/src/data/images/android/template/support__popup__template.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xml:space="preserve"
+     width="112px"
+     height="112px">
+  <circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="27"/>
+  <text id="style-keyicon-main_1_" x="56" y="56" style="font-size:48px;text-anchor:middle;dominant-baseline:central;">中</text>
+  <text id="style-keyicon-main_2_" x="15" y="56" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">左</text>
+  <text id="style-keyicon-main_3_" x="56" y="15" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">上</text>
+  <text id="style-keyicon-main_4_" x="97" y="56" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">右</text>
+  <text id="style-keyicon-main_5_" x="56" y="97" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">下</text>
+</svg>
diff --git a/src/data/images/android/template/transform.py b/src/data/images/android/template/transform.py
new file mode 100644
index 0000000..1cfb7ff
--- /dev/null
+++ b/src/data/images/android/template/transform.py
@@ -0,0 +1,718 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Generates svg files from templates.
+
+Usage:
+$ mkdir OUTPUT_PATH
+$ python transform.py --output_dir=OUTPUT_PATH
+
+Note:
+We use half-width characters for following to adjust the position
+on software keyboards.
+See also: b/16722519
+
+"(", ")", "!", "?", ":"
+
+Half-width is also used for "/" for better look.
+"""
+
+import logging
+import optparse
+import os
+import tempfile
+import zipfile
+
+
+ABS_SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
+
+_REPLACE_CHAR = '中'
+_REPLACE_CHAR_QWERTY_SUPPORT = '副'
+
+_REPLACE_CHARS = ('中', '左', '上', '右', '下')
+
+_REPLACE_ID_SUFFIXEX = (
+    '{id_suffix_center}', '{id_suffix_left}', '{id_suffix_up}',
+    '{id_suffix_right}', '{id_suffix_down}')
+
+_EXPAND_SUPPORT_SUFFIXES = (
+    'center', 'left', 'up', 'right', 'down', 'release')
+
+_GODAN_KANA_SUPPORT_KEY_DEFINITIONS = [
+    {'name': '01',
+     'chars': ('A', '', '', '', '1'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '02',
+     'chars': ('K', '', 'Q', 'G', '2'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '03',
+     'chars': ('H', 'P', 'F', 'B', '3'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '04',
+     'chars': ('I', '', '', '', '4'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '05',
+     'chars': ('S', '', 'J', 'Z', '5'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '06',
+     'chars': ('M', '/', 'L', 'ー', '6'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '07',
+     'chars': ('U', '', '', '', '7'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '08',
+     'chars': ('T', '', 'C', 'D', '8'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '09',
+     'chars': ('Y', '(', 'X', ')', '9'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '10',
+     'chars': ('E', '', '', '', ''),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    {'name': '11',
+     'chars': ('N', ':', '', '・', '0'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    # 12: Needs another template. Defined bellow
+    {'name': '13',
+     'chars': ('O', '', '', '', ''),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    # 14: "大小" key(godan__kana__14.svg): Will be modified directly
+    {'name': '15',
+     'chars': ('W', '「', 'V', '」', ''),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    ]
+
+_GODAN_KANA_SUPPORT_12_KEY_DEFINITION = [
+    {'name': '12',
+     'chars': ('R', '。', '?', '!', '、'),
+     'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+    ]
+
+_GODAN_KANA_SUPPORT_POPUP_KEY_DEFINITIONS = [
+    {'name': '01', 'chars': ('A', '', '', '', '1')},
+    {'name': '02', 'chars': ('K', '', 'Q', 'G', '2')},
+    {'name': '03', 'chars': ('H', 'P', 'F', 'B', '3')},
+    {'name': '04', 'chars': ('I', '', '', '', '4')},
+    {'name': '05', 'chars': ('S', '', 'J', 'Z', '5')},
+    {'name': '06', 'chars': ('M', '/', 'L', 'ー', '6')},
+    {'name': '07', 'chars': ('U', '', '', '', '7')},
+    {'name': '08', 'chars': ('T', '', 'C', 'D', '8')},
+    {'name': '09', 'chars': ('Y', '(', 'X', ')', '9')},
+    {'name': '10', 'chars': ('E', '', '', '', '')},
+    # Use half-width ':' to adjust character position.
+    {'name': '11', 'chars': ('N', ':', 'ん', '・', '0')},
+    {'name': '12', 'chars': ('R', '。', '?', '!', '、')},
+    {'name': '13', 'chars': ('O', '', '', '', '')},
+    # 14: "大小" key: godan__kana__14.svg will be used.
+    # Please check mozc/android/resources/res/xml/
+    {'name': '15', 'chars': ('W', '「', 'V', '」', '')},
+    ]
+
+_QWERTY_SUPPORT_KEY_MAPPING = {
+    'q': '1',
+    'w': '2',
+    'e': '3',
+    'r': '4',
+    't': '5',
+    'y': '6',
+    'u': '7',
+    'i': '8',
+    'o': '9',
+    'p': '0',
+}
+
+# 'A'-'Z' will be generated by GenerateQwertyAlphabetKeyDefinitions().
+_QWERTY_KEYICON_KEY_DEFINITIONS = [
+    {'name': 'digit_zero', 'char': '0'},
+    {'name': 'digit_one', 'char': '1'},
+    {'name': 'digit_two', 'char': '2'},
+    {'name': 'digit_three', 'char': '3'},
+    {'name': 'digit_four', 'char': '4'},
+    {'name': 'digit_five', 'char': '5'},
+    {'name': 'digit_six', 'char': '6'},
+    {'name': 'digit_seven', 'char': '7'},
+    {'name': 'digit_eight', 'char': '8'},
+    {'name': 'digit_nine', 'char': '9'},
+
+    {'name': 'ampersand', 'char': '&amp;'},
+    {'name': 'apostrophe', 'char': '&apos;'},
+    {'name': 'asterisk', 'char': '*'},
+    {'name': 'circumflex_accent', 'char': '^'},
+    {'name': 'colon', 'char': ':'},
+    {'name': 'comma', 'char': ','},
+    {'name': 'commercial_at', 'char': '@'},
+    {'name': 'dollar_sign', 'char': '$'},
+    {'name': 'equals_sign', 'char': '='},
+    {'name': 'exclamation_mark', 'char': '!'},
+    {'name': 'full_stop', 'char': '.'},
+    {'name': 'grave_accent', 'char': '`'},
+    {'name': 'less_than_sign', 'char': '&lt;'},
+    {'name': 'greater_than_sign', 'char': '&gt;'},
+    {'name': 'hyphen_minus', 'char': '-'},
+    {'name': 'ideographic_comma', 'char': '、'},
+    {'name': 'ideographic_full_stop', 'char': '。'},
+    {'name': 'katakana_middle_dot', 'char': '・'},
+    {'name': 'left_corner_bracket', 'char': '「'},
+    {'name': 'right_corner_bracket', 'char': '」'},
+    {'name': 'left_curly_bracket', 'char': '{'},
+    {'name': 'right_curly_bracket', 'char': '}'},
+    {'name': 'left_parenthesis', 'char': '('},
+    {'name': 'right_parenthesis', 'char': ')'},
+    {'name': 'left_square_bracket', 'char': '['},
+    {'name': 'right_square_bracket', 'char': ']'},
+    {'name': 'low_line', 'char': '_'},
+    {'name': 'minus_sign', 'char': '−'},
+    {'name': 'number_sign', 'char': '#'},
+    {'name': 'percent_sign', 'char': '%'},
+    {'name': 'plus_sign', 'char': '+'},
+    {'name': 'question_mark', 'char': '?'},
+    {'name': 'quotation_mark', 'char': '&quot;'},
+    {'name': 'reverse_solidus', 'char': '\\'},
+    {'name': 'semicolon', 'char': ';'},
+    {'name': 'solidus', 'char': '/'},
+    {'name': 'tilde', 'char': '~'},
+    {'name': 'vertical_line', 'char': '|'},
+
+    # Use half-width ':' to adjust character position.
+    {'name': 'fullwidth_colon', 'char': ':'},
+
+    # Use half-width '/' for a better look.
+    # TODO(team): This rule generates qwerty__keyicon__fullwidth__solidus but
+    # currently it's used only by GODAN.  Rename it.
+    {'name': 'fullwidth_solidus', 'char': '/'},
+    ]
+
+_TWELVEKEYS_ALPHABET_KEY_DEFINITIONS = [
+    # 01, 11 and 12 have spaces among their characters.
+    # Without them shown characters are too close.
+    {'name': '01', 'char': '@ - _ /'},
+    {'name': '02', 'char': 'ABC'},
+    {'name': '03', 'char': 'DEF'},
+    {'name': '04', 'char': 'GHI'},
+    {'name': '05', 'char': 'JKL'},
+    {'name': '06', 'char': 'MNO'},
+    {'name': '07', 'char': 'PQRS'},
+    {'name': '08', 'char': 'TUV'},
+    {'name': '09', 'char': 'WXYZ'},
+    # 10: "a-A" key. Will be modified directly.
+    {'name': '11', 'char': '\' " : ;'},
+    {'name': '12', 'char': '. , ? !'},
+    ]
+
+_TWELVEKEYS_ALPHABET_SUPPORT_KEY_DEFINITIONS = [
+    # 01, 11 and 12 have spaces among their characters.
+    # Without them shown characters are too close.
+    {'name': '01', 'chars': ('@ - _ /', '', '', '', '1')},
+    {'name': '02', 'chars': ('ABC', '', '', '', '2')},
+    {'name': '03', 'chars': ('DEF', '', '', '', '3')},
+    {'name': '04', 'chars': ('GHI', '', '', '', '4')},
+    {'name': '05', 'chars': ('JKL', '', '', '', '5')},
+    {'name': '06', 'chars': ('MNO', '', '', '', '6')},
+    {'name': '07', 'chars': ('PQRS', '', '', '', '7')},
+    {'name': '08', 'chars': ('TUV', '', '', '', '8')},
+    {'name': '09', 'chars': ('WXYZ', '', '', '', '9')},
+    # 10: "a-A" key. Will be modified directly.
+    {'name': '11', 'chars': ('\' " : ;', '', '', '', '0')},
+    {'name': '12', 'chars': ('. , ? !', '', '', '', '')},
+    ]
+
+_TWELVEKEYS_ALPHABET_SUPPORT_POPUP_KEY_DEFINITIONS = [
+    {'name': '01', 'chars': ('@', '-', '_', '/', '1')},
+    {'name': '02', 'chars': ('A', 'B', 'C', '', '2')},
+    {'name': '03', 'chars': ('D', 'E', 'F', '', '3')},
+    {'name': '04', 'chars': ('G', 'H', 'I', '', '4')},
+    {'name': '05', 'chars': ('J', 'K', 'L', '', '5')},
+    {'name': '06', 'chars': ('M', 'N', 'O', '', '6')},
+    {'name': '07', 'chars': ('P', 'Q', 'R', 'S', '7')},
+    {'name': '08', 'chars': ('T', 'U', 'V', '', '8')},
+    {'name': '09', 'chars': ('W', 'X', 'Y', 'Z', '9')},
+    # 10: "a-A" key: twelvekeys__alphabet__10.svg will be used.
+    # Please check mozc/android/resources/res/xml/
+    {'name': '11', 'chars': ('&apos;', '&quot;', ':', ';', '0')},
+    {'name': '12', 'chars': ('.', ',', '?', '!', '')},
+    ]
+
+_TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS = [
+    {'name': 'exclamation_mark', 'char': '!'},
+    {'name': 'ideographic_period', 'char': '。'},
+    {'name': 'left_parenthesis', 'char': '('},
+    {'name': 'prolonged_sound_mark', 'char': 'ー'},
+    {'name': 'question_mark', 'char': '?'},
+    {'name': 'right_parenthesis', 'char': ')'},
+    {'name': 'horizontal_ellipsis', 'char': '…'},
+    {'name': 'wave_dash', 'char': '〜'},
+
+    {'name': 'a', 'char': 'あ'},
+    {'name': 'i', 'char': 'い'},
+    {'name': 'u', 'char': 'う'},
+    {'name': 'e', 'char': 'え'},
+    {'name': 'o', 'char': 'お'},
+    {'name': 'an', 'char': 'あん'},
+    {'name': 'in', 'char': 'いん'},
+    {'name': 'un', 'char': 'うん'},
+    {'name': 'en', 'char': 'えん'},
+    {'name': 'on', 'char': 'おん'},
+    {'name': 'axtu', 'char': 'あっ'},
+    {'name': 'ixtu', 'char': 'いっ'},
+    {'name': 'uxtu', 'char': 'うっ'},
+    {'name': 'extu', 'char': 'えっ'},
+    {'name': 'oxtu', 'char': 'おっ'},
+    {'name': 'xi', 'char': 'ぃ'},
+    {'name': 'xe', 'char': 'ぇ'},
+
+    {'name': 'ka', 'char': 'か'},
+    {'name': 'ki', 'char': 'き'},
+    {'name': 'ku', 'char': 'く'},
+    {'name': 'ke', 'char': 'け'},
+    {'name': 'ko', 'char': 'こ'},
+
+    {'name': 'sa', 'char': 'さ'},
+    {'name': 'shi', 'char': 'し'},
+    {'name': 'su', 'char': 'す'},
+    {'name': 'se', 'char': 'せ'},
+    {'name': 'so', 'char': 'そ'},
+
+    {'name': 'ta', 'char': 'た'},
+    {'name': 'chi', 'char': 'ち'},
+    {'name': 'tsu', 'char': 'つ'},
+    {'name': 'te', 'char': 'て'},
+    {'name': 'to', 'char': 'と'},
+
+    {'name': 'na', 'char': 'な'},
+    {'name': 'ni', 'char': 'に'},
+    {'name': 'nu', 'char': 'ぬ'},
+    {'name': 'ne', 'char': 'ね'},
+    {'name': 'no', 'char': 'の'},
+
+    {'name': 'ha', 'char': 'は'},
+    {'name': 'hi', 'char': 'ひ'},
+    {'name': 'fu', 'char': 'ふ'},
+    {'name': 'he', 'char': 'へ'},
+    {'name': 'ho', 'char': 'ほ'},
+
+    {'name': 'ma', 'char': 'ま'},
+    {'name': 'mi', 'char': 'み'},
+    {'name': 'mu', 'char': 'む'},
+    {'name': 'me', 'char': 'め'},
+    {'name': 'mo', 'char': 'も'},
+
+    {'name': 'ya', 'char': 'や'},
+    {'name': 'yu', 'char': 'ゆ'},
+    {'name': 'yo', 'char': 'よ'},
+    {'name': 'xya', 'char': 'ゃ'},
+    {'name': 'xyu', 'char': 'ゅ'},
+    {'name': 'xyo', 'char': 'ょ'},
+
+    {'name': 'ra', 'char': 'ら'},
+    {'name': 'ri', 'char': 'り'},
+    {'name': 'ru', 'char': 'る'},
+    {'name': 're', 'char': 'れ'},
+    {'name': 'ro', 'char': 'ろ'},
+
+    {'name': 'wa', 'char': 'わ'},
+    {'name': 'wo', 'char': 'を'},
+    {'name': 'nn', 'char': 'ん'},
+    ]
+
+_TWELVEKEYS_KANA_SUPPORT_KEY_DEFINITIONS = [
+    {'name': '01',
+     'chars': ('あ', 'い', 'う', 'え', 'お')},
+    {'name': '02',
+     'chars': ('か', 'き', 'く', 'け', 'こ')},
+    {'name': '03',
+     'chars': ('さ', 'し', 'す', 'せ', 'そ')},
+    {'name': '04',
+     'chars': ('た', 'ち', 'つ', 'て', 'と')},
+    {'name': '05',
+     'chars': ('な', 'に', 'ぬ', 'ね', 'の')},
+    {'name': '06',
+     'chars': ('は', 'ひ', 'ふ', 'へ', 'ほ')},
+    {'name': '07',
+     'chars': ('ま', 'み', 'む', 'め', 'も')},
+    {'name': '08',
+     'chars': ('や', '(', 'ゆ', ')', 'よ')},
+    {'name': '09',
+     'chars': ('ら', 'り', 'る', 'れ', 'ろ')},
+    # 10: "大小" key(twelvekeys__kana__10.svg): Will be modified directly
+    {'name': '11',
+     'chars': ('わ', 'を', 'ん', 'ー', '〜')},
+    # 12: Needs another template. Defined bellow.
+    ]
+
+_TWELVEKEYS_KANA_SUPPORT_12_KEY_DEFINITION = [
+    {'name': '12',
+     'chars': ('、', '。', '?', '!', '…')}
+    ]
+
+_TWELVEKEYS_KANA_SUPPORT_POPUP_KEY_DEFINITIONS = [
+    {'name': '01', 'chars': ('あ', 'い', 'う', 'え', 'お')},
+    {'name': '02', 'chars': ('か', 'き', 'く', 'け', 'こ')},
+    {'name': '03', 'chars': ('さ', 'し', 'す', 'せ', 'そ')},
+    {'name': '04', 'chars': ('た', 'ち', 'つ', 'て', 'と')},
+    {'name': '05', 'chars': ('な', 'に', 'ぬ', 'ね', 'の')},
+    {'name': '06', 'chars': ('は', 'ひ', 'ふ', 'へ', 'ほ')},
+    {'name': '07', 'chars': ('ま', 'み', 'む', 'め', 'も')},
+    {'name': '08', 'chars': ('や', '(', 'ゆ', ')', 'よ')},
+    {'name': '09', 'chars': ('ら', 'り', 'る', 'れ', 'ろ')},
+    # 10: "大小" key: twelvekeys__kana__10.svg will be used.
+    # Please check mozc/android/resources/res/xml/
+    {'name': '11', 'chars': ('わ', 'を', 'ん', 'ー', '〜')},
+    {'name': '12', 'chars': ('、', '。', '?', '!', '…')},
+    ]
+
+_TWELVEKEYS_NUMBER_KEY_DEFINITIONS = [
+    {'name': 'zero', 'char': '0'},
+    {'name': 'one', 'char': '1'},
+    {'name': 'two', 'char': '2'},
+    {'name': 'three', 'char': '3'},
+    {'name': 'four', 'char': '4'},
+    {'name': 'five', 'char': '5'},
+    {'name': 'six', 'char': '6'},
+    {'name': 'seven', 'char': '7'},
+    {'name': 'eight', 'char': '8'},
+    {'name': 'nine', 'char': '9'},
+    {'name': 'asterisk', 'char': '*'},
+    {'name': 'number_sign', 'char': '#'},
+    ]
+
+_TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS = [
+    {'name': 'comma', 'char': ','},
+    {'name': 'equals_sign', 'char': '='},
+    {'name': 'full_stop', 'char': '.'},
+    {'name': 'hyphen_minus', 'char': '-'},
+    {'name': 'plus_sign', 'char': '+'},
+    {'name': 'solidus', 'char': '/'},
+    ]
+
+_TWELVEKEYS_OTHER_POPUP_DEFINITIONS = [
+    # number keyboard
+    {'name': 'low_line', 'char': '_'},
+    {'name': 'quotation_mark', 'char': '"'},
+    {'name': 'colon', 'char': ':'},
+    {'name': 'semicolon', 'char': ';'},
+    # 12keys and godan keyboard
+    {'name': 'ideographic_comma', 'char': '、'},
+    {'name': 'ideographic_full_stop', 'char': '。'},
+    # godan keyboard
+    {'name': 'fullwidth_solidus', 'char': '/'},
+    {'name': 'fullwidth_colon', 'char': ':'},
+    {'name': 'katakana_middle_dot', 'char': '・'},
+    {'name': 'left_corner_bracket', 'char': '「'},
+    {'name': 'right_corner_bracket', 'char': '」'},
+    ]
+
+def GenerateQwertyAlphabetKeyDefinitions():
+  """Returns key definitions for qwerty alphabet keys."""
+  key_definitions = []
+  for i in range(ord('z') - ord('a') + 1):
+    small = chr(i + ord('a'))
+    capital = chr(i + ord('A'))
+    support = _QWERTY_SUPPORT_KEY_MAPPING.get(small, '')
+    key_definitions.append({
+        'name': 'latin_capital_letter_' + small,
+        'char': capital,
+        'support': support})
+    key_definitions.append({
+        'name': 'latin_small_letter_' + small,
+        'char': small,
+        'support': support})
+  return key_definitions
+
+
+def GenerateTwelvekeysAlphabetKeyDefinitions():
+  """Returns key definitions for qwerty alphabet keys."""
+  key_definitions = []
+  for i in range(ord('z') - ord('a') + 1):
+    small = chr(i + ord('a'))
+    capital = chr(i + ord('A'))
+    key_definitions.append({
+        'name': 'latin_' + small,
+        'char': capital})
+  return key_definitions
+
+
+def ExpandAndWriteSupportKeys(template_file, output_file_basename, output_dir,
+                              key_definition_list):
+  """Generates and writes keyicons for support keys from template.
+
+  We will expand keyicons for each flick directions.
+  For example, we will generate XX_center, XX_left, XX_up, XX_right, XX_down
+  adding to XX_release (default, no highlight).
+  Expanded keyicons have highlighted key character corresponding to the flick
+  direction.
+
+  Args:
+    template_file: Path for template file.
+    output_file_basename: A string indicating the base name of the output.
+    output_dir: Destination directory path.
+    key_definition_list: Key definition list.
+  """
+  for key_definition in key_definition_list:
+    assert len(key_definition['chars']) == len(_REPLACE_CHARS)
+
+    with open(template_file) as template_f:
+      template = template_f.read()
+
+    for i, pattern in enumerate(_REPLACE_CHARS):
+      template = template.replace(pattern, key_definition['chars'][i])
+
+    for highlight_index, name_suffix in enumerate(_EXPAND_SUPPORT_SUFFIXES):
+      if (highlight_index < len(key_definition['chars']) and
+          not key_definition['chars'][highlight_index]):
+        # We don't need highlighted key for non-existent support.
+        continue
+
+      keytop = template
+      for i, id_pattern in enumerate(_REPLACE_ID_SUFFIXEX):
+        default_id_suffix = ('' if 'id_suffixes' not in key_definition
+                             else key_definition['id_suffixes'][i])
+        id_suffix = default_id_suffix if i != highlight_index else '-highlight'
+        keytop = keytop.replace(id_pattern, id_suffix)
+
+      file_name = '%s__%s_%s.svg' % (output_file_basename,
+                                     key_definition['name'],
+                                     name_suffix)
+      with open(os.path.join(output_dir, file_name), 'w') as write_f:
+        write_f.write(keytop)
+
+
+def WriteSupportPopupKeys(
+    template_file, output_file_basename, output_dir, key_definition_list):
+  """Generates and writes keyicons for support popup from template.
+
+  Support popup keys may have 5 key characters to be replaced.
+
+  Args:
+    template_file: Path for template file.
+    output_file_basename: A string indicating the base name of the output.
+    output_dir: Destination directory path.
+    key_definition_list: Key definition list.
+  """
+  for key_definition in key_definition_list:
+    assert len(key_definition['chars']) == len(_REPLACE_CHARS)
+
+    with open(template_file) as template_f:
+      keytop = template_f.read()
+    for i, pattern in enumerate(_REPLACE_CHARS):
+      keytop = keytop.replace(pattern, key_definition['chars'][i])
+
+    file_name = '%s__%s.svg' % (output_file_basename,
+                                key_definition['name'])
+    with open(os.path.join(output_dir, file_name), 'w') as write_f:
+      write_f.write(keytop)
+
+
+def WriteKeys(
+    template_file, output_file_basename, output_dir, key_definition_list):
+  """Generates and writes keyicons.
+
+  Keys have 1 key character to be replaced.
+
+  Args:
+    template_file: Path for template file.
+    output_file_basename: A string indicating the base name of the output.
+    output_dir: Destination directory path.
+    key_definition_list: Key definition list.
+  """
+  for key_definition in key_definition_list:
+    assert key_definition['char']
+
+    with open(template_file) as template_f:
+      keytop = template_f.read()
+    keytop = keytop.replace(_REPLACE_CHAR, key_definition['char'])
+    keytop = keytop.replace(_REPLACE_CHAR_QWERTY_SUPPORT,
+                            key_definition.get('support', ''))
+
+    file_name = '%s__%s.svg' % (output_file_basename,
+                                key_definition['name'])
+    with open(os.path.join(output_dir, file_name), 'w') as write_f:
+      write_f.write(keytop)
+
+
+def Transform(output_dir):
+  """Transforms template .svg files into output_dir."""
+  ExpandAndWriteSupportKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'godan__kana__support__template.svg'),
+      'godan__kana__support',
+      output_dir,
+      _GODAN_KANA_SUPPORT_KEY_DEFINITIONS)
+
+  ExpandAndWriteSupportKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'godan__kana__support__12__template.svg'),
+      'godan__kana__support',
+      output_dir,
+      _GODAN_KANA_SUPPORT_12_KEY_DEFINITION)
+
+  WriteSupportPopupKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+      'godan__kana__support__popup',
+      output_dir,
+      _GODAN_KANA_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+  qwerty_definitions = (
+      _QWERTY_KEYICON_KEY_DEFINITIONS + GenerateQwertyAlphabetKeyDefinitions())
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'qwerty__keyicon__template.svg'),
+      'qwerty__keyicon',
+      output_dir,
+      qwerty_definitions)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'qwerty__popup__template.svg'),
+      'qwerty__popup',
+      output_dir,
+      [x for x in qwerty_definitions if x.get('support', '')])
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+      'twelvekeys__popup',
+      output_dir,
+      GenerateTwelvekeysAlphabetKeyDefinitions())
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__alphabet__template.svg'),
+      'twelvekeys__alphabet',
+      output_dir,
+      _TWELVEKEYS_ALPHABET_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__alphabet__popup__template.svg'),
+      'twelvekeys__alphabet__popup',
+      output_dir,
+      _TWELVEKEYS_ALPHABET_KEY_DEFINITIONS)
+
+  ExpandAndWriteSupportKeys(
+      os.path.join(ABS_SCRIPT_DIR,
+                   'twelvekeys__alphabet__support__template.svg'),
+      'twelvekeys__alphabet__support',
+      output_dir,
+      _TWELVEKEYS_ALPHABET_SUPPORT_KEY_DEFINITIONS)
+
+  WriteSupportPopupKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+      'twelvekeys__alphabet__support__popup',
+      output_dir,
+      _TWELVEKEYS_ALPHABET_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__kana__keyicon__template.svg'),
+      'twelvekeys__kana__keyicon',
+      output_dir,
+      _TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+      'twelvekeys__popup',
+      output_dir,
+      _TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS)
+
+  ExpandAndWriteSupportKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__kana__support__template.svg'),
+      'twelvekeys__kana__support',
+      output_dir,
+      _TWELVEKEYS_KANA_SUPPORT_KEY_DEFINITIONS)
+
+  ExpandAndWriteSupportKeys(
+      os.path.join(ABS_SCRIPT_DIR,
+                   'twelvekeys__kana__support__12__template.svg'),
+      'twelvekeys__kana__support',
+      output_dir,
+      _TWELVEKEYS_KANA_SUPPORT_12_KEY_DEFINITION)
+
+  WriteSupportPopupKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+      'twelvekeys__kana__support__popup',
+      output_dir,
+      _TWELVEKEYS_KANA_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__number__template.svg'),
+      'twelvekeys__number',
+      output_dir,
+      _TWELVEKEYS_NUMBER_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+      'twelvekeys__popup',
+      output_dir,
+      _TWELVEKEYS_NUMBER_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR,
+                   'twelvekeys__number__function__template.svg'),
+      'twelvekeys__number__function',
+      output_dir,
+      _TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR,
+                   'twelvekeys__popup__template.svg'),
+      'twelvekeys__popup',
+      output_dir,
+      _TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS)
+
+  WriteKeys(
+      os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+      'twelvekeys__popup',
+      output_dir,
+      _TWELVEKEYS_OTHER_POPUP_DEFINITIONS)
+
+
+def ParseOptions():
+  parser = optparse.OptionParser()
+  parser.add_option('--output_dir', dest='output_dir',
+                    help='Output directory for generated svg files.')
+  parser.add_option('--output_zip', dest='output_zip',
+                    help='Output zip file for generated svg files.')
+  return parser.parse_args()[0]
+
+
+def main():
+  options = ParseOptions()
+  if not options.output_dir and not options.output_zip:
+    logging.fatal('You must specify --output_dir and/or --output_zip.')
+    return
+  if options.output_dir:
+    output_dir = options.output_dir
+    if not os.path.exists(output_dir):
+      os.makedirs(output_dir)
+  else:
+    output_dir = tempfile.mkdtemp()
+  Transform(output_dir)
+  if options.output_zip:
+    with zipfile.ZipFile(options.output_zip, 'w', zipfile.ZIP_DEFLATED) as z:
+      for f in os.listdir(output_dir):
+        if os.path.isdir(f):
+          raise IOError('Restriction: output_dir should not include directory')
+        z.write(os.path.join(output_dir, f), f)
+
+if __name__ == '__main__':
+  main()
diff --git a/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg b/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg
new file mode 100644
index 0000000..6f2b34e
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xml:space="preserve"
+     width="87px"
+     height="87px">
+  <!-- Popup icon is 20% bigger than key icon. -->
+  <text id="style-keyicon-main" x="43.5" y="43.5" style="font-size:31.2px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__alphabet__support__template.svg b/src/data/images/android/template/twelvekeys__alphabet__support__template.svg
new file mode 100644
index 0000000..477e133
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__support__template.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}">
+  <text x="52.5" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_down}">
+  <text x="52.5" y="70.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__alphabet__template.svg b/src/data/images/android/template/twelvekeys__alphabet__template.svg
new file mode 100644
index 0000000..6e2a1b0
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+  <text x="52.5" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg b/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg
new file mode 100644
index 0000000..8502000
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+  <text x="56" y="56" style="font-size:53px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__support__12__template.svg b/src/data/images/android/template/twelvekeys__kana__support__12__template.svg
new file mode 100644
index 0000000..e38ef62
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__support__12__template.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     space="preserve"
+     width="105px"
+     height="87px">
+  <polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 60.5,33.5 60.5,50.5 52,50.5 "/>
+  <text id="style-keyicon-main{id_suffix_center}_1_" x="52.5" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+  <polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 30.5,33.5 30.5,50.5 22,50.5 "/>
+  <text id="style-keyicon-main{id_suffix_left}_2_" x="20" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+  <text id="style-keyicon-main{id_suffix_up}_3_" x="52.5" y="14.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+  <text id="style-keyicon-main{id_suffix_right}_4_" x="85" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+  <text id="style-keyicon-guide{id_suffix_down}_5_" x="52.5" y="72.5" style="font-size:18px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__support__template.svg b/src/data/images/android/template/twelvekeys__kana__support__template.svg
new file mode 100644
index 0000000..8e0d313
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__support__template.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xml:space="preserve"
+     version="1.1"
+     width="105px"
+     height="87px">
+  <text id="style-keyicon-main{id_suffix_center}_1_" x="52.5" y="43.5" style="font-size:34px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+  <text id="style-keyicon-guide{id_suffix_left}_2_" x="22" y="43.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+  <text id="style-keyicon-guide{id_suffix_up}_3_" x="52.5" y="16.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+  <text id="style-keyicon-guide{id_suffix_right}_4_" x="83" y="43.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+  <text id="style-keyicon-guide{id_suffix_down}_5_" x="52.5" y="70.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__number__function__template.svg b/src/data/images/android/template/twelvekeys__number__function__template.svg
new file mode 100644
index 0000000..782b4ae
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__number__function__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-twelvekeys-function">
+  <text x="52.5" y="43.5" style="font-size:46px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__number__template.svg b/src/data/images/android/template/twelvekeys__number__template.svg
new file mode 100644
index 0000000..ee9fd25
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__number__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+  <text x="52.5" y="43.5" style="font-size:54px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__popup__template.svg b/src/data/images/android/template/twelvekeys__popup__template.svg
new file mode 100644
index 0000000..af6b530
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__popup__template.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+     * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+     * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+  <!-- Popup icon is 20% bigger than key icon. -->
+  <text x="56" y="56" style="font-size:63.6px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/preedit/12keys-halfwidthascii.tsv b/src/data/preedit/12keys-halfwidthascii.tsv
index 1d679de..37d8f14 100644
--- a/src/data/preedit/12keys-halfwidthascii.tsv
+++ b/src/data/preedit/12keys-halfwidthascii.tsv
@@ -2,15 +2,13 @@
 @1		-
 -1		_
 _1		/
-/1		&
-&1		{*}1
+/1		{*}1
 {*}11		@
 @{<}		{*}1
 -{<}		@
 _{<}		-
 /{<}		_
-&{<}		/
-{*}1{<}		&
+{*}1{<}		/
 2		a	NewChunk NoTransliteration
 a2		b
 b2		c
diff --git a/src/data/preedit/12keys-number.tsv b/src/data/preedit/12keys-number.tsv
deleted file mode 100644
index 0abfbc6..0000000
--- a/src/data/preedit/12keys-number.tsv
+++ /dev/null
@@ -1,19 +0,0 @@
-*		{1}/	NewChunk NoTransliteration
-{1}/*		{1}~
-{1}~*		{1}.
-{1}.*		{1}*
-{1}**		{1}/
-{1}/{<}		{1}*
-{1}~{<}		{1}/
-{1}.{<}		{1}~
-{1}*{<}		{1}.
-#		{2}+	NewChunk NoTransliteration
-{2}+#		{2}-
-{2}-#		{2}=
-{2}=#		{2}#
-{2}##		{2}+
-{2}+{<}		{2}#
-{2}-{<}		{2}+
-{2}={<}		{2}-
-{2}#{<}		{2}=
-{<}		
diff --git a/src/data/preedit/flick-halfwidthascii.tsv b/src/data/preedit/flick-halfwidthascii.tsv
index e382786..1c224fe 100644
--- a/src/data/preedit/flick-halfwidthascii.tsv
+++ b/src/data/preedit/flick-halfwidthascii.tsv
@@ -2,10 +2,11 @@
 -	-		NoTransliteration
 _	_		NoTransliteration
 /	/		NoTransliteration
-&	&		NoTransliteration
+@	1		NoTransliteration
 2		{*}a	NoTransliteration
 b		{*}b	NoTransliteration
 c		{*}c	NoTransliteration
+|	2		NoTransliteration
 {*}a*		{*}A
 {*}b*		{*}B
 {*}c*		{*}C
@@ -15,6 +16,7 @@
 3		{*}d	NoTransliteration
 e		{*}e	NoTransliteration
 f		{*}f	NoTransliteration
+~	3		NoTransliteration
 {*}d*		{*}D
 {*}e*		{*}E
 {*}f*		{*}F
@@ -24,6 +26,7 @@
 4		{*}g	NoTransliteration
 h		{*}h	NoTransliteration
 i		{*}i	NoTransliteration
+$	4		 NoTransliteration
 {*}g*		{*}G
 {*}h*		{*}H
 {*}i*		{*}I
@@ -33,6 +36,7 @@
 5		{*}j	NoTransliteration
 k		{*}k	NoTransliteration
 l		{*}l	NoTransliteration
+%	5		 NoTransliteration
 {*}j*		{*}J
 {*}k*		{*}K
 {*}l*		{*}L
@@ -42,6 +46,7 @@
 6		{*}m	NoTransliteration
 n		{*}n	NoTransliteration
 o		{*}o	NoTransliteration
+&	6		 NoTransliteration
 {*}m*		{*}M
 {*}n*		{*}N
 {*}o*		{*}O
@@ -52,6 +57,7 @@
 q		{*}q	NoTransliteration
 r		{*}r	NoTransliteration
 s		{*}s	NoTransliteration
+<	7		 NoTransliteration
 {*}p*		{*}P
 {*}q*		{*}Q
 {*}r*		{*}R
@@ -63,6 +69,7 @@
 8		{*}t	NoTransliteration
 u		{*}u	NoTransliteration
 v		{*}v	NoTransliteration
+^	8		 NoTransliteration
 {*}t*		{*}T
 {*}u*		{*}U
 {*}v*		{*}V
@@ -73,6 +80,7 @@
 x		{*}x	NoTransliteration
 y		{*}y	NoTransliteration
 z		{*}z	NoTransliteration
+>	9		 NoTransliteration
 {*}w*		{*}W
 {*}x*		{*}X
 {*}y*		{*}Y
@@ -86,6 +94,7 @@
 "	"		NoTransliteration
 :	:		NoTransliteration
 ;	;		NoTransliteration
+#	0		 NoTransliteration
 .	.		NoTransliteration
 ,	,		NoTransliteration
 ?	?		NoTransliteration
diff --git a/src/data/preedit/flick-number.tsv b/src/data/preedit/flick-number.tsv
deleted file mode 100644
index 3dbc760..0000000
--- a/src/data/preedit/flick-number.tsv
+++ /dev/null
@@ -1,9 +0,0 @@
-/	/		NoTransliteration
-~	~		NoTransliteration
-.	.		NoTransliteration
-*	*		NoTransliteration
-+	+		NoTransliteration
--	-		NoTransliteration
-=	=		NoTransliteration
-#	#		NoTransliteration
-{<}		
diff --git a/src/data/preedit/notouch-hiragana.tsv b/src/data/preedit/notouch-hiragana.tsv
new file mode 100644
index 0000000..a2b3ea1
--- /dev/null
+++ b/src/data/preedit/notouch-hiragana.tsv
@@ -0,0 +1,128 @@
+# Roman table for notouch.
+#
+# NOTE:
+#  This rule is basically same as flick-hiragana.
+#  However, we don't want to have raw number transliterated candidates, like
+#  "12" from "あか"
+#  Number only raw input will produce transliterated candidates
+#  via transliteration_rewriter. For example if we have (1, あ) and (2, か),
+#  input "あか" will make candidates "12" in addition to "あか", "赤", etc.
+#  For suppressing such candidates, we use A-J instead of 0-9 as keycode.
+#  This is the only difference between flick-hiragana and notouch-hiragana.
+!		あ	NoTransliteration
+あ*		ぁ
+ぁ*		あ
+_		い	NoTransliteration
+い*		ぃ
+ぃ*		い
+;		う	NoTransliteration
+う*		ぅ
+ぅ*		ゔ
+ゔ*		う
+:		え	NoTransliteration
+え*		ぇ
+ぇ*		え
+@		お	NoTransliteration
+お*		ぉ
+ぉ*		お
+"		か	NoTransliteration
+か*		が
+が*		か
+a		き	NoTransliteration
+き*		ぎ
+ぎ*		き
+b		く	NoTransliteration
+く*		ぐ
+ぐ*		く
+c		け	NoTransliteration
+け*		げ
+げ*		け
+|		こ	NoTransliteration
+こ*		ご
+ご*		こ
+#		さ	NoTransliteration
+さ*		ざ
+ざ*		さ
+d		し	NoTransliteration
+し*		じ
+じ*		し
+e		す	NoTransliteration
+す*		ず
+ず*		す
+f		せ	NoTransliteration
+せ*		ぜ
+ぜ*		せ
+~		そ	NoTransliteration
+そ*		ぞ
+ぞ*		そ
+'		た	NoTransliteration
+た*		だ
+だ*		た
+g		ち	NoTransliteration
+ち*		ぢ
+ぢ*		ち
+h		つ	NoTransliteration
+つ*		っ
+っ*		づ
+づ*		つ
+i		て	NoTransliteration
+て*		で
+で*		て
+$		と	NoTransliteration
+と*		ど
+ど*		と
+[		な	NoTransliteration
+j		に	NoTransliteration
+k		ぬ	NoTransliteration
+l		ね	NoTransliteration
+%		の	NoTransliteration
+]		は	NoTransliteration
+は*		ば
+ば*		ぱ
+ぱ*		は
+m		ひ	NoTransliteration
+ひ*		び
+び*		ぴ
+ぴ*		ひ
+n		ふ	NoTransliteration
+ふ*		ぶ
+ぶ*		ぷ
+ぷ*		ふ
+o		へ	NoTransliteration
+へ*		べ
+べ*		ぺ
+ぺ*		へ
+&		ほ	NoTransliteration
+ほ*		ぼ
+ぼ*		ぽ
+ぽ*		ほ
+<		ま	NoTransliteration
+p		み	NoTransliteration
+q		む	NoTransliteration
+r		め	NoTransliteration
+s		も	NoTransliteration
+=		や	NoTransliteration
+や*		ゃ
+ゃ*		や
+u		ゆ	NoTransliteration
+ゆ*		ゅ
+ゅ*		ゆ
+^		よ	NoTransliteration
+よ*		ょ
+ょ*		よ
+t		「	NoTransliteration
+v		」	NoTransliteration
+>		ら	NoTransliteration
+w		り	NoTransliteration
+x		る	NoTransliteration
+y		れ	NoTransliteration
+z		ろ	NoTransliteration
+*			NoTransliteration
+(		(	NoTransliteration
+)		)	NoTransliteration
+?		わ	NoTransliteration
+わ*		ゎ
+ゎ*		わ
++		を	NoTransliteration
+/		ん	NoTransliteration
+-		ー	NoTransliteration
diff --git a/src/data/preedit/qwerty_mobile-hiragana-number.tsv b/src/data/preedit/qwerty_mobile-hiragana-number.tsv
deleted file mode 100644
index 884a9c9..0000000
--- a/src/data/preedit/qwerty_mobile-hiragana-number.tsv
+++ /dev/null
@@ -1,39 +0,0 @@
-/	/
-[	「
-]	」
-'	時
-"	分
-$	月
-|	日
-~	〜
-,	,
-.	.
-Q	★		NoTransliteration
-W	♥		NoTransliteration
-E	♪		NoTransliteration
-%	※		NoTransliteration
-T	〒		NoTransliteration
-*	×		NoTransliteration
-I	÷		NoTransliteration
-A	・		NoTransliteration
-S	‥		NoTransliteration
-D	…		NoTransliteration
-<	【		NoTransliteration
->	】		NoTransliteration
-Z	(月)		NoTransliteration
-X	(火)		NoTransliteration
-C	(水)		NoTransliteration
-V	(木)		NoTransliteration
-B	(金)		NoTransliteration
-N	(土)		NoTransliteration
-M	(日)		NoTransliteration
-z/	・
-z,	‥
-z.	…
-zh	←
-zj	↓
-zk	↑
-zl	→
-z-	〜
-z[	『
-z]	』
diff --git a/src/data/preedit/toggle_flick-halfwidthascii.tsv b/src/data/preedit/toggle_flick-halfwidthascii.tsv
index ea62311..b7433c9 100644
--- a/src/data/preedit/toggle_flick-halfwidthascii.tsv
+++ b/src/data/preedit/toggle_flick-halfwidthascii.tsv
@@ -2,22 +2,21 @@
 -		{*}-	NoTransliteration
 _		{*}_	NoTransliteration
 /		{*}/	NoTransliteration
-&		{*}&	NoTransliteration
+@	1		NoTransliteration
 {?}@1		{?}-
 {?}-1		{?}_
 {?}_1		{?}/
-{?}/1		{?}&
-{?}&1		{?}1
+{?}/1		{?}1
 {?}11		{?}@
 {?}@{<}		{?}1
 {?}-{<}		{?}@
 {?}_{<}		{?}-
 {?}/{<}		{?}_
-{?}&{<}		{?}/
-{?}1{<}		{?}&
+{?}1{<}		{?}/
 2		{?}a	NewChunk NoTransliteration
 b		{*}b	NoTransliteration
 c		{*}c	NoTransliteration
+|	2		NoTransliteration
 {?}a2		{?}b
 {?}b2		{?}c
 {?}c2		{?}A
@@ -47,6 +46,7 @@
 3		{?}d	NewChunk NoTransliteration
 e		{*}e	NoTransliteration
 f		{*}f	NoTransliteration
+~	3		NoTransliteration
 {?}d3		{?}e
 {?}e3		{?}f
 {?}f3		{?}D
@@ -76,6 +76,7 @@
 4		{?}g	NewChunk NoTransliteration
 h		{*}h	NoTransliteration
 i		{*}i	NoTransliteration
+$	4		NoTransliteration
 {?}g4		{?}h
 {?}h4		{?}i
 {?}i4		{?}G
@@ -105,6 +106,7 @@
 5		{?}j	NewChunk NoTransliteration
 k		{*}k	NoTransliteration
 l		{*}l	NoTransliteration
+%	5		NoTransliteration
 {?}j5		{?}k
 {?}k5		{?}l
 {?}l5		{?}J
@@ -134,6 +136,7 @@
 6		{?}m	NewChunk NoTransliteration
 n		{*}n	NoTransliteration
 o		{*}o	NoTransliteration
+&	6		NoTransliteration
 {?}m6		{?}n
 {?}n6		{?}o
 {?}o6		{?}M
@@ -164,6 +167,7 @@
 q		{*}q	NoTransliteration
 r		{*}r	NoTransliteration
 s		{*}s	NoTransliteration
+<	7		NoTransliteration
 {?}p7		{?}q
 {?}q7		{?}r
 {?}r7		{?}s
@@ -201,6 +205,7 @@
 8		{?}t	NewChunk NoTransliteration
 u		{*}u	NoTransliteration
 v		{*}v	NoTransliteration
+^	8		NoTransliteration
 {?}t8		{?}u
 {?}u8		{?}v
 {?}v8		{?}T
@@ -231,6 +236,7 @@
 x		{*}x	NoTransliteration
 y		{*}y	NoTransliteration
 z		{*}z	NoTransliteration
+>	9		NoTransliteration
 {?}w9		{?}x
 {?}x9		{?}y
 {?}y9		{?}z
@@ -270,6 +276,7 @@
 "		{*}"	NoTransliteration
 :		{*}:	NoTransliteration
 ;		{*};	NoTransliteration
+#	0		NoTransliteration
 {?}'0		{?}"
 {?}"0		{?}:
 {?}:0		{?};
diff --git a/src/data/preedit/toggle_flick-hiragana.tsv b/src/data/preedit/toggle_flick-hiragana.tsv
index d5532c0..c6c407f 100644
--- a/src/data/preedit/toggle_flick-hiragana.tsv
+++ b/src/data/preedit/toggle_flick-hiragana.tsv
@@ -348,12 +348,14 @@
 {?}を0		{?}ん
 {?}ん0		{?}ゎ
 {?}ゎ0		{?}ー
-{?}ー0		{?}わ
-{?}わ{<}		{?}ー
+{?}ー0		{?}〜
+{?}〜0		{?}わ
+{?}わ{<}		{?}〜
 {?}を{<}		{?}わ
 {?}ん{<}		{?}を
 {?}ゎ{<}		{?}ん
 {?}ー{<}		{?}ゎ
+{?}〜{<}		{?}ー
 {?}わ*		{*}ゎ
 {?}ゎ*		{*}わ
 {*}わ*		{*}ゎ
@@ -368,14 +370,16 @@
 {#}、#		{#}。
 {#}。#		{#}?
 {#}?#		{#}!
-{#}!#		{#}・
+{#}!#		{#}…
+{#}…#		{#}・
 {#}・#		{#} 
 {#} #		{#}、
 {#}、{<}		{#} 
 {#}。{<}		{#}、
 {#}?{<}		{#}。
 {#}!{<}		{#}?
-{#}・{<}		{#}!
+{#}…{<}		{#}!
+{#}・{<}		{#}…
 {#} {<}		{#}・
 <		〜	NoTransliteration
 >		…	NoTransliteration
diff --git a/src/data/preedit/toggle_flick-number.tsv b/src/data/preedit/toggle_flick-number.tsv
deleted file mode 100644
index f768f3e..0000000
--- a/src/data/preedit/toggle_flick-number.tsv
+++ /dev/null
@@ -1,25 +0,0 @@
-/		{?}/	NewChunk NoTransliteration
-~		{*}~	NoTransliteration
-.		{*}.	NoTransliteration
-*		{*}*	NoTransliteration
-{?}//		{?}~
-{?}~/		{?}.
-{?}./		{?}*
-{?}*/		{?}/
-{?}/{<}		{?}*
-{?}~{<}		{?}/
-{?}.{<}		{?}~
-{?}*{<}		{?}.
-+		{?}+	NewChunk NoTransliteration
--		{*}-	NoTransliteration
-=		{*}=	NoTransliteration
-#		{*}#	NoTransliteration
-{?}++		{?}-
-{?}-+		{?}=
-{?}=+		{?}#
-{?}#+		{?}+
-{?}+{<}		{?}#
-{?}-{<}		{?}+
-{?}={<}		{?}-
-{?}#{<}		{?}=
-{<}		
diff --git a/src/data/test/session/scenario/b12751061_scenario.txt b/src/data/test/session/scenario/b12751061_scenario.txt
index 76a3ef8..ff35928 100644
--- a/src/data/test/session/scenario/b12751061_scenario.txt
+++ b/src/data/test/session/scenario/b12751061_scenario.txt
@@ -7,7 +7,7 @@
 SET_MOBILE_REQUEST
 
 RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	TWELVE_KEYS_TO_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
+UPDATE_MOBILE_KEYBOARD	QWERTY_MOBILE_TO_HALFWIDTHASCII	SPACE_OR_CONVERT_KEEPING_COMPOSITION
 SWITCH_INPUT_MODE	HIRAGANA
 
 SEND_KEYS	111
diff --git a/src/data/test/session/scenario/mobile_t13n_candidates.txt b/src/data/test/session/scenario/mobile_t13n_candidates.txt
index d24b545..fca4c32 100644
--- a/src/data/test/session/scenario/mobile_t13n_candidates.txt
+++ b/src/data/test/session/scenario/mobile_t13n_candidates.txt
@@ -42,21 +42,6 @@
 EXPECT_IN_ALL_CANDIDATE_WORDS	222
 
 
-# TWELVE_KEYS_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	TWELVE_KEYS_TO_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE	HALF_ASCII
-
-SEND_KEYS	0222
-EXPECT_PREEDIT	0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百廿弐
-
 # FLICK_TO_HIRAGANA
 RESET_CONTEXT
 UPDATE_MOBILE_KEYBOARD	FLICK_TO_HIRAGANA	SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -112,22 +97,6 @@
 EXPECT_IN_ALL_CANDIDATE_WORDS	25
 
 
-# FLICK_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	FLICK_TO_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE	HALF_ASCII
-
-SEND_KEYS	0222
-EXPECT_PREEDIT	0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百廿弐
-
-
 # TOGGLE_FLICK_TO_HIRAGANA
 RESET_CONTEXT
 UPDATE_MOBILE_KEYBOARD	TOGGLE_FLICK_TO_HIRAGANA	SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -199,22 +168,6 @@
 EXPECT_IN_ALL_CANDIDATE_WORDS	25
 
 
-# TOGGLE_FLICK_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	TOGGLE_FLICK_TO_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE	HALF_ASCII
-
-SEND_KEYS	0222
-EXPECT_PREEDIT	0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百廿弐
-
-
 # QWERTY_MOBILE_TO_HIRAGANA
 RESET_CONTEXT
 UPDATE_MOBILE_KEYBOARD	QWERTY_MOBILE_TO_HIRAGANA	SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -234,22 +187,6 @@
 EXPECT_IN_ALL_CANDIDATE_WORDS	Nekomamire
 
 
-# QWERTY_MOBILE_TO_HIRAGANA_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	QWERTY_MOBILE_TO_HIRAGANA_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE	HALF_ASCII
-
-SEND_KEYS	0222
-EXPECT_PREEDIT	0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百廿弐
-
-
 # QWERTY_MOBILE_TO_HALFWIDTHASCII
 RESET_CONTEXT
 UPDATE_MOBILE_KEYBOARD	QWERTY_MOBILE_TO_HALFWIDTHASCII	SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -301,18 +238,24 @@
 EXPECT_IN_ALL_CANDIDATE_WORDS	CD
 
 
-# GODAN_TO_NUMBER
+# NOTOUCH_KANA
 RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD	GODAN_TO_NUMBER	SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE	HALF_ASCII
+UPDATE_MOBILE_KEYBOARD	NOTOUCH_TO_HIRAGANA	SPACE_OR_CONVERT_KEEPING_COMPOSITION
+SWITCH_INPUT_MODE	HIRAGANA
 
-SEND_KEYS	0222
-EXPECT_PREEDIT	0222
+SEND_KEYS	l|<py
+EXPECT_PREEDIT	ねこまみれ
+EXPECT_IN_ALL_CANDIDATE_WORDS	ねこまみれ
+EXPECT_IN_ALL_CANDIDATE_WORDS	ネコマミレ
+EXPECT_IN_ALL_CANDIDATE_WORDS	ネコマミレ
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	l|<py
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	<
 
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS	0222
-EXPECT_IN_ALL_CANDIDATE_WORDS	二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS	弐百廿弐
-
+RESET_CONTEXT
+SEND_KEYS	!'<
+EXPECT_PREEDIT	あたま
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	!'<
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	!’<
+SEND_KEY	LEFT
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	!'
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS	!’
diff --git a/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt b/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
index 667fe33..498c9aa 100644
--- a/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
+++ b/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
@@ -7,32 +7,20 @@
 # Following scenario is emulation of http://b/issue?id=5844621.
 RESET_CONTEXT
 
-# Set to 12keys-number keyboard layout.
-SET_MOBILE_REQUEST
-UPDATE_MOBILE_KEYBOARD	TOGGLE_FLICK_TO_NUMBER	COMMIT
-SWITCH_INPUT_MODE	HALF_ASCII
-
-# Type "3" and "0" consecutively.
-SEND_KEYS	30
-EXPECT_PREEDIT	30
-
 # Switch to 12keys-hiragana keyboard layout.
 UPDATE_MOBILE_KEYBOARD	TOGGLE_FLICK_TO_HIRAGANA	SPACE_OR_CONVERT_KEEPING_COMPOSITION
 SWITCH_INPUT_MODE	HIRAGANA
 
-# Send backspace.
-SEND_KEY	BACKSPACE
-
 # The flick SA-key to the left to input "SHI", which is translated to 'd' key
 # in the Java client.
 SEND_KEYS	d
-EXPECT_PREEDIT	3し
+EXPECT_PREEDIT	し
 
 
 # Another scenario.
 RESET_CONTEXT
 
-# Set to 12keys-number keyboard layout.
+# Set to number keyboard layout.
 UPDATE_MOBILE_KEYBOARD	TOGGLE_FLICK_TO_HALFWIDTHASCII	COMMIT
 SWITCH_INPUT_MODE	HALF_ASCII
 
diff --git a/src/docker/ubuntu12.04/Dockerfile b/src/docker/ubuntu12.04/Dockerfile
index 1bba983..ed28f30 100644
--- a/src/docker/ubuntu12.04/Dockerfile
+++ b/src/docker/ubuntu12.04/Dockerfile
@@ -58,7 +58,7 @@
 ENV ANDROID_NDK_HOME /home/mozc_builder/work/android-ndk-r10d
 ENV ANDROID_HOME /home/mozc_builder/work/android-sdk-linux
 ENV PATH $PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_NDK_HOME}
-RUN echo y | android update sdk --all --force --no-ui --filter android-19
+RUN echo y | android update sdk --all --force --no-ui --filter android-21
 RUN echo y | android update sdk --all --force --no-ui --filter build-tools-21.0.2
 RUN echo y | android update sdk --all --force --no-ui --filter extra-android-support
 RUN echo y | android update sdk --all --force --no-ui --filter platform-tool
diff --git a/src/docker/ubuntu14.04/Dockerfile b/src/docker/ubuntu14.04/Dockerfile
index 4c51d6c..4988147 100644
--- a/src/docker/ubuntu14.04/Dockerfile
+++ b/src/docker/ubuntu14.04/Dockerfile
@@ -59,7 +59,7 @@
 ENV ANDROID_NDK_HOME /home/mozc_builder/work/android-ndk-r10d
 ENV ANDROID_HOME /home/mozc_builder/work/android-sdk-linux
 ENV PATH $PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_NDK_HOME}
-RUN echo y | android update sdk --all --force --no-ui --filter android-19
+RUN echo y | android update sdk --all --force --no-ui --filter android-21
 RUN echo y | android update sdk --all --force --no-ui --filter build-tools-21.0.2
 RUN echo y | android update sdk --all --force --no-ui --filter extra-android-support
 RUN echo y | android update sdk --all --force --no-ui --filter platform-tool
diff --git a/src/gyp/tests.gyp b/src/gyp/tests.gyp
index d832400..4ffedba 100644
--- a/src/gyp/tests.gyp
+++ b/src/gyp/tests.gyp
@@ -80,9 +80,12 @@
             '../unix/ibus/ibus.gyp:ibus_all_test',
           ],
         }],
+        # Java tests are defined in android/android.gyp:build_java_test.
+        # However asset files (e.g., system.dictionary) are required to run
+        # native tests.
         ['target_platform=="Android"', {
           'dependencies': [
-            '../android/android.gyp:build_java_test',
+            '../android/android.gyp:assets',
           ],
         }],
       ],
diff --git a/src/mozc_version_template.txt b/src/mozc_version_template.txt
index f54f736..c4ebf59 100644
--- a/src/mozc_version_template.txt
+++ b/src/mozc_version_template.txt
@@ -1,6 +1,6 @@
 MAJOR=2
 MINOR=16
-BUILD=2003
+BUILD=2004
 REVISION=102
 # NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
 # downloaded by NaCl Mozc.
diff --git a/src/session/commands.proto b/src/session/commands.proto
index 373791e..d34ac42 100644
--- a/src/session/commands.proto
+++ b/src/session/commands.proto
@@ -586,33 +586,21 @@
     // Use special table for 12keys (to half-width ascii).
     TWELVE_KEYS_TO_HALFWIDTHASCII = 11;
 
-    // Use special table for 12keys (to number).
-    TWELVE_KEYS_TO_NUMBER = 12;
-
     // Use special table for flick (to hiragana).
     FLICK_TO_HIRAGANA = 13;
 
     // Use special table for flick (to half-width ascii).
     FLICK_TO_HALFWIDTHASCII = 14;
 
-    // Use special table for flick (to number).
-    FLICK_TO_NUMBER = 15;
-
     // Use special table for both toggle and flick (to hiragana).
     TOGGLE_FLICK_TO_HIRAGANA = 16;
 
     // Use special table for both toggle and flick (to half-width ascii).
     TOGGLE_FLICK_TO_HALFWIDTHASCII = 17;
 
-    // Use special table for both toggle and flick (to number).
-    TOGGLE_FLICK_TO_NUMBER = 18;
-
     // Use special table for Qwerty (for Mobile) (to hiragana).
     QWERTY_MOBILE_TO_HIRAGANA = 20;
 
-    // Use special table for Qwerty (for Mobile) (to hiragana's number).
-    QWERTY_MOBILE_TO_HIRAGANA_NUMBER = 21;
-
     // Use special table for Qwerty (for Mobile) (to half-width ascii).
     QWERTY_MOBILE_TO_HALFWIDTHASCII = 22;
 
@@ -622,9 +610,18 @@
     // Use special table for Godan (to half-width ascii).
     GODAN_TO_HALFWIDTHASCII = 31;
 
-    // Use special table for Godan (to number).
-    GODAN_TO_NUMBER = 32;
+    // Use special table for Notouch (to hiragana).
+    NOTOUCH_TO_HIRAGANA = 40;
 
+    // Use special table for Notouch (to half-width ascii).
+    NOTOUCH_TO_HALFWIDTHASCII = 41;
+
+    // Obsolete items.
+    OBSOLETE_TWELVE_KEYS_TO_NUMBER = 12;
+    OBSOLETE_FLICK_TO_NUMBER = 15;
+    OBSOLETE_GODAN_TO_NUMBER = 32;
+    OBSOLETE_QWERTY_MOBILE_TO_HIRAGANA_NUMBER = 21;
+    OBSOLETE_TOGGLE_FLICK_TO_NUMBER = 18;
   };
 
   // Use special Romanji table.
diff --git a/src/session/session_handler_scenario_test.cc b/src/session/session_handler_scenario_test.cc
index 09dcfeb..be6ef93 100644
--- a/src/session/session_handler_scenario_test.cc
+++ b/src/session/session_handler_scenario_test.cc
@@ -167,6 +167,7 @@
   DATA_DIR "segment_focus.txt",
   DATA_DIR "segment_width.txt",
   DATA_DIR "twelvekeys_switch_inputmode_scenario.txt",
+  DATA_DIR "twelvekeys_toggle_flick_alphabet_scenario.txt",
   DATA_DIR "twelvekeys_toggle_hiragana_preedit_scenario.txt",
   DATA_DIR "undo.txt",
 #undef DATA_DIR
diff --git a/src/session/session_test.cc b/src/session/session_test.cc
index d95f3c6..a6a3de7 100644
--- a/src/session/session_test.cc
+++ b/src/session/session_test.cc
@@ -681,7 +681,7 @@
       const commands::Request &request) {
     session->SetRequest(&request);
     table_.reset(new composer::Table());
-    table_.get()->InitializeWithRequestAndConfig(
+    table_->InitializeWithRequestAndConfig(
         request, config::ConfigHandler::GetConfig());
     session->SetTable(table_.get());
   }
@@ -8285,7 +8285,7 @@
       commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII);
   session.SetRequest(&request);
   scoped_ptr<composer::Table> table(new composer::Table());
-  table.get()->InitializeWithRequestAndConfig(
+  table->InitializeWithRequestAndConfig(
       request, config::ConfigHandler::GetConfig());
   session.SetTable(table.get());
   // Type "2*" to produce "A".
@@ -8297,22 +8297,6 @@
   session.SendKey(&command);
   EXPECT_EQ("A", GetComposition(command));
 
-  // Change to 12keys-number mode.
-  SwitchInputMode(commands::HALF_ASCII, &session);
-
-  command.Clear();
-  request.set_special_romanji_table(commands::Request::TWELVE_KEYS_TO_NUMBER);
-  session.SetRequest(&request);
-  table.reset(new composer::Table());
-  table.get()->InitializeWithRequestAndConfig(
-      request, config::ConfigHandler::GetConfig());
-  session.SetTable(table.get());
-  // Type "2" to produce "A2".
-  SetSendKeyCommand("2", &command);
-  command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
-  session.SendKey(&command);
-  EXPECT_EQ("A2", GetComposition(command));
-
   // Change to 12keys-halfascii mode.
   SwitchInputMode(commands::HALF_ASCII, &session);
 
@@ -8321,14 +8305,14 @@
       commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII);
   session.SetRequest(&request);
   table.reset(new composer::Table());
-  table.get()->InitializeWithRequestAndConfig(
+  table->InitializeWithRequestAndConfig(
       request, config::ConfigHandler::GetConfig());
   session.SetTable(table.get());
-  // Type "2" to produce "A2a".
+  // Type "2" to produce "Aa".
   SetSendKeyCommand("2", &command);
   command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
   session.SendKey(&command);
-  EXPECT_EQ("A2a", GetComposition(command));
+  EXPECT_EQ("Aa", GetComposition(command));
   command.Clear();
 }