Update OpenWnn based on ICS.

- Support multi screen size
- Common UI with Android IME
- Feature improvements
- Hardware keybord support
- etc.

Change-Id: Iec1dff5be9d62b8338a32e6ae3444a7cc8613c4b
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2ce1ae6..f79c324 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/ChangeLog.txt b/ChangeLog.txt
new file mode 100644
index 0000000..73d6b3c
--- /dev/null
+++ b/ChangeLog.txt
@@ -0,0 +1,98 @@
+------------------------------------------------------------------------------
+                              [OpenWnn ChangeLog]
+
+     (C) Copyright OMRON SOFTWARE Co., Ltd. 2008-2012 All Rights Reserved.
+------------------------------------------------------------------------------
+
+[Version 1.3.6 release] Apr 12, 2012
+------------------------------------
+  Update features:
+   * Android 4.0 (ICS) support.
+   * Improving Large Qwerty.
+     - Display style of the candidates view is changed.
+   * Improving usability.
+     - Focus in the candidate list can move arround using keyboard operation.
+     - Layout of soft keyboard is changed.
+     - Layout of symbol list is changed.
+     - Layout of emoticon list is changed.
+     - Support for H/W12key
+     - Support for Bluetooth Keyboard
+
+  Bug fix:
+   * If the ICS, bug when displaying the user dictionary, Exception occurs.
+   * Corresponding vulnerability of DB files
+
+[Version 1.3.5 release] Dec 25, 2009
+------------------------------------
+  Update features:
+   * Importing some improvement from iWnn IME.
+
+  Bug fix:
+   * Bug of Romaji-to-Kana conversion on phonetic text field is fixed.
+   * Some minor bugs are fixed.
+
+[Version 1.3.4 release] Oct 29, 2009
+------------------------------------
+  Bug fix:
+   * User Dictionary's bug on WVGA is fixed.
+   * Hardware keyboard support on Android 2.0 (eclair)
+
+[Version 1.3.3 release] Sep 30, 2009
+------------------------------------
+  Update features:
+   * Android 2.0 (eclair) support.
+
+[Version 1.3.2 internal version] Sep 25, 2009
+---------------------------------------------
+  Update features:
+   * Android 1.6 (donut) support.
+   * Adding images for 240dpi display.
+   * Japanese input on E-mail address field is allowed.
+
+[Version 1.3.1 release] Jun 12, 2009
+------------------------------------
+  Update features:
+   * Emoji is disabled.
+   * Improving display size compatibility.
+
+[Version 1.3 release]   May 14, 2009
+------------------------------------
+  Update features:
+   * Improving usability.
+     - Layout of software keyboards are changed.
+     - Display style of the candidates view is changed.
+     - Simple tutorial is added.
+   * Improving speed of registering to the learning dictionary.
+
+  Bug fix:
+   * Some minor bugs are fixed.
+
+[Version 1.2 release]   Mar 27, 2009
+------------------------------------
+  The first release implemented following features:
+   * (Simplified) Chinese input method
+
+  Update features:
+   * Switcher of "Auto Capitalization" to the setting menu is added.
+   * Changer of the keyboard image to the setting menu is added.
+   * User dictionary manager's user interface is changed.
+   * Changes for improving usability.
+
+  Bug fix:
+   * Some minor bugs are fixed.
+
+------------------------------------------------------------------------------
+[Version 1.1 release]   Feb. 23, 2009
+-------------------------------------
+  The first release implemented following features:
+   * Japanese input method
+   * English input method
+
+------------------------------------------------------------------------------
+[Version 1.0 release]   Dec 04, 2008
+-------------------------------------
+  The first release implemented following features:
+   * Dictionary search library
+   * English dictionary
+
+------------------------------------------------------------------------------
diff --git a/README.txt b/README.txt
index 3b0ac1d..af4ace3 100644
--- a/README.txt
+++ b/README.txt
@@ -1,9 +1,9 @@
 -------------------------------------------------------------------------------
                               OpenWnn Japnese README
 
-                                   Version 1.3.5
-                  
-     (C) Copyright OMRON SOFTWARE Co., Ltd. 2008,2009 All Rights Reserved.
+                                Version 1.3.6
+ 
+     (C) Copyright OMRON SOFTWARE Co., Ltd. 2008-2012 All Rights Reserved.
 -------------------------------------------------------------------------------
 
 1. About OpenWnn
@@ -83,18 +83,38 @@
             *.png                             |
         drawable-ja/                          |
             *.png                             |
+        drawable-xlarge/                      |
+            *.xml                             |
+            *.png                             |
+        drawable-xlarge-hdpi/                 |
+            *.xml                             |
+            *.png                             |
+        drawable-xlarge-land-hdpi/            |
+            *.png                             |
         layout/                               |
             *.xml                             |
+        layout-xlarge/                        |
+            *.xml                             |
         raw/                                  |
             type.ogg                          |
         values/                               |
             *.xml                             |
         values-ja/                            |
             *.xml                             |
+        values-land/                          |
+            *.xml                             |
+        values-xlarge/                        |
+            *.xml                             |
+        values-xlarge-land/                   |
+            *.xml                             |
         values-zh-rCN                         |
             *.xml                             |
         xml/                                  |
             *.xml                             |
+        xml-land/                             |
+            *.xml                             |
+        xml-xlarge/                           |
+            *.xml                             |
 
     src/                                      IME source code (Java)
         jp/                                   |
diff --git a/libs/libwnnDictionary/Android.mk b/libs/libwnnDictionary/Android.mk
index e14069f..b7b88b2 100644
--- a/libs/libwnnDictionary/Android.mk
+++ b/libs/libwnnDictionary/Android.mk
@@ -30,6 +30,4 @@
 LOCAL_CFLAGS += \
 	 -O
 
-
-
 include $(BUILD_SHARED_LIBRARY)
diff --git a/libs/libwnnDictionary/OpenWnnDictionaryImplJni.c b/libs/libwnnDictionary/OpenWnnDictionaryImplJni.c
index 133888d..b112baa 100644
--- a/libs/libwnnDictionary/OpenWnnDictionaryImplJni.c
+++ b/libs/libwnnDictionary/OpenWnnDictionaryImplJni.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/OpenWnnJni.h b/libs/libwnnDictionary/OpenWnnJni.h
index 360d558..bd35999 100644
--- a/libs/libwnnDictionary/OpenWnnJni.h
+++ b/libs/libwnnDictionary/OpenWnnJni.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndapi.c b/libs/libwnnDictionary/engine/ndapi.c
index a41cdab..55971c6 100644
--- a/libs/libwnnDictionary/engine/ndapi.c
+++ b/libs/libwnnDictionary/engine/ndapi.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndbdic.c b/libs/libwnnDictionary/engine/ndbdic.c
index fbb387f..6cf73da 100644
--- a/libs/libwnnDictionary/engine/ndbdic.c
+++ b/libs/libwnnDictionary/engine/ndbdic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndcommon.c b/libs/libwnnDictionary/engine/ndcommon.c
index d3d493f..fc1c25a 100644
--- a/libs/libwnnDictionary/engine/ndcommon.c
+++ b/libs/libwnnDictionary/engine/ndcommon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndfdic.c b/libs/libwnnDictionary/engine/ndfdic.c
index a737943..65a842e 100644
--- a/libs/libwnnDictionary/engine/ndfdic.c
+++ b/libs/libwnnDictionary/engine/ndfdic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndldic.c b/libs/libwnnDictionary/engine/ndldic.c
index f7658d2..d140ea2 100644
--- a/libs/libwnnDictionary/engine/ndldic.c
+++ b/libs/libwnnDictionary/engine/ndldic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/ndrdic.c b/libs/libwnnDictionary/engine/ndrdic.c
index 15c5712..b8fe634 100644
--- a/libs/libwnnDictionary/engine/ndrdic.c
+++ b/libs/libwnnDictionary/engine/ndrdic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/neapi.c b/libs/libwnnDictionary/engine/neapi.c
index 49d5aed..4b59aac 100644
--- a/libs/libwnnDictionary/engine/neapi.c
+++ b/libs/libwnnDictionary/engine/neapi.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/necode.c b/libs/libwnnDictionary/engine/necode.c
index 9bab3fa..ca33186 100644
--- a/libs/libwnnDictionary/engine/necode.c
+++ b/libs/libwnnDictionary/engine/necode.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/engine/nj_str.c b/libs/libwnnDictionary/engine/nj_str.c
index d450e85..1892458 100644
--- a/libs/libwnnDictionary/engine/nj_str.c
+++ b/libs/libwnnDictionary/engine/nj_str.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/nj_dic.h b/libs/libwnnDictionary/include/nj_dic.h
index c2c4b98..47b54ac 100644
--- a/libs/libwnnDictionary/include/nj_dic.h
+++ b/libs/libwnnDictionary/include/nj_dic.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/nj_err.h b/libs/libwnnDictionary/include/nj_err.h
index 4f7a214..3b4010c 100644
--- a/libs/libwnnDictionary/include/nj_err.h
+++ b/libs/libwnnDictionary/include/nj_err.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/nj_ext.h b/libs/libwnnDictionary/include/nj_ext.h
index 1a08bbf..c2e7356 100644
--- a/libs/libwnnDictionary/include/nj_ext.h
+++ b/libs/libwnnDictionary/include/nj_ext.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/nj_lib.h b/libs/libwnnDictionary/include/nj_lib.h
index 3a89200..d4dae0d 100644
--- a/libs/libwnnDictionary/include/nj_lib.h
+++ b/libs/libwnnDictionary/include/nj_lib.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/njd.h b/libs/libwnnDictionary/include/njd.h
index ae3b338..937a009 100644
--- a/libs/libwnnDictionary/include/njd.h
+++ b/libs/libwnnDictionary/include/njd.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/include/njx_lib.h b/libs/libwnnDictionary/include/njx_lib.h
index 8ff6b03..91755e7 100644
--- a/libs/libwnnDictionary/include/njx_lib.h
+++ b/libs/libwnnDictionary/include/njx_lib.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni.h b/libs/libwnnDictionary/jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni.h
index 45700bf..bf5f7df 100644
--- a/libs/libwnnDictionary/jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni.h
+++ b/libs/libwnnDictionary/jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnDictionary/predef_table.h b/libs/libwnnDictionary/predef_table.h
index 703777d..34b6b66 100644
--- a/libs/libwnnDictionary/predef_table.h
+++ b/libs/libwnnDictionary/predef_table.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnEngDic/Android.mk b/libs/libwnnEngDic/Android.mk
index a71c82e..85d452a 100644
--- a/libs/libwnnEngDic/Android.mk
+++ b/libs/libwnnEngDic/Android.mk
@@ -20,6 +20,4 @@
 LOCAL_CFLAGS += \
 	-O
 
-
-
 include $(BUILD_SHARED_LIBRARY)
diff --git a/libs/libwnnEngDic/WnnEngDic.c b/libs/libwnnEngDic/WnnEngDic.c
index 4b92fac..9b19411 100644
--- a/libs/libwnnEngDic/WnnEngDic.c
+++ b/libs/libwnnEngDic/WnnEngDic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/libs/libwnnJpnDic/Android.mk b/libs/libwnnJpnDic/Android.mk
index c2310d6..0ba69c6 100644
--- a/libs/libwnnJpnDic/Android.mk
+++ b/libs/libwnnJpnDic/Android.mk
@@ -20,6 +20,4 @@
 LOCAL_CFLAGS += \
 	-O
 
-
-
 include $(BUILD_SHARED_LIBRARY)
diff --git a/libs/libwnnJpnDic/WnnJpnDic.c b/libs/libwnnJpnDic/WnnJpnDic.c
index c019d30..d392959 100644
--- a/libs/libwnnJpnDic/WnnJpnDic.c
+++ b/libs/libwnnJpnDic/WnnJpnDic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/res/drawable-hdpi/btn_close.xml b/res/drawable-hdpi/btn_close.xml
new file mode 100644
index 0000000..5af18f3
--- /dev/null
+++ b/res/drawable-hdpi/btn_close.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="false"
+        android:drawable="@drawable/btn_close_normal" />
+
+    <item android:state_pressed="true"
+        android:drawable="@drawable/btn_close_pressed" />
+
+</selector>
diff --git a/res/drawable-hdpi/btn_close_normal.png b/res/drawable-hdpi/btn_close_normal.png
new file mode 100644
index 0000000..ecc4dde
--- /dev/null
+++ b/res/drawable-hdpi/btn_close_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_close_pressed.png b/res/drawable-hdpi/btn_close_pressed.png
new file mode 100644
index 0000000..49223c5
--- /dev/null
+++ b/res/drawable-hdpi/btn_close_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key.xml b/res/drawable-hdpi/btn_keyboard_key.xml
new file mode 100644
index 0000000..5b3b4b1
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+ 
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal" />
+ 
+</selector>
diff --git a/res/drawable-hdpi/btn_keyboard_key_2nd.xml b/res/drawable-hdpi/btn_keyboard_key_2nd.xml
new file mode 100644
index 0000000..991634f
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_2nd.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+ 
+    <item android:state_checkable="true" android:state_checked="true" 
+          android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed_on_2nd" />
+    <item android:state_checkable="true" android:state_checked="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_on_2nd" />
+
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed_2nd" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal_2nd" />
+ 
+</selector>
diff --git a/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png b/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 0000000..9fed21e
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png b/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 0000000..e6a1dce
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/res/drawable-hdpi/btn_keyboard_key_normal.9.png
new file mode 100644
index 0000000..32168a3
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal_2nd.9.png b/res/drawable-hdpi/btn_keyboard_key_normal_2nd.9.png
new file mode 100644
index 0000000..0f43c2e
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_normal_2nd.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal_on_2nd.9.png b/res/drawable-hdpi/btn_keyboard_key_normal_on_2nd.9.png
new file mode 100644
index 0000000..fe125f3
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_normal_on_2nd.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
new file mode 100644
index 0000000..5e52bb2
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed_2nd.9.png b/res/drawable-hdpi/btn_keyboard_key_pressed_2nd.9.png
new file mode 100644
index 0000000..9a79706
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_pressed_2nd.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed_on_2nd.9.png b/res/drawable-hdpi/btn_keyboard_key_pressed_on_2nd.9.png
new file mode 100644
index 0000000..0e12b9f
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_pressed_on_2nd.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std.xml b/res/drawable-hdpi/btn_keyboard_key_std.xml
new file mode 100644
index 0000000..b30ba33
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+ 
+    <item android:state_checkable="true" android:state_checked="true"
+          android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_std_pressed_on" />
+    <item android:state_checkable="true" android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_std_pressed_off" />
+    <item android:state_checkable="true" android:state_checked="true"
+          android:drawable="@drawable/btn_keyboard_key_std_normal_on" />
+    <item android:state_checkable="true"
+          android:drawable="@drawable/btn_keyboard_key_std_normal_off" />
+
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_std_pressed" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_std_normal" />
+ 
+</selector>
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_normal.9.png b/res/drawable-hdpi/btn_keyboard_key_std_normal.9.png
new file mode 100644
index 0000000..42c7c14
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_normal_off.9.png b/res/drawable-hdpi/btn_keyboard_key_std_normal_off.9.png
new file mode 100644
index 0000000..01e2506
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_normal_off.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_normal_on.9.png b/res/drawable-hdpi/btn_keyboard_key_std_normal_on.9.png
new file mode 100644
index 0000000..83c6eb3
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_normal_on.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_pressed.9.png b/res/drawable-hdpi/btn_keyboard_key_std_pressed.9.png
new file mode 100644
index 0000000..e047eaf
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_pressed_off.9.png b/res/drawable-hdpi/btn_keyboard_key_std_pressed_off.9.png
new file mode 100644
index 0000000..218a2d2
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_pressed_off.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_std_pressed_on.9.png b/res/drawable-hdpi/btn_keyboard_key_std_pressed_on.9.png
new file mode 100644
index 0000000..afe4951
--- /dev/null
+++ b/res/drawable-hdpi/btn_keyboard_key_std_pressed_on.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_back.xml b/res/drawable-hdpi/cand_back.xml
new file mode 100644
index 0000000..7033505
--- /dev/null
+++ b/res/drawable-hdpi/cand_back.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/cand_back_pressed" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/cand_back_focused" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/cand_back_normal" />
+</selector>
diff --git a/res/drawable-hdpi/cand_back_1line.xml b/res/drawable-hdpi/cand_back_1line.xml
new file mode 100644
index 0000000..018eddb
--- /dev/null
+++ b/res/drawable-hdpi/cand_back_1line.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/cand_back_pressed" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/cand_back_focused" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/cand_back_normal_1line" />
+</selector>
diff --git a/res/drawable-hdpi/cand_back_focuse.xml b/res/drawable-hdpi/cand_back_focuse.xml
new file mode 100644
index 0000000..9f48c62
--- /dev/null
+++ b/res/drawable-hdpi/cand_back_focuse.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/cand_back_pressed" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/cand_back_focused" />
+</selector>
diff --git a/res/drawable-hdpi/cand_back_focused.9.png b/res/drawable-hdpi/cand_back_focused.9.png
new file mode 100644
index 0000000..0803b70
--- /dev/null
+++ b/res/drawable-hdpi/cand_back_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_back_normal.9.png b/res/drawable-hdpi/cand_back_normal.9.png
index c5c8d04..6b829f5 100644
--- a/res/drawable-hdpi/cand_back_normal.9.png
+++ b/res/drawable-hdpi/cand_back_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_back_normal_1line.9.png b/res/drawable-hdpi/cand_back_normal_1line.9.png
new file mode 100644
index 0000000..523e905
--- /dev/null
+++ b/res/drawable-hdpi/cand_back_normal_1line.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_down.png b/res/drawable-hdpi/cand_down.png
index 4122bdf..3a8e2e9 100644
--- a/res/drawable-hdpi/cand_down.png
+++ b/res/drawable-hdpi/cand_down.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_down_press.png b/res/drawable-hdpi/cand_down_press.png
index 4d38c28..1a61074 100644
--- a/res/drawable-hdpi/cand_down_press.png
+++ b/res/drawable-hdpi/cand_down_press.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_left.png b/res/drawable-hdpi/cand_left.png
new file mode 100644
index 0000000..e375f26
--- /dev/null
+++ b/res/drawable-hdpi/cand_left.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_right.png b/res/drawable-hdpi/cand_right.png
new file mode 100644
index 0000000..d38ae75
--- /dev/null
+++ b/res/drawable-hdpi/cand_right.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_tab.xml b/res/drawable-hdpi/cand_tab.xml
new file mode 100644
index 0000000..aed0a42
--- /dev/null
+++ b/res/drawable-hdpi/cand_tab.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tab_press" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/tab_select" />
+</selector>
diff --git a/res/drawable-hdpi/cand_tab_noselect.xml b/res/drawable-hdpi/cand_tab_noselect.xml
new file mode 100644
index 0000000..761da6e
--- /dev/null
+++ b/res/drawable-hdpi/cand_tab_noselect.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tab_press" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/tab_no_select" />
+</selector>
diff --git a/res/drawable-hdpi/cand_up.png b/res/drawable-hdpi/cand_up.png
index ce8b563..5774597 100644
--- a/res/drawable-hdpi/cand_up.png
+++ b/res/drawable-hdpi/cand_up.png
Binary files differ
diff --git a/res/drawable-hdpi/cand_up_press.png b/res/drawable-hdpi/cand_up_press.png
index cedbc9f..34a7979 100644
--- a/res/drawable-hdpi/cand_up_press.png
+++ b/res/drawable-hdpi/cand_up_press.png
Binary files differ
diff --git a/res/drawable-hdpi/candidate.png b/res/drawable-hdpi/candidate.png
new file mode 100644
index 0000000..e8f8f3f
--- /dev/null
+++ b/res/drawable-hdpi/candidate.png
Binary files differ
diff --git a/res/drawable-hdpi/candidate_top.9.png b/res/drawable-hdpi/candidate_top.9.png
new file mode 100644
index 0000000..fb6018f
--- /dev/null
+++ b/res/drawable-hdpi/candidate_top.9.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha0.png b/res/drawable-hdpi/key_12key_alpha0.png
index e3360d7..6b93bd0 100644
--- a/res/drawable-hdpi/key_12key_alpha0.png
+++ b/res/drawable-hdpi/key_12key_alpha0.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha0_b.png b/res/drawable-hdpi/key_12key_alpha0_b.png
index 2392459..2b0032f 100644
--- a/res/drawable-hdpi/key_12key_alpha0_b.png
+++ b/res/drawable-hdpi/key_12key_alpha0_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha1.png b/res/drawable-hdpi/key_12key_alpha1.png
index 559a0d5..1e3a2a4 100644
--- a/res/drawable-hdpi/key_12key_alpha1.png
+++ b/res/drawable-hdpi/key_12key_alpha1.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha1_b.png b/res/drawable-hdpi/key_12key_alpha1_b.png
index af2466e..4ac7bd3 100644
--- a/res/drawable-hdpi/key_12key_alpha1_b.png
+++ b/res/drawable-hdpi/key_12key_alpha1_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha2.png b/res/drawable-hdpi/key_12key_alpha2.png
index 970c4e4..3e37d05 100644
--- a/res/drawable-hdpi/key_12key_alpha2.png
+++ b/res/drawable-hdpi/key_12key_alpha2.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha2_b.png b/res/drawable-hdpi/key_12key_alpha2_b.png
index 2dd2897..2a23205 100644
--- a/res/drawable-hdpi/key_12key_alpha2_b.png
+++ b/res/drawable-hdpi/key_12key_alpha2_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha3.png b/res/drawable-hdpi/key_12key_alpha3.png
index c4c031f..e6212f0 100644
--- a/res/drawable-hdpi/key_12key_alpha3.png
+++ b/res/drawable-hdpi/key_12key_alpha3.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha3_b.png b/res/drawable-hdpi/key_12key_alpha3_b.png
index 2c12a40..51eefdf 100644
--- a/res/drawable-hdpi/key_12key_alpha3_b.png
+++ b/res/drawable-hdpi/key_12key_alpha3_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha4.png b/res/drawable-hdpi/key_12key_alpha4.png
index cd4d00c..60faf68 100644
--- a/res/drawable-hdpi/key_12key_alpha4.png
+++ b/res/drawable-hdpi/key_12key_alpha4.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha4_b.png b/res/drawable-hdpi/key_12key_alpha4_b.png
index 5b98435..b125b17 100644
--- a/res/drawable-hdpi/key_12key_alpha4_b.png
+++ b/res/drawable-hdpi/key_12key_alpha4_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha5.png b/res/drawable-hdpi/key_12key_alpha5.png
index 9f0e92b..3a597ca 100644
--- a/res/drawable-hdpi/key_12key_alpha5.png
+++ b/res/drawable-hdpi/key_12key_alpha5.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha5_b.png b/res/drawable-hdpi/key_12key_alpha5_b.png
index f214550..27d1bd9 100644
--- a/res/drawable-hdpi/key_12key_alpha5_b.png
+++ b/res/drawable-hdpi/key_12key_alpha5_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha6.png b/res/drawable-hdpi/key_12key_alpha6.png
index 10d970b..65cb606 100644
--- a/res/drawable-hdpi/key_12key_alpha6.png
+++ b/res/drawable-hdpi/key_12key_alpha6.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha6_b.png b/res/drawable-hdpi/key_12key_alpha6_b.png
index d3beae0..8a9b47f 100644
--- a/res/drawable-hdpi/key_12key_alpha6_b.png
+++ b/res/drawable-hdpi/key_12key_alpha6_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha7.png b/res/drawable-hdpi/key_12key_alpha7.png
index cbe3cc1..50eed41 100644
--- a/res/drawable-hdpi/key_12key_alpha7.png
+++ b/res/drawable-hdpi/key_12key_alpha7.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha7_b.png b/res/drawable-hdpi/key_12key_alpha7_b.png
index 6584b60..2de0fc3 100644
--- a/res/drawable-hdpi/key_12key_alpha7_b.png
+++ b/res/drawable-hdpi/key_12key_alpha7_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha8.png b/res/drawable-hdpi/key_12key_alpha8.png
index 793c005..a953908 100644
--- a/res/drawable-hdpi/key_12key_alpha8.png
+++ b/res/drawable-hdpi/key_12key_alpha8.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha8_b.png b/res/drawable-hdpi/key_12key_alpha8_b.png
index f8eed53..357c51d 100644
--- a/res/drawable-hdpi/key_12key_alpha8_b.png
+++ b/res/drawable-hdpi/key_12key_alpha8_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha9.png b/res/drawable-hdpi/key_12key_alpha9.png
index afb0d92..dd680c5 100644
--- a/res/drawable-hdpi/key_12key_alpha9.png
+++ b/res/drawable-hdpi/key_12key_alpha9.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_alpha9_b.png b/res/drawable-hdpi/key_12key_alpha9_b.png
index 7bdf491..1bdc3bc 100644
--- a/res/drawable-hdpi/key_12key_alpha9_b.png
+++ b/res/drawable-hdpi/key_12key_alpha9_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_caps.png b/res/drawable-hdpi/key_12key_caps.png
index a4f2885..1072b52 100644
--- a/res/drawable-hdpi/key_12key_caps.png
+++ b/res/drawable-hdpi/key_12key_caps.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_caps_b.png b/res/drawable-hdpi/key_12key_caps_b.png
index a4922e5..1072b52 100644
--- a/res/drawable-hdpi/key_12key_caps_b.png
+++ b/res/drawable-hdpi/key_12key_caps_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_dakuten.png b/res/drawable-hdpi/key_12key_dakuten.png
index 6bbf010..03d71da 100644
--- a/res/drawable-hdpi/key_12key_dakuten.png
+++ b/res/drawable-hdpi/key_12key_dakuten.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_dakuten_b.png b/res/drawable-hdpi/key_12key_dakuten_b.png
index d6e7505..dbc5224 100644
--- a/res/drawable-hdpi/key_12key_dakuten_b.png
+++ b/res/drawable-hdpi/key_12key_dakuten_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_del.png b/res/drawable-hdpi/key_12key_del.png
deleted file mode 100644
index fda82fa..0000000
--- a/res/drawable-hdpi/key_12key_del.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_del_b.png b/res/drawable-hdpi/key_12key_del_b.png
deleted file mode 100644
index e93f2e0..0000000
--- a/res/drawable-hdpi/key_12key_del_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_del_b_landscape.png b/res/drawable-hdpi/key_12key_del_b_landscape.png
deleted file mode 100644
index e183c93..0000000
--- a/res/drawable-hdpi/key_12key_del_b_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_del_landscape.png b/res/drawable-hdpi/key_12key_del_landscape.png
deleted file mode 100644
index b227fd4..0000000
--- a/res/drawable-hdpi/key_12key_del_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_eisukana.png b/res/drawable-hdpi/key_12key_eisukana.png
index 0cb9637..a025bcf 100644
--- a/res/drawable-hdpi/key_12key_eisukana.png
+++ b/res/drawable-hdpi/key_12key_eisukana.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_eisukana_b.png b/res/drawable-hdpi/key_12key_eisukana_b.png
index d6d8d30..5e84935 100644
--- a/res/drawable-hdpi/key_12key_eisukana_b.png
+++ b/res/drawable-hdpi/key_12key_eisukana_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter.png b/res/drawable-hdpi/key_12key_enter.png
deleted file mode 100644
index 4dae5b6..0000000
--- a/res/drawable-hdpi/key_12key_enter.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_b.png b/res/drawable-hdpi/key_12key_enter_b.png
deleted file mode 100644
index 6899036..0000000
--- a/res/drawable-hdpi/key_12key_enter_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_jp.png b/res/drawable-hdpi/key_12key_enter_jp.png
deleted file mode 100644
index 59ccc07..0000000
--- a/res/drawable-hdpi/key_12key_enter_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_jp_b.png b/res/drawable-hdpi/key_12key_enter_jp_b.png
deleted file mode 100644
index 3bb83f4..0000000
--- a/res/drawable-hdpi/key_12key_enter_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_landscape.png b/res/drawable-hdpi/key_12key_enter_landscape.png
deleted file mode 100644
index 9bf47ab..0000000
--- a/res/drawable-hdpi/key_12key_enter_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_landscape_b.png b/res/drawable-hdpi/key_12key_enter_landscape_b.png
deleted file mode 100644
index 98b2d99..0000000
--- a/res/drawable-hdpi/key_12key_enter_landscape_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_landscape_jp.png b/res/drawable-hdpi/key_12key_enter_landscape_jp.png
deleted file mode 100644
index fd98c6b..0000000
--- a/res/drawable-hdpi/key_12key_enter_landscape_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_enter_landscape_jp_b.png b/res/drawable-hdpi/key_12key_enter_landscape_jp_b.png
deleted file mode 100644
index af60064..0000000
--- a/res/drawable-hdpi/key_12key_enter_landscape_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana0.png b/res/drawable-hdpi/key_12key_hiragana0.png
index eb25b1c..ee91793 100644
--- a/res/drawable-hdpi/key_12key_hiragana0.png
+++ b/res/drawable-hdpi/key_12key_hiragana0.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana0_b.png b/res/drawable-hdpi/key_12key_hiragana0_b.png
index 2144788..87d2d46 100644
--- a/res/drawable-hdpi/key_12key_hiragana0_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana0_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana1.png b/res/drawable-hdpi/key_12key_hiragana1.png
index 32b51fa..c9dc92a 100644
--- a/res/drawable-hdpi/key_12key_hiragana1.png
+++ b/res/drawable-hdpi/key_12key_hiragana1.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana1_b.png b/res/drawable-hdpi/key_12key_hiragana1_b.png
index f5f21f0..8e4ed36 100644
--- a/res/drawable-hdpi/key_12key_hiragana1_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana1_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana2.png b/res/drawable-hdpi/key_12key_hiragana2.png
index f9ba3c6..ef4d7b6 100644
--- a/res/drawable-hdpi/key_12key_hiragana2.png
+++ b/res/drawable-hdpi/key_12key_hiragana2.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana2_b.png b/res/drawable-hdpi/key_12key_hiragana2_b.png
index d12cb7c..ba9713c 100644
--- a/res/drawable-hdpi/key_12key_hiragana2_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana2_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana3.png b/res/drawable-hdpi/key_12key_hiragana3.png
index 0b68d99..ae65c10 100644
--- a/res/drawable-hdpi/key_12key_hiragana3.png
+++ b/res/drawable-hdpi/key_12key_hiragana3.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana3_b.png b/res/drawable-hdpi/key_12key_hiragana3_b.png
index 13f7c56..bc212fc 100644
--- a/res/drawable-hdpi/key_12key_hiragana3_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana3_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana4.png b/res/drawable-hdpi/key_12key_hiragana4.png
index 5e8a855..c745d54 100644
--- a/res/drawable-hdpi/key_12key_hiragana4.png
+++ b/res/drawable-hdpi/key_12key_hiragana4.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana4_b.png b/res/drawable-hdpi/key_12key_hiragana4_b.png
index 3b9e352..b448f65 100644
--- a/res/drawable-hdpi/key_12key_hiragana4_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana4_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana5.png b/res/drawable-hdpi/key_12key_hiragana5.png
index 8c9361e..05d944b 100644
--- a/res/drawable-hdpi/key_12key_hiragana5.png
+++ b/res/drawable-hdpi/key_12key_hiragana5.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana5_b.png b/res/drawable-hdpi/key_12key_hiragana5_b.png
index 616b43d..118c56c 100644
--- a/res/drawable-hdpi/key_12key_hiragana5_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana5_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana6.png b/res/drawable-hdpi/key_12key_hiragana6.png
index 4912b4f..4447e2b 100644
--- a/res/drawable-hdpi/key_12key_hiragana6.png
+++ b/res/drawable-hdpi/key_12key_hiragana6.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana6_b.png b/res/drawable-hdpi/key_12key_hiragana6_b.png
index e92957a..5fcdfc2 100644
--- a/res/drawable-hdpi/key_12key_hiragana6_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana6_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana7.png b/res/drawable-hdpi/key_12key_hiragana7.png
index dbc5bc3..bc8d5e9 100644
--- a/res/drawable-hdpi/key_12key_hiragana7.png
+++ b/res/drawable-hdpi/key_12key_hiragana7.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana7_b.png b/res/drawable-hdpi/key_12key_hiragana7_b.png
index 2eab3f6..fff76cb 100644
--- a/res/drawable-hdpi/key_12key_hiragana7_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana7_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana8.png b/res/drawable-hdpi/key_12key_hiragana8.png
index 63e02c9..52c9e3b 100644
--- a/res/drawable-hdpi/key_12key_hiragana8.png
+++ b/res/drawable-hdpi/key_12key_hiragana8.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana8_b.png b/res/drawable-hdpi/key_12key_hiragana8_b.png
index 9389ced..1da4c2e 100644
--- a/res/drawable-hdpi/key_12key_hiragana8_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana8_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana9.png b/res/drawable-hdpi/key_12key_hiragana9.png
index 76fcf40..307509d 100644
--- a/res/drawable-hdpi/key_12key_hiragana9.png
+++ b/res/drawable-hdpi/key_12key_hiragana9.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_hiragana9_b.png b/res/drawable-hdpi/key_12key_hiragana9_b.png
index 15471e6..a09572a 100644
--- a/res/drawable-hdpi/key_12key_hiragana9_b.png
+++ b/res/drawable-hdpi/key_12key_hiragana9_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_left.png b/res/drawable-hdpi/key_12key_left.png
index 8adfc19..b04d095 100644
--- a/res/drawable-hdpi/key_12key_left.png
+++ b/res/drawable-hdpi/key_12key_left.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_left_b.png b/res/drawable-hdpi/key_12key_left_b.png
index 767f2d4..4df6446 100644
--- a/res/drawable-hdpi/key_12key_left_b.png
+++ b/res/drawable-hdpi/key_12key_left_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_alpha.png b/res/drawable-hdpi/key_12key_mode_full_alpha.png
deleted file mode 100644
index c875bf5..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_alpha_landscape.png b/res/drawable-hdpi/key_12key_mode_full_alpha_landscape.png
deleted file mode 100644
index 927d56b..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_alpha_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_kata.png b/res/drawable-hdpi/key_12key_mode_full_kata.png
deleted file mode 100644
index 6786f1c..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_kata_landscape.png b/res/drawable-hdpi/key_12key_mode_full_kata_landscape.png
deleted file mode 100644
index edd502c..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_kata_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_num.png b/res/drawable-hdpi/key_12key_mode_full_num.png
deleted file mode 100644
index d0699b5..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_full_num_landscape.png b/res/drawable-hdpi/key_12key_mode_full_num_landscape.png
deleted file mode 100644
index 7e286c5..0000000
--- a/res/drawable-hdpi/key_12key_mode_full_num_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_alpha.png b/res/drawable-hdpi/key_12key_mode_half_alpha.png
deleted file mode 100644
index 3f6d081..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_alpha_landscape.png b/res/drawable-hdpi/key_12key_mode_half_alpha_landscape.png
deleted file mode 100644
index c6f5245..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_alpha_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_kata.png b/res/drawable-hdpi/key_12key_mode_half_kata.png
deleted file mode 100644
index 296731a..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_kata_landscape.png b/res/drawable-hdpi/key_12key_mode_half_kata_landscape.png
deleted file mode 100644
index c8acb6d..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_kata_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_num.png b/res/drawable-hdpi/key_12key_mode_half_num.png
deleted file mode 100644
index 6172775..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_half_num_landscape.png b/res/drawable-hdpi/key_12key_mode_half_num_landscape.png
deleted file mode 100644
index fb2f61a..0000000
--- a/res/drawable-hdpi/key_12key_mode_half_num_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_hira.png b/res/drawable-hdpi/key_12key_mode_hira.png
deleted file mode 100644
index ea62e79..0000000
--- a/res/drawable-hdpi/key_12key_mode_hira.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_mode_hira_landscape.png b/res/drawable-hdpi/key_12key_mode_hira_landscape.png
deleted file mode 100644
index 9fd9d08..0000000
--- a/res/drawable-hdpi/key_12key_mode_hira_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_period_comma.png b/res/drawable-hdpi/key_12key_period_comma.png
index 8a4c7fc..71c2edc 100644
--- a/res/drawable-hdpi/key_12key_period_comma.png
+++ b/res/drawable-hdpi/key_12key_period_comma.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_period_comma_b.png b/res/drawable-hdpi/key_12key_period_comma_b.png
index 29fc223..ae0b110 100644
--- a/res/drawable-hdpi/key_12key_period_comma_b.png
+++ b/res/drawable-hdpi/key_12key_period_comma_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_pict_sym.png b/res/drawable-hdpi/key_12key_pict_sym.png
index 1121b98..a3f8105 100644
--- a/res/drawable-hdpi/key_12key_pict_sym.png
+++ b/res/drawable-hdpi/key_12key_pict_sym.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_reverse.png b/res/drawable-hdpi/key_12key_reverse.png
index f1e18c3..27d4635 100644
--- a/res/drawable-hdpi/key_12key_reverse.png
+++ b/res/drawable-hdpi/key_12key_reverse.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_reverse_b.png b/res/drawable-hdpi/key_12key_reverse_b.png
index 184c694..06bc8e9 100644
--- a/res/drawable-hdpi/key_12key_reverse_b.png
+++ b/res/drawable-hdpi/key_12key_reverse_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_right.png b/res/drawable-hdpi/key_12key_right.png
index 8cb8ee9..fdbb7d8 100644
--- a/res/drawable-hdpi/key_12key_right.png
+++ b/res/drawable-hdpi/key_12key_right.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_right_b.png b/res/drawable-hdpi/key_12key_right_b.png
index 61402c5..d0b2c75 100644
--- a/res/drawable-hdpi/key_12key_right_b.png
+++ b/res/drawable-hdpi/key_12key_right_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_space.png b/res/drawable-hdpi/key_12key_space.png
index 5ddbc1e..d1fd1b4 100644
--- a/res/drawable-hdpi/key_12key_space.png
+++ b/res/drawable-hdpi/key_12key_space.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_space_b.png b/res/drawable-hdpi/key_12key_space_b.png
index d51f357..729f558 100644
--- a/res/drawable-hdpi/key_12key_space_b.png
+++ b/res/drawable-hdpi/key_12key_space_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_space_jp.png b/res/drawable-hdpi/key_12key_space_jp.png
index 22932e5..cd05723 100644
--- a/res/drawable-hdpi/key_12key_space_jp.png
+++ b/res/drawable-hdpi/key_12key_space_jp.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_space_jp_b.png b/res/drawable-hdpi/key_12key_space_jp_b.png
index 54e8b19..95ed7ab 100644
--- a/res/drawable-hdpi/key_12key_space_jp_b.png
+++ b/res/drawable-hdpi/key_12key_space_jp_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_ten.png b/res/drawable-hdpi/key_12key_ten.png
index 62f6fc4..947686f 100644
--- a/res/drawable-hdpi/key_12key_ten.png
+++ b/res/drawable-hdpi/key_12key_ten.png
Binary files differ
diff --git a/res/drawable-hdpi/key_12key_ten_b.png b/res/drawable-hdpi/key_12key_ten_b.png
index a6a4d37..c8c2e0c 100644
--- a/res/drawable-hdpi/key_12key_ten_b.png
+++ b/res/drawable-hdpi/key_12key_ten_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_del.png b/res/drawable-hdpi/key_del.png
new file mode 100644
index 0000000..0b1bdf6
--- /dev/null
+++ b/res/drawable-hdpi/key_del.png
Binary files differ
diff --git a/res/drawable-hdpi/key_del_b.png b/res/drawable-hdpi/key_del_b.png
new file mode 100644
index 0000000..efa0204
--- /dev/null
+++ b/res/drawable-hdpi/key_del_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_enter.png b/res/drawable-hdpi/key_enter.png
new file mode 100644
index 0000000..87f37c5
--- /dev/null
+++ b/res/drawable-hdpi/key_enter.png
Binary files differ
diff --git a/res/drawable-hdpi/key_enter_b.png b/res/drawable-hdpi/key_enter_b.png
new file mode 100644
index 0000000..37b6b01
--- /dev/null
+++ b/res/drawable-hdpi/key_enter_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_change_b.png b/res/drawable-hdpi/key_mode_change_b.png
index 24abfd4..f8dda2a 100644
--- a/res/drawable-hdpi/key_mode_change_b.png
+++ b/res/drawable-hdpi/key_mode_change_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_full_alpha.png b/res/drawable-hdpi/key_mode_full_alpha.png
new file mode 100644
index 0000000..cf263ef
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_full_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_full_kata.png b/res/drawable-hdpi/key_mode_full_kata.png
new file mode 100644
index 0000000..400e2ca
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_full_kata.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_full_num.png b/res/drawable-hdpi/key_mode_full_num.png
new file mode 100644
index 0000000..8e97c4b
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_full_num.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_half_alpha.png b/res/drawable-hdpi/key_mode_half_alpha.png
new file mode 100644
index 0000000..440a9d3
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_half_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_half_kata.png b/res/drawable-hdpi/key_mode_half_kata.png
new file mode 100644
index 0000000..8cff2db
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_half_kata.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_half_num.png b/res/drawable-hdpi/key_mode_half_num.png
new file mode 100644
index 0000000..2e34935
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_half_num.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_hira.png b/res/drawable-hdpi/key_mode_hira.png
new file mode 100644
index 0000000..3de2cf2
--- /dev/null
+++ b/res/drawable-hdpi/key_mode_hira.png
Binary files differ
diff --git a/res/drawable-hdpi/key_mode_panel_kbd_12key_b.png b/res/drawable-hdpi/key_mode_panel_kbd_12key_b.png
index 7b0f7f0..2ed8f3d 100644
--- a/res/drawable-hdpi/key_mode_panel_kbd_12key_b.png
+++ b/res/drawable-hdpi/key_mode_panel_kbd_12key_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_pict_sym_b.png b/res/drawable-hdpi/key_pict_sym_b.png
new file mode 100644
index 0000000..e528ef9
--- /dev/null
+++ b/res/drawable-hdpi/key_pict_sym_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_del.png b/res/drawable-hdpi/key_qwerty_del.png
deleted file mode 100644
index c02e66c..0000000
--- a/res/drawable-hdpi/key_qwerty_del.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_del_b.png b/res/drawable-hdpi/key_qwerty_del_b.png
deleted file mode 100644
index df084c1..0000000
--- a/res/drawable-hdpi/key_qwerty_del_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_del_b_landscape.png b/res/drawable-hdpi/key_qwerty_del_b_landscape.png
deleted file mode 100644
index db71256..0000000
--- a/res/drawable-hdpi/key_qwerty_del_b_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_del_landscape.png b/res/drawable-hdpi/key_qwerty_del_landscape.png
deleted file mode 100644
index 2855634..0000000
--- a/res/drawable-hdpi/key_qwerty_del_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter.png b/res/drawable-hdpi/key_qwerty_enter.png
deleted file mode 100644
index 6243499..0000000
--- a/res/drawable-hdpi/key_qwerty_enter.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_b.png b/res/drawable-hdpi/key_qwerty_enter_b.png
deleted file mode 100644
index 2d38865..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_jp.png b/res/drawable-hdpi/key_qwerty_enter_jp.png
deleted file mode 100644
index 54c82b5..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_jp_b.png b/res/drawable-hdpi/key_qwerty_enter_jp_b.png
deleted file mode 100644
index b2fad3e..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_landscape.png b/res/drawable-hdpi/key_qwerty_enter_landscape.png
deleted file mode 100644
index fd0231c..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_landscape_b.png b/res/drawable-hdpi/key_qwerty_enter_landscape_b.png
deleted file mode 100644
index 574c896..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_landscape_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_landscape_jp.png b/res/drawable-hdpi/key_qwerty_enter_landscape_jp.png
deleted file mode 100644
index bb9d835..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_landscape_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_enter_landscape_jp_b.png b/res/drawable-hdpi/key_qwerty_enter_landscape_jp_b.png
deleted file mode 100644
index a43e717..0000000
--- a/res/drawable-hdpi/key_qwerty_enter_landscape_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_left.png b/res/drawable-hdpi/key_qwerty_left.png
new file mode 100644
index 0000000..1e6de0e
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_left.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_left_b.png b/res/drawable-hdpi/key_qwerty_left_b.png
new file mode 100644
index 0000000..1ef2ff4
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_left_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_alpha.png b/res/drawable-hdpi/key_qwerty_mode_full_alpha.png
deleted file mode 100644
index 004cd36..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_alpha_landscape.png b/res/drawable-hdpi/key_qwerty_mode_full_alpha_landscape.png
deleted file mode 100644
index a7152ad..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_alpha_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_kata.png b/res/drawable-hdpi/key_qwerty_mode_full_kata.png
deleted file mode 100644
index 1a37099..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_kata_landscape.png b/res/drawable-hdpi/key_qwerty_mode_full_kata_landscape.png
deleted file mode 100644
index d3a537e..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_kata_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_num.png b/res/drawable-hdpi/key_qwerty_mode_full_num.png
deleted file mode 100644
index 442b93d..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_full_num_landscape.png b/res/drawable-hdpi/key_qwerty_mode_full_num_landscape.png
deleted file mode 100644
index b0e530e..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_full_num_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_alpha.png b/res/drawable-hdpi/key_qwerty_mode_half_alpha.png
deleted file mode 100644
index 7d58689..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_alpha_landscape.png b/res/drawable-hdpi/key_qwerty_mode_half_alpha_landscape.png
deleted file mode 100644
index f87d42b..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_alpha_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_kata.png b/res/drawable-hdpi/key_qwerty_mode_half_kata.png
deleted file mode 100644
index 4c219a3..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_kata_landscape.png b/res/drawable-hdpi/key_qwerty_mode_half_kata_landscape.png
deleted file mode 100644
index 05eee0a..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_kata_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_num.png b/res/drawable-hdpi/key_qwerty_mode_half_num.png
deleted file mode 100644
index a181e33..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_half_num_landscape.png b/res/drawable-hdpi/key_qwerty_mode_half_num_landscape.png
deleted file mode 100644
index 2aec40b..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_half_num_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_hira.png b/res/drawable-hdpi/key_qwerty_mode_hira.png
deleted file mode 100644
index 077d7da..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_hira.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_mode_hira_landscape.png b/res/drawable-hdpi/key_qwerty_mode_hira_landscape.png
deleted file mode 100644
index 5d3fd29..0000000
--- a/res/drawable-hdpi/key_qwerty_mode_hira_landscape.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_pict_sym.png b/res/drawable-hdpi/key_qwerty_pict_sym.png
index 276fc9d..befaecb 100644
--- a/res/drawable-hdpi/key_qwerty_pict_sym.png
+++ b/res/drawable-hdpi/key_qwerty_pict_sym.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_pict_sym_b.png b/res/drawable-hdpi/key_qwerty_pict_sym_b.png
deleted file mode 100644
index 43472f2..0000000
--- a/res/drawable-hdpi/key_qwerty_pict_sym_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_return.png b/res/drawable-hdpi/key_qwerty_return.png
new file mode 100644
index 0000000..99fa13c
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_return.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_right.png b/res/drawable-hdpi/key_qwerty_right.png
new file mode 100644
index 0000000..0bf054c
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_right.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_right_b.png b/res/drawable-hdpi/key_qwerty_right_b.png
new file mode 100644
index 0000000..2a9d807
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_right_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_shift_b.png b/res/drawable-hdpi/key_qwerty_shift_b.png
index 73cbec8..8d9d8ed 100644
--- a/res/drawable-hdpi/key_qwerty_shift_b.png
+++ b/res/drawable-hdpi/key_qwerty_shift_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_shift_locked.png b/res/drawable-hdpi/key_qwerty_shift_locked.png
new file mode 100644
index 0000000..930a799
--- /dev/null
+++ b/res/drawable-hdpi/key_qwerty_shift_locked.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_space.png b/res/drawable-hdpi/key_qwerty_space.png
index a9bbdbe..74c4f3d 100644
--- a/res/drawable-hdpi/key_qwerty_space.png
+++ b/res/drawable-hdpi/key_qwerty_space.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_space_b.png b/res/drawable-hdpi/key_qwerty_space_b.png
index 0cbaf57..b0b9acf 100644
--- a/res/drawable-hdpi/key_qwerty_space_b.png
+++ b/res/drawable-hdpi/key_qwerty_space_b.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_space_conv.png b/res/drawable-hdpi/key_qwerty_space_conv.png
index e120c85..e66a564 100644
--- a/res/drawable-hdpi/key_qwerty_space_conv.png
+++ b/res/drawable-hdpi/key_qwerty_space_conv.png
Binary files differ
diff --git a/res/drawable-hdpi/key_qwerty_space_conv_b.png b/res/drawable-hdpi/key_qwerty_space_conv_b.png
index f79e545..30f65f0 100644
--- a/res/drawable-hdpi/key_qwerty_space_conv_b.png
+++ b/res/drawable-hdpi/key_qwerty_space_conv_b.png
Binary files differ
diff --git a/res/drawable-hdpi/keybg_ice_bg.png b/res/drawable-hdpi/keybg_ice_bg.png
new file mode 100644
index 0000000..3b5f87a
--- /dev/null
+++ b/res/drawable-hdpi/keybg_ice_bg.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_background.png b/res/drawable-hdpi/keyboard_background.png
new file mode 100644
index 0000000..8b8bb8c
--- /dev/null
+++ b/res/drawable-hdpi/keyboard_background.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/res/drawable-hdpi/keyboard_key_feedback_background.9.png
new file mode 100644
index 0000000..af33c73
--- /dev/null
+++ b/res/drawable-hdpi/keyboard_key_feedback_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png b/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
new file mode 100644
index 0000000..428fa90
--- /dev/null
+++ b/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_popup_panel_background.9.png b/res/drawable-hdpi/keyboard_popup_panel_background.9.png
new file mode 100644
index 0000000..36d75df
--- /dev/null
+++ b/res/drawable-hdpi/keyboard_popup_panel_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tab_no_select.9.png b/res/drawable-hdpi/tab_no_select.9.png
new file mode 100644
index 0000000..d5f4ba4
--- /dev/null
+++ b/res/drawable-hdpi/tab_no_select.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tab_press.9.png b/res/drawable-hdpi/tab_press.9.png
new file mode 100644
index 0000000..4eeda4d
--- /dev/null
+++ b/res/drawable-hdpi/tab_press.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tab_select.9.png b/res/drawable-hdpi/tab_select.9.png
new file mode 100644
index 0000000..20f9b5f
--- /dev/null
+++ b/res/drawable-hdpi/tab_select.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tutorial_12key_enter.png b/res/drawable-hdpi/tutorial_12key_enter.png
index 283883f..a30a8f3 100644
--- a/res/drawable-hdpi/tutorial_12key_enter.png
+++ b/res/drawable-hdpi/tutorial_12key_enter.png
Binary files differ
diff --git a/res/drawable-hdpi/tutorial_12key_mode.png b/res/drawable-hdpi/tutorial_12key_mode.png
index 05066f9..d5cb55a 100644
--- a/res/drawable-hdpi/tutorial_12key_mode.png
+++ b/res/drawable-hdpi/tutorial_12key_mode.png
Binary files differ
diff --git a/res/drawable-ja/tutorial_12key_mode.png b/res/drawable-ja/tutorial_12key_mode.png
index d287c13..15d9a4c 100644
--- a/res/drawable-ja/tutorial_12key_mode.png
+++ b/res/drawable-ja/tutorial_12key_mode.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/cand_tab.xml b/res/drawable-sw768dp-hdpi/cand_tab.xml
new file mode 100644
index 0000000..aed0a42
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/cand_tab.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tab_press" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/tab_select" />
+</selector>
diff --git a/res/drawable-sw768dp-hdpi/cand_tab_noselect.xml b/res/drawable-sw768dp-hdpi/cand_tab_noselect.xml
new file mode 100644
index 0000000..761da6e
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/cand_tab_noselect.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tab_press" />
+    <item android:state_pressed="false"
+          android:drawable="@drawable/tab_no_select" />
+</selector>
diff --git a/res/drawable-sw768dp-hdpi/key_del.png b/res/drawable-sw768dp-hdpi/key_del.png
new file mode 100644
index 0000000..7c12f79
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/key_del.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/key_qwerty_shift.png b/res/drawable-sw768dp-hdpi/key_qwerty_shift.png
new file mode 100644
index 0000000..ade2134
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/key_qwerty_shift.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/key_qwerty_shift_locked.png b/res/drawable-sw768dp-hdpi/key_qwerty_shift_locked.png
new file mode 100644
index 0000000..9e9b999
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/key_qwerty_shift_locked.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/tab_no_select.9.png b/res/drawable-sw768dp-hdpi/tab_no_select.9.png
new file mode 100644
index 0000000..d1179e4
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/tab_no_select.9.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/tab_press.9.png b/res/drawable-sw768dp-hdpi/tab_press.9.png
new file mode 100644
index 0000000..2f491b1
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/tab_press.9.png
Binary files differ
diff --git a/res/drawable-sw768dp-hdpi/tab_select.9.png b/res/drawable-sw768dp-hdpi/tab_select.9.png
new file mode 100644
index 0000000..de538cc
--- /dev/null
+++ b/res/drawable-sw768dp-hdpi/tab_select.9.png
Binary files differ
diff --git a/res/drawable-sw768dp-land-hdpi/key_qwerty_shift.png b/res/drawable-sw768dp-land-hdpi/key_qwerty_shift.png
new file mode 100644
index 0000000..906b713
--- /dev/null
+++ b/res/drawable-sw768dp-land-hdpi/key_qwerty_shift.png
Binary files differ
diff --git a/res/drawable-sw768dp-land-hdpi/key_qwerty_shift_locked.png b/res/drawable-sw768dp-land-hdpi/key_qwerty_shift_locked.png
new file mode 100644
index 0000000..376f584
--- /dev/null
+++ b/res/drawable-sw768dp-land-hdpi/key_qwerty_shift_locked.png
Binary files differ
diff --git a/res/drawable-sw768dp/btn_keyboard_key.xml b/res/drawable-sw768dp/btn_keyboard_key.xml
new file mode 100644
index 0000000..2708442
--- /dev/null
+++ b/res/drawable-sw768dp/btn_keyboard_key.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_light_pressed_holo" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal" />
+ 
+</selector>
diff --git a/res/drawable-sw768dp/btn_keyboard_key_2nd.xml b/res/drawable-sw768dp/btn_keyboard_key_2nd.xml
new file mode 100644
index 0000000..e9b116e
--- /dev/null
+++ b/res/drawable-sw768dp/btn_keyboard_key_2nd.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+
+    <item android:state_checkable="true" android:state_checked="true"
+          android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" />
+    <item android:state_checkable="true" android:state_checked="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_on_2nd" />
+
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal_2nd" />
+ 
+</selector>
diff --git a/res/drawable-sw768dp/btn_keyboard_key_normal.9.png b/res/drawable-sw768dp/btn_keyboard_key_normal.9.png
new file mode 100644
index 0000000..cae8062
--- /dev/null
+++ b/res/drawable-sw768dp/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-sw768dp/cand_back_normal.9.png b/res/drawable-sw768dp/cand_back_normal.9.png
new file mode 100644
index 0000000..523e905
--- /dev/null
+++ b/res/drawable-sw768dp/cand_back_normal.9.png
Binary files differ
diff --git a/res/drawable-sw768dp/cand_back_pressed.9.png b/res/drawable-sw768dp/cand_back_pressed.9.png
new file mode 100644
index 0000000..2c4f82c
--- /dev/null
+++ b/res/drawable-sw768dp/cand_back_pressed.9.png
Binary files differ
diff --git a/res/drawable-sw768dp/key_mode_full_num.png b/res/drawable-sw768dp/key_mode_full_num.png
new file mode 100644
index 0000000..4f7125b
--- /dev/null
+++ b/res/drawable-sw768dp/key_mode_full_num.png
Binary files differ
diff --git a/res/drawable-sw768dp/key_mode_half_alpha.png b/res/drawable-sw768dp/key_mode_half_alpha.png
new file mode 100644
index 0000000..c035b55
--- /dev/null
+++ b/res/drawable-sw768dp/key_mode_half_alpha.png
Binary files differ
diff --git a/res/drawable-sw768dp/key_mode_half_num.png b/res/drawable-sw768dp/key_mode_half_num.png
new file mode 100644
index 0000000..b709eed
--- /dev/null
+++ b/res/drawable-sw768dp/key_mode_half_num.png
Binary files differ
diff --git a/res/drawable-sw768dp/key_mode_hira.png b/res/drawable-sw768dp/key_mode_hira.png
new file mode 100644
index 0000000..7c9442f
--- /dev/null
+++ b/res/drawable-sw768dp/key_mode_hira.png
Binary files differ
diff --git a/res/drawable-sw768dp/keyboard_background.png b/res/drawable-sw768dp/keyboard_background.png
new file mode 100644
index 0000000..250d1e9
--- /dev/null
+++ b/res/drawable-sw768dp/keyboard_background.png
Binary files differ
diff --git a/res/drawable/btn_close.xml b/res/drawable/btn_close.xml
new file mode 100644
index 0000000..5af18f3
--- /dev/null
+++ b/res/drawable/btn_close.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="false"
+        android:drawable="@drawable/btn_close_normal" />
+
+    <item android:state_pressed="true"
+        android:drawable="@drawable/btn_close_pressed" />
+
+</selector>
diff --git a/res/drawable/btn_close_normal.png b/res/drawable/btn_close_normal.png
new file mode 100644
index 0000000..06639c4
--- /dev/null
+++ b/res/drawable/btn_close_normal.png
Binary files differ
diff --git a/res/drawable/btn_close_pressed.png b/res/drawable/btn_close_pressed.png
new file mode 100644
index 0000000..3791da4
--- /dev/null
+++ b/res/drawable/btn_close_pressed.png
Binary files differ
diff --git a/res/drawable/btn_keyboard_key.xml b/res/drawable/btn_keyboard_key.xml
new file mode 100644
index 0000000..5b3b4b1
--- /dev/null
+++ b/res/drawable/btn_keyboard_key.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+ 
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal" />
+ 
+</selector>
diff --git a/res/drawable/btn_keyboard_key_2nd.xml b/res/drawable/btn_keyboard_key_2nd.xml
new file mode 100644
index 0000000..8f3ff83
--- /dev/null
+++ b/res/drawable/btn_keyboard_key_2nd.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Toggle keys. Use checkable/checked state. -->
+
+    <item android:state_checkable="true" android:state_checked="true" 
+          android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed_on_2nd" />
+    <item android:state_checkable="true" android:state_checked="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_on_2nd" />
+
+    <!-- Normal keys -->
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed_2nd" />
+    <item
+          android:drawable="@drawable/btn_keyboard_key_normal_2nd" />
+ 
+</selector>
diff --git a/res/drawable/cand_back.xml b/res/drawable/cand_back.xml
index a06d2b3..1049d58 100644
--- a/res/drawable/cand_back.xml
+++ b/res/drawable/cand_back.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -14,10 +14,11 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true" 
           android:drawable="@drawable/cand_back_pressed" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/cand_back_focused" />
     <item android:state_pressed="false"
           android:drawable="@drawable/cand_back_normal" />
 </selector>
diff --git a/res/drawable/cand_back_normal.9.png b/res/drawable/cand_back_normal.9.png
index 4ed524b..6b829f5 100644
--- a/res/drawable/cand_back_normal.9.png
+++ b/res/drawable/cand_back_normal.9.png
Binary files differ
diff --git a/res/drawable/cand_down.png b/res/drawable/cand_down.png
deleted file mode 100644
index e73aad2..0000000
--- a/res/drawable/cand_down.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/cand_down_press.png b/res/drawable/cand_down_press.png
deleted file mode 100644
index cb72e57..0000000
--- a/res/drawable/cand_down_press.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/cand_up.png b/res/drawable/cand_up.png
deleted file mode 100644
index 17b59f4..0000000
--- a/res/drawable/cand_up.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/cand_up_press.png b/res/drawable/cand_up_press.png
deleted file mode 100644
index e89d647..0000000
--- a/res/drawable/cand_up_press.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/candidate.png b/res/drawable/candidate.png
index e8f8f3f..a08b624 100644
--- a/res/drawable/candidate.png
+++ b/res/drawable/candidate.png
Binary files differ
diff --git a/res/drawable/candidate_top.9.png b/res/drawable/candidate_top.9.png
new file mode 100644
index 0000000..fb6018f
--- /dev/null
+++ b/res/drawable/candidate_top.9.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha0.png b/res/drawable/key_12key_alpha0.png
index af50aae..b410229 100644
--- a/res/drawable/key_12key_alpha0.png
+++ b/res/drawable/key_12key_alpha0.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha0_b.png b/res/drawable/key_12key_alpha0_b.png
index ee99d6c..412be11 100644
--- a/res/drawable/key_12key_alpha0_b.png
+++ b/res/drawable/key_12key_alpha0_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha1.png b/res/drawable/key_12key_alpha1.png
index ede30b2..a7f5a15 100644
--- a/res/drawable/key_12key_alpha1.png
+++ b/res/drawable/key_12key_alpha1.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha1_b.png b/res/drawable/key_12key_alpha1_b.png
index 430bec9..6ff54c6 100644
--- a/res/drawable/key_12key_alpha1_b.png
+++ b/res/drawable/key_12key_alpha1_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha2.png b/res/drawable/key_12key_alpha2.png
index 6c549fc..a26b135 100644
--- a/res/drawable/key_12key_alpha2.png
+++ b/res/drawable/key_12key_alpha2.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha2_b.png b/res/drawable/key_12key_alpha2_b.png
index 83f5924..914b3a3 100644
--- a/res/drawable/key_12key_alpha2_b.png
+++ b/res/drawable/key_12key_alpha2_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha3.png b/res/drawable/key_12key_alpha3.png
index 2690655..4f35c42 100644
--- a/res/drawable/key_12key_alpha3.png
+++ b/res/drawable/key_12key_alpha3.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha3_b.png b/res/drawable/key_12key_alpha3_b.png
index 7bd55a8..d1c0221 100644
--- a/res/drawable/key_12key_alpha3_b.png
+++ b/res/drawable/key_12key_alpha3_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha4.png b/res/drawable/key_12key_alpha4.png
index 6f0cfb8..296d379 100644
--- a/res/drawable/key_12key_alpha4.png
+++ b/res/drawable/key_12key_alpha4.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha4_b.png b/res/drawable/key_12key_alpha4_b.png
index 2c5a17c..b77e854 100644
--- a/res/drawable/key_12key_alpha4_b.png
+++ b/res/drawable/key_12key_alpha4_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha5.png b/res/drawable/key_12key_alpha5.png
index 232f4a4..375c2ad 100644
--- a/res/drawable/key_12key_alpha5.png
+++ b/res/drawable/key_12key_alpha5.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha5_b.png b/res/drawable/key_12key_alpha5_b.png
index 231b56a..d700050 100644
--- a/res/drawable/key_12key_alpha5_b.png
+++ b/res/drawable/key_12key_alpha5_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha6.png b/res/drawable/key_12key_alpha6.png
index 0455f97..e0112a7 100644
--- a/res/drawable/key_12key_alpha6.png
+++ b/res/drawable/key_12key_alpha6.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha6_b.png b/res/drawable/key_12key_alpha6_b.png
index 51fa129..7953ec9 100644
--- a/res/drawable/key_12key_alpha6_b.png
+++ b/res/drawable/key_12key_alpha6_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha7.png b/res/drawable/key_12key_alpha7.png
index 4409532..ed2bbff 100644
--- a/res/drawable/key_12key_alpha7.png
+++ b/res/drawable/key_12key_alpha7.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha7_b.png b/res/drawable/key_12key_alpha7_b.png
index 1d5d1e3..621a06e 100644
--- a/res/drawable/key_12key_alpha7_b.png
+++ b/res/drawable/key_12key_alpha7_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha8.png b/res/drawable/key_12key_alpha8.png
index 6cffeab..997dbc8 100644
--- a/res/drawable/key_12key_alpha8.png
+++ b/res/drawable/key_12key_alpha8.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha8_b.png b/res/drawable/key_12key_alpha8_b.png
index d077856..e565042 100644
--- a/res/drawable/key_12key_alpha8_b.png
+++ b/res/drawable/key_12key_alpha8_b.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha9.png b/res/drawable/key_12key_alpha9.png
index 7dd05f9..d87b8b8 100644
--- a/res/drawable/key_12key_alpha9.png
+++ b/res/drawable/key_12key_alpha9.png
Binary files differ
diff --git a/res/drawable/key_12key_alpha9_b.png b/res/drawable/key_12key_alpha9_b.png
index 1f7a23e..705d7a5 100644
--- a/res/drawable/key_12key_alpha9_b.png
+++ b/res/drawable/key_12key_alpha9_b.png
Binary files differ
diff --git a/res/drawable/key_12key_caps.png b/res/drawable/key_12key_caps.png
index d0c52c2..8ea679d 100644
--- a/res/drawable/key_12key_caps.png
+++ b/res/drawable/key_12key_caps.png
Binary files differ
diff --git a/res/drawable/key_12key_caps_b.png b/res/drawable/key_12key_caps_b.png
index 19b8d2d..8ea679d 100644
--- a/res/drawable/key_12key_caps_b.png
+++ b/res/drawable/key_12key_caps_b.png
Binary files differ
diff --git a/res/drawable/key_12key_dakuten.png b/res/drawable/key_12key_dakuten.png
index 8e979cc..74f0006 100644
--- a/res/drawable/key_12key_dakuten.png
+++ b/res/drawable/key_12key_dakuten.png
Binary files differ
diff --git a/res/drawable/key_12key_dakuten_b.png b/res/drawable/key_12key_dakuten_b.png
index 5b850bf..3f5888c 100644
--- a/res/drawable/key_12key_dakuten_b.png
+++ b/res/drawable/key_12key_dakuten_b.png
Binary files differ
diff --git a/res/drawable/key_12key_del.png b/res/drawable/key_12key_del.png
deleted file mode 100644
index 4aab087..0000000
--- a/res/drawable/key_12key_del.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_del_b.png b/res/drawable/key_12key_del_b.png
deleted file mode 100644
index ecc2dba..0000000
--- a/res/drawable/key_12key_del_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_eisukana.png b/res/drawable/key_12key_eisukana.png
index b28c9cd..ce46f19 100644
--- a/res/drawable/key_12key_eisukana.png
+++ b/res/drawable/key_12key_eisukana.png
Binary files differ
diff --git a/res/drawable/key_12key_eisukana_b.png b/res/drawable/key_12key_eisukana_b.png
index 805c5ea..ce46f19 100644
--- a/res/drawable/key_12key_eisukana_b.png
+++ b/res/drawable/key_12key_eisukana_b.png
Binary files differ
diff --git a/res/drawable/key_12key_enter.png b/res/drawable/key_12key_enter.png
deleted file mode 100644
index b2e729b..0000000
--- a/res/drawable/key_12key_enter.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_enter_b.png b/res/drawable/key_12key_enter_b.png
deleted file mode 100644
index d26baa6..0000000
--- a/res/drawable/key_12key_enter_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_enter_jp.png b/res/drawable/key_12key_enter_jp.png
deleted file mode 100644
index aeb461b..0000000
--- a/res/drawable/key_12key_enter_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_enter_jp_b.png b/res/drawable/key_12key_enter_jp_b.png
deleted file mode 100644
index 784a7e9..0000000
--- a/res/drawable/key_12key_enter_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_hiragana0.png b/res/drawable/key_12key_hiragana0.png
index 6c039d0..b704165 100644
--- a/res/drawable/key_12key_hiragana0.png
+++ b/res/drawable/key_12key_hiragana0.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana0_b.png b/res/drawable/key_12key_hiragana0_b.png
index 9baf830..4e96294 100644
--- a/res/drawable/key_12key_hiragana0_b.png
+++ b/res/drawable/key_12key_hiragana0_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana1.png b/res/drawable/key_12key_hiragana1.png
index ff33fd5..253f43f 100644
--- a/res/drawable/key_12key_hiragana1.png
+++ b/res/drawable/key_12key_hiragana1.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana1_b.png b/res/drawable/key_12key_hiragana1_b.png
index 5415e4b..918d282 100644
--- a/res/drawable/key_12key_hiragana1_b.png
+++ b/res/drawable/key_12key_hiragana1_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana2.png b/res/drawable/key_12key_hiragana2.png
index 2338b39..d4551b1 100644
--- a/res/drawable/key_12key_hiragana2.png
+++ b/res/drawable/key_12key_hiragana2.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana2_b.png b/res/drawable/key_12key_hiragana2_b.png
index 81b3c0b..e945c7f 100644
--- a/res/drawable/key_12key_hiragana2_b.png
+++ b/res/drawable/key_12key_hiragana2_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana3.png b/res/drawable/key_12key_hiragana3.png
index 6508763..0a3ee62 100644
--- a/res/drawable/key_12key_hiragana3.png
+++ b/res/drawable/key_12key_hiragana3.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana3_b.png b/res/drawable/key_12key_hiragana3_b.png
index 7b0173f..1fba929 100644
--- a/res/drawable/key_12key_hiragana3_b.png
+++ b/res/drawable/key_12key_hiragana3_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana4.png b/res/drawable/key_12key_hiragana4.png
index 79d9a03..d544396 100644
--- a/res/drawable/key_12key_hiragana4.png
+++ b/res/drawable/key_12key_hiragana4.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana4_b.png b/res/drawable/key_12key_hiragana4_b.png
index d34f52d..3faa527 100644
--- a/res/drawable/key_12key_hiragana4_b.png
+++ b/res/drawable/key_12key_hiragana4_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana5.png b/res/drawable/key_12key_hiragana5.png
index 62769a2..e9f101f 100644
--- a/res/drawable/key_12key_hiragana5.png
+++ b/res/drawable/key_12key_hiragana5.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana5_b.png b/res/drawable/key_12key_hiragana5_b.png
index c5bbc38..0613ceb 100644
--- a/res/drawable/key_12key_hiragana5_b.png
+++ b/res/drawable/key_12key_hiragana5_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana6.png b/res/drawable/key_12key_hiragana6.png
index a130fb8..64c0121 100644
--- a/res/drawable/key_12key_hiragana6.png
+++ b/res/drawable/key_12key_hiragana6.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana6_b.png b/res/drawable/key_12key_hiragana6_b.png
index f2d1246..61497dc 100644
--- a/res/drawable/key_12key_hiragana6_b.png
+++ b/res/drawable/key_12key_hiragana6_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana7.png b/res/drawable/key_12key_hiragana7.png
index f74e52a..6755d26 100644
--- a/res/drawable/key_12key_hiragana7.png
+++ b/res/drawable/key_12key_hiragana7.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana7_b.png b/res/drawable/key_12key_hiragana7_b.png
index 8246602..70f147e 100644
--- a/res/drawable/key_12key_hiragana7_b.png
+++ b/res/drawable/key_12key_hiragana7_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana8.png b/res/drawable/key_12key_hiragana8.png
index f2a3fdb..fd64e15 100644
--- a/res/drawable/key_12key_hiragana8.png
+++ b/res/drawable/key_12key_hiragana8.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana8_b.png b/res/drawable/key_12key_hiragana8_b.png
index 8ddf7b4..478c68b 100644
--- a/res/drawable/key_12key_hiragana8_b.png
+++ b/res/drawable/key_12key_hiragana8_b.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana9.png b/res/drawable/key_12key_hiragana9.png
index 35a2129..d34d476 100644
--- a/res/drawable/key_12key_hiragana9.png
+++ b/res/drawable/key_12key_hiragana9.png
Binary files differ
diff --git a/res/drawable/key_12key_hiragana9_b.png b/res/drawable/key_12key_hiragana9_b.png
index 516f847..b79d5e0 100644
--- a/res/drawable/key_12key_hiragana9_b.png
+++ b/res/drawable/key_12key_hiragana9_b.png
Binary files differ
diff --git a/res/drawable/key_12key_left.png b/res/drawable/key_12key_left.png
index d604272..f177aad 100644
--- a/res/drawable/key_12key_left.png
+++ b/res/drawable/key_12key_left.png
Binary files differ
diff --git a/res/drawable/key_12key_left_b.png b/res/drawable/key_12key_left_b.png
index 02fc93b..f177aad 100644
--- a/res/drawable/key_12key_left_b.png
+++ b/res/drawable/key_12key_left_b.png
Binary files differ
diff --git a/res/drawable/key_12key_mode_full_alpha.png b/res/drawable/key_12key_mode_full_alpha.png
deleted file mode 100644
index fd4f880..0000000
--- a/res/drawable/key_12key_mode_full_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_full_kata.png b/res/drawable/key_12key_mode_full_kata.png
deleted file mode 100644
index 81b66e2..0000000
--- a/res/drawable/key_12key_mode_full_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_full_num.png b/res/drawable/key_12key_mode_full_num.png
deleted file mode 100644
index dc929a1..0000000
--- a/res/drawable/key_12key_mode_full_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_half_alpha.png b/res/drawable/key_12key_mode_half_alpha.png
deleted file mode 100644
index 4bf6f99..0000000
--- a/res/drawable/key_12key_mode_half_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_half_kata.png b/res/drawable/key_12key_mode_half_kata.png
deleted file mode 100644
index 322341a..0000000
--- a/res/drawable/key_12key_mode_half_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_half_num.png b/res/drawable/key_12key_mode_half_num.png
deleted file mode 100644
index 68a8760..0000000
--- a/res/drawable/key_12key_mode_half_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_mode_hira.png b/res/drawable/key_12key_mode_hira.png
deleted file mode 100644
index 9eb8584..0000000
--- a/res/drawable/key_12key_mode_hira.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_12key_period_comma.png b/res/drawable/key_12key_period_comma.png
index d0fdb93..4ed6144 100644
--- a/res/drawable/key_12key_period_comma.png
+++ b/res/drawable/key_12key_period_comma.png
Binary files differ
diff --git a/res/drawable/key_12key_period_comma_b.png b/res/drawable/key_12key_period_comma_b.png
index aa9ad02..d971689 100644
--- a/res/drawable/key_12key_period_comma_b.png
+++ b/res/drawable/key_12key_period_comma_b.png
Binary files differ
diff --git a/res/drawable/key_12key_pict_sym.png b/res/drawable/key_12key_pict_sym.png
index a4845e5..6b7c365 100644
--- a/res/drawable/key_12key_pict_sym.png
+++ b/res/drawable/key_12key_pict_sym.png
Binary files differ
diff --git a/res/drawable/key_12key_reverse.png b/res/drawable/key_12key_reverse.png
index dd40bd9..ace5fb5 100644
--- a/res/drawable/key_12key_reverse.png
+++ b/res/drawable/key_12key_reverse.png
Binary files differ
diff --git a/res/drawable/key_12key_reverse_b.png b/res/drawable/key_12key_reverse_b.png
index 6d96fa3..ace5fb5 100644
--- a/res/drawable/key_12key_reverse_b.png
+++ b/res/drawable/key_12key_reverse_b.png
Binary files differ
diff --git a/res/drawable/key_12key_right.png b/res/drawable/key_12key_right.png
index 94a288b..a9863ff 100644
--- a/res/drawable/key_12key_right.png
+++ b/res/drawable/key_12key_right.png
Binary files differ
diff --git a/res/drawable/key_12key_right_b.png b/res/drawable/key_12key_right_b.png
index 06e21d0..a9863ff 100644
--- a/res/drawable/key_12key_right_b.png
+++ b/res/drawable/key_12key_right_b.png
Binary files differ
diff --git a/res/drawable/key_12key_space.png b/res/drawable/key_12key_space.png
index d67c898..14826ca 100644
--- a/res/drawable/key_12key_space.png
+++ b/res/drawable/key_12key_space.png
Binary files differ
diff --git a/res/drawable/key_12key_space_b.png b/res/drawable/key_12key_space_b.png
index 35d1b19..14826ca 100644
--- a/res/drawable/key_12key_space_b.png
+++ b/res/drawable/key_12key_space_b.png
Binary files differ
diff --git a/res/drawable/key_12key_space_jp.png b/res/drawable/key_12key_space_jp.png
index 4735e01..ec76075 100644
--- a/res/drawable/key_12key_space_jp.png
+++ b/res/drawable/key_12key_space_jp.png
Binary files differ
diff --git a/res/drawable/key_12key_space_jp_b.png b/res/drawable/key_12key_space_jp_b.png
index 0dc5206..ec76075 100644
--- a/res/drawable/key_12key_space_jp_b.png
+++ b/res/drawable/key_12key_space_jp_b.png
Binary files differ
diff --git a/res/drawable/key_12key_ten.png b/res/drawable/key_12key_ten.png
index 7d93f4f..08e68a0 100644
--- a/res/drawable/key_12key_ten.png
+++ b/res/drawable/key_12key_ten.png
Binary files differ
diff --git a/res/drawable/key_12key_ten_b.png b/res/drawable/key_12key_ten_b.png
index f65bb2e..e5b2d11 100644
--- a/res/drawable/key_12key_ten_b.png
+++ b/res/drawable/key_12key_ten_b.png
Binary files differ
diff --git a/res/drawable/key_del.png b/res/drawable/key_del.png
new file mode 100644
index 0000000..3a8792a
--- /dev/null
+++ b/res/drawable/key_del.png
Binary files differ
diff --git a/res/drawable/key_del_b.png b/res/drawable/key_del_b.png
new file mode 100644
index 0000000..3a8792a
--- /dev/null
+++ b/res/drawable/key_del_b.png
Binary files differ
diff --git a/res/drawable/key_enter.png b/res/drawable/key_enter.png
new file mode 100644
index 0000000..0e2d072
--- /dev/null
+++ b/res/drawable/key_enter.png
Binary files differ
diff --git a/res/drawable/key_enter_b.png b/res/drawable/key_enter_b.png
new file mode 100644
index 0000000..0e2d072
--- /dev/null
+++ b/res/drawable/key_enter_b.png
Binary files differ
diff --git a/res/drawable/key_mode_change_b.png b/res/drawable/key_mode_change_b.png
index 58159d9..e18517c 100644
--- a/res/drawable/key_mode_change_b.png
+++ b/res/drawable/key_mode_change_b.png
Binary files differ
diff --git a/res/drawable/key_mode_full_alpha.png b/res/drawable/key_mode_full_alpha.png
new file mode 100644
index 0000000..3c2a0eb
--- /dev/null
+++ b/res/drawable/key_mode_full_alpha.png
Binary files differ
diff --git a/res/drawable/key_mode_full_kata.png b/res/drawable/key_mode_full_kata.png
new file mode 100644
index 0000000..899a546
--- /dev/null
+++ b/res/drawable/key_mode_full_kata.png
Binary files differ
diff --git a/res/drawable/key_mode_full_num.png b/res/drawable/key_mode_full_num.png
new file mode 100644
index 0000000..dcd3637
--- /dev/null
+++ b/res/drawable/key_mode_full_num.png
Binary files differ
diff --git a/res/drawable/key_mode_half_alpha.png b/res/drawable/key_mode_half_alpha.png
new file mode 100644
index 0000000..f620a1a
--- /dev/null
+++ b/res/drawable/key_mode_half_alpha.png
Binary files differ
diff --git a/res/drawable/key_mode_half_kata.png b/res/drawable/key_mode_half_kata.png
new file mode 100644
index 0000000..f0682fb
--- /dev/null
+++ b/res/drawable/key_mode_half_kata.png
Binary files differ
diff --git a/res/drawable/key_mode_half_num.png b/res/drawable/key_mode_half_num.png
new file mode 100644
index 0000000..913c5c5
--- /dev/null
+++ b/res/drawable/key_mode_half_num.png
Binary files differ
diff --git a/res/drawable/key_mode_hira.png b/res/drawable/key_mode_hira.png
new file mode 100644
index 0000000..494035f
--- /dev/null
+++ b/res/drawable/key_mode_hira.png
Binary files differ
diff --git a/res/drawable/key_mode_panel_kbd_12key_b.png b/res/drawable/key_mode_panel_kbd_12key_b.png
index eda8c03..a3fe255 100644
--- a/res/drawable/key_mode_panel_kbd_12key_b.png
+++ b/res/drawable/key_mode_panel_kbd_12key_b.png
Binary files differ
diff --git a/res/drawable/key_pict_sym_b.png b/res/drawable/key_pict_sym_b.png
new file mode 100644
index 0000000..19df062
--- /dev/null
+++ b/res/drawable/key_pict_sym_b.png
Binary files differ
diff --git a/res/drawable/key_qwerty_del.png b/res/drawable/key_qwerty_del.png
deleted file mode 100644
index 4aab087..0000000
--- a/res/drawable/key_qwerty_del.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_del_b.png b/res/drawable/key_qwerty_del_b.png
deleted file mode 100644
index ecc2dba..0000000
--- a/res/drawable/key_qwerty_del_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_enter.png b/res/drawable/key_qwerty_enter.png
deleted file mode 100644
index 35a3fb0..0000000
--- a/res/drawable/key_qwerty_enter.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_enter_b.png b/res/drawable/key_qwerty_enter_b.png
deleted file mode 100644
index 1a4cbfd..0000000
--- a/res/drawable/key_qwerty_enter_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_enter_jp.png b/res/drawable/key_qwerty_enter_jp.png
deleted file mode 100644
index 7f002e6..0000000
--- a/res/drawable/key_qwerty_enter_jp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_enter_jp_b.png b/res/drawable/key_qwerty_enter_jp_b.png
deleted file mode 100644
index a77c39f..0000000
--- a/res/drawable/key_qwerty_enter_jp_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_left.png b/res/drawable/key_qwerty_left.png
new file mode 100644
index 0000000..f177aad
--- /dev/null
+++ b/res/drawable/key_qwerty_left.png
Binary files differ
diff --git a/res/drawable/key_qwerty_left_b.png b/res/drawable/key_qwerty_left_b.png
new file mode 100644
index 0000000..f177aad
--- /dev/null
+++ b/res/drawable/key_qwerty_left_b.png
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_full_alpha.png b/res/drawable/key_qwerty_mode_full_alpha.png
deleted file mode 100644
index fd4f880..0000000
--- a/res/drawable/key_qwerty_mode_full_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_full_kata.png b/res/drawable/key_qwerty_mode_full_kata.png
deleted file mode 100644
index 81b66e2..0000000
--- a/res/drawable/key_qwerty_mode_full_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_full_num.png b/res/drawable/key_qwerty_mode_full_num.png
deleted file mode 100644
index dc929a1..0000000
--- a/res/drawable/key_qwerty_mode_full_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_half_alpha.png b/res/drawable/key_qwerty_mode_half_alpha.png
deleted file mode 100644
index 4bf6f99..0000000
--- a/res/drawable/key_qwerty_mode_half_alpha.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_half_kata.png b/res/drawable/key_qwerty_mode_half_kata.png
deleted file mode 100644
index 322341a..0000000
--- a/res/drawable/key_qwerty_mode_half_kata.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_half_num.png b/res/drawable/key_qwerty_mode_half_num.png
deleted file mode 100644
index 68a8760..0000000
--- a/res/drawable/key_qwerty_mode_half_num.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_mode_hira.png b/res/drawable/key_qwerty_mode_hira.png
deleted file mode 100644
index 9eb8584..0000000
--- a/res/drawable/key_qwerty_mode_hira.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_pict_sym.png b/res/drawable/key_qwerty_pict_sym.png
index ad89c49..d40ec42 100644
--- a/res/drawable/key_qwerty_pict_sym.png
+++ b/res/drawable/key_qwerty_pict_sym.png
Binary files differ
diff --git a/res/drawable/key_qwerty_pict_sym_b.png b/res/drawable/key_qwerty_pict_sym_b.png
deleted file mode 100644
index 43225a8..0000000
--- a/res/drawable/key_qwerty_pict_sym_b.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/key_qwerty_right.png b/res/drawable/key_qwerty_right.png
new file mode 100644
index 0000000..a9863ff
--- /dev/null
+++ b/res/drawable/key_qwerty_right.png
Binary files differ
diff --git a/res/drawable/key_qwerty_right_b.png b/res/drawable/key_qwerty_right_b.png
new file mode 100644
index 0000000..a9863ff
--- /dev/null
+++ b/res/drawable/key_qwerty_right_b.png
Binary files differ
diff --git a/res/drawable/key_qwerty_shift_b.png b/res/drawable/key_qwerty_shift_b.png
index bb6fe59..8c2f859 100644
--- a/res/drawable/key_qwerty_shift_b.png
+++ b/res/drawable/key_qwerty_shift_b.png
Binary files differ
diff --git a/res/drawable/key_qwerty_shift_locked.png b/res/drawable/key_qwerty_shift_locked.png
new file mode 100644
index 0000000..36b20c7
--- /dev/null
+++ b/res/drawable/key_qwerty_shift_locked.png
Binary files differ
diff --git a/res/drawable/key_qwerty_space.png b/res/drawable/key_qwerty_space.png
index 5ffcab5..f4ede08 100644
--- a/res/drawable/key_qwerty_space.png
+++ b/res/drawable/key_qwerty_space.png
Binary files differ
diff --git a/res/drawable/key_qwerty_space_b.png b/res/drawable/key_qwerty_space_b.png
index a9390e2..f4ede08 100644
--- a/res/drawable/key_qwerty_space_b.png
+++ b/res/drawable/key_qwerty_space_b.png
Binary files differ
diff --git a/res/drawable/key_qwerty_space_conv.png b/res/drawable/key_qwerty_space_conv.png
index 654bc2d..ec76075 100644
--- a/res/drawable/key_qwerty_space_conv.png
+++ b/res/drawable/key_qwerty_space_conv.png
Binary files differ
diff --git a/res/drawable/key_qwerty_space_conv_b.png b/res/drawable/key_qwerty_space_conv_b.png
index 07bd232..ec76075 100644
--- a/res/drawable/key_qwerty_space_conv_b.png
+++ b/res/drawable/key_qwerty_space_conv_b.png
Binary files differ
diff --git a/res/drawable/keybg_classic.9.png b/res/drawable/keybg_classic.9.png
new file mode 100644
index 0000000..ba57b14
--- /dev/null
+++ b/res/drawable/keybg_classic.9.png
Binary files differ
diff --git a/res/drawable/keybg_classic_bg.png b/res/drawable/keybg_classic_bg.png
new file mode 100644
index 0000000..6ec5225
--- /dev/null
+++ b/res/drawable/keybg_classic_bg.png
Binary files differ
diff --git a/res/drawable/keybg_classic_def.xml b/res/drawable/keybg_classic_def.xml
new file mode 100644
index 0000000..2260a9d
--- /dev/null
+++ b/res/drawable/keybg_classic_def.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_classic_psfton" />
+  <item android:state_checkable="true" android:state_checked="true"
+	android:drawable="@drawable/keybg_classic_sfton" />
+  <item android:state_checkable="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_classic_psftoff" />
+  <item android:state_checkable="true"
+	android:drawable="@drawable/keybg_classic_sftoff" />
+  <item android:state_pressed="true"
+	android:drawable="@drawable/keybg_classic_p" />
+  <item android:drawable="@drawable/keybg_classic" />
+</selector>
diff --git a/res/drawable/keybg_classic_p.9.png b/res/drawable/keybg_classic_p.9.png
new file mode 100644
index 0000000..4020b40
--- /dev/null
+++ b/res/drawable/keybg_classic_p.9.png
Binary files differ
diff --git a/res/drawable/keybg_classic_psftoff.9.png b/res/drawable/keybg_classic_psftoff.9.png
new file mode 100644
index 0000000..51c1778
--- /dev/null
+++ b/res/drawable/keybg_classic_psftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_classic_psfton.9.png b/res/drawable/keybg_classic_psfton.9.png
new file mode 100644
index 0000000..273e3fe
--- /dev/null
+++ b/res/drawable/keybg_classic_psfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_classic_sftoff.9.png b/res/drawable/keybg_classic_sftoff.9.png
new file mode 100644
index 0000000..358e6a4
--- /dev/null
+++ b/res/drawable/keybg_classic_sftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_classic_sfton.9.png b/res/drawable/keybg_classic_sfton.9.png
new file mode 100644
index 0000000..fcf74e7
--- /dev/null
+++ b/res/drawable/keybg_classic_sfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice.9.png b/res/drawable/keybg_ice.9.png
new file mode 100644
index 0000000..b22dd6d
--- /dev/null
+++ b/res/drawable/keybg_ice.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice_bg.png b/res/drawable/keybg_ice_bg.png
new file mode 100644
index 0000000..d26d8ae
--- /dev/null
+++ b/res/drawable/keybg_ice_bg.png
Binary files differ
diff --git a/res/drawable/keybg_ice_def.xml b/res/drawable/keybg_ice_def.xml
new file mode 100644
index 0000000..1336765
--- /dev/null
+++ b/res/drawable/keybg_ice_def.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_ice_psfton" />
+  <item android:state_checkable="true" android:state_checked="true"
+	android:drawable="@drawable/keybg_ice_sfton" />
+  <item android:state_checkable="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_ice_psftoff" />
+  <item android:state_checkable="true"
+	android:drawable="@drawable/keybg_ice_sftoff" />
+  <item android:state_pressed="true"
+	android:drawable="@drawable/keybg_ice_p" />
+  <item android:drawable="@drawable/keybg_ice" />
+</selector>
diff --git a/res/drawable/keybg_ice_p.9.png b/res/drawable/keybg_ice_p.9.png
new file mode 100644
index 0000000..4984234
--- /dev/null
+++ b/res/drawable/keybg_ice_p.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice_psftoff.9.png b/res/drawable/keybg_ice_psftoff.9.png
new file mode 100644
index 0000000..7b8662b
--- /dev/null
+++ b/res/drawable/keybg_ice_psftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice_psfton.9.png b/res/drawable/keybg_ice_psfton.9.png
new file mode 100644
index 0000000..5748d92
--- /dev/null
+++ b/res/drawable/keybg_ice_psfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice_sftoff.9.png b/res/drawable/keybg_ice_sftoff.9.png
new file mode 100644
index 0000000..d82a1c7
--- /dev/null
+++ b/res/drawable/keybg_ice_sftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_ice_sfton.9.png b/res/drawable/keybg_ice_sfton.9.png
new file mode 100644
index 0000000..657b357
--- /dev/null
+++ b/res/drawable/keybg_ice_sfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto.9.png b/res/drawable/keybg_kyoto.9.png
new file mode 100644
index 0000000..d4a02da
--- /dev/null
+++ b/res/drawable/keybg_kyoto.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_bg.png b/res/drawable/keybg_kyoto_bg.png
new file mode 100644
index 0000000..6f94b70
--- /dev/null
+++ b/res/drawable/keybg_kyoto_bg.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_def.xml b/res/drawable/keybg_kyoto_def.xml
new file mode 100644
index 0000000..a54f059
--- /dev/null
+++ b/res/drawable/keybg_kyoto_def.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_kyoto_psfton" />
+  <item android:state_checkable="true" android:state_checked="true"
+	android:drawable="@drawable/keybg_kyoto_sfton" />
+  <item android:state_checkable="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_kyoto_psftoff" />
+  <item android:state_checkable="true"
+	android:drawable="@drawable/keybg_kyoto_sftoff" />
+  <item android:state_pressed="true"
+	android:drawable="@drawable/keybg_kyoto_p" />
+  <item android:drawable="@drawable/keybg_kyoto" />
+</selector>
diff --git a/res/drawable/keybg_kyoto_p.9.png b/res/drawable/keybg_kyoto_p.9.png
new file mode 100644
index 0000000..19127f1
--- /dev/null
+++ b/res/drawable/keybg_kyoto_p.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_psftoff.9.png b/res/drawable/keybg_kyoto_psftoff.9.png
new file mode 100644
index 0000000..273b479
--- /dev/null
+++ b/res/drawable/keybg_kyoto_psftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_psfton.9.png b/res/drawable/keybg_kyoto_psfton.9.png
new file mode 100644
index 0000000..e32b35d
--- /dev/null
+++ b/res/drawable/keybg_kyoto_psfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_sftoff.9.png b/res/drawable/keybg_kyoto_sftoff.9.png
new file mode 100644
index 0000000..96fb094
--- /dev/null
+++ b/res/drawable/keybg_kyoto_sftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_kyoto_sfton.9.png b/res/drawable/keybg_kyoto_sfton.9.png
new file mode 100644
index 0000000..f4fc3dc
--- /dev/null
+++ b/res/drawable/keybg_kyoto_sfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_light.9.png b/res/drawable/keybg_light.9.png
new file mode 100644
index 0000000..2b4aa98
--- /dev/null
+++ b/res/drawable/keybg_light.9.png
Binary files differ
diff --git a/res/drawable/keybg_light_def.xml b/res/drawable/keybg_light_def.xml
new file mode 100644
index 0000000..da38f22
--- /dev/null
+++ b/res/drawable/keybg_light_def.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_light_psfton" />
+  <item android:state_checkable="true" android:state_checked="true"
+	android:drawable="@drawable/keybg_light_sfton" />
+  <item android:state_checkable="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_light_psftoff" />
+  <item android:state_checkable="true"
+	android:drawable="@drawable/keybg_light_sftoff" />
+  <item android:state_pressed="true"
+	android:drawable="@drawable/keybg_light_p" />
+  <item android:drawable="@drawable/keybg_light" />
+</selector>
diff --git a/res/drawable/keybg_light_p.9.png b/res/drawable/keybg_light_p.9.png
new file mode 100644
index 0000000..c1c1e1c
--- /dev/null
+++ b/res/drawable/keybg_light_p.9.png
Binary files differ
diff --git a/res/drawable/keybg_light_psftoff.9.png b/res/drawable/keybg_light_psftoff.9.png
new file mode 100644
index 0000000..edaf5ac
--- /dev/null
+++ b/res/drawable/keybg_light_psftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_light_psfton.9.png b/res/drawable/keybg_light_psfton.9.png
new file mode 100644
index 0000000..d39565a
--- /dev/null
+++ b/res/drawable/keybg_light_psfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_light_sftoff.9.png b/res/drawable/keybg_light_sftoff.9.png
new file mode 100644
index 0000000..f26bfb5
--- /dev/null
+++ b/res/drawable/keybg_light_sftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_light_sfton.9.png b/res/drawable/keybg_light_sfton.9.png
new file mode 100644
index 0000000..65087be
--- /dev/null
+++ b/res/drawable/keybg_light_sfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_metal_def.xml b/res/drawable/keybg_metal_def.xml
index 963fe11..d4989f8 100644
--- a/res/drawable/keybg_metal_def.xml
+++ b/res/drawable/keybg_metal_def.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/drawable/keybg_simple_def.xml b/res/drawable/keybg_simple_def.xml
index 322ce8c..77114b0 100644
--- a/res/drawable/keybg_simple_def.xml
+++ b/res/drawable/keybg_simple_def.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/drawable/keybg_wood.9.png b/res/drawable/keybg_wood.9.png
new file mode 100644
index 0000000..e588ed6
--- /dev/null
+++ b/res/drawable/keybg_wood.9.png
Binary files differ
diff --git a/res/drawable/keybg_wood_bg.png b/res/drawable/keybg_wood_bg.png
new file mode 100644
index 0000000..2dc9f8a
--- /dev/null
+++ b/res/drawable/keybg_wood_bg.png
Binary files differ
diff --git a/res/drawable/keybg_wood_def.xml b/res/drawable/keybg_wood_def.xml
new file mode 100644
index 0000000..cba026a
--- /dev/null
+++ b/res/drawable/keybg_wood_def.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_wood_psfton" />
+  <item android:state_checkable="true" android:state_checked="true"
+	android:drawable="@drawable/keybg_wood_sfton" />
+  <item android:state_checkable="true" android:state_pressed="true"
+	android:drawable="@drawable/keybg_wood_psftoff" />
+  <item android:state_checkable="true"
+	android:drawable="@drawable/keybg_wood_sftoff" />
+  <item android:state_pressed="true"
+	android:drawable="@drawable/keybg_wood_p" />
+  <item android:drawable="@drawable/keybg_wood" />
+</selector>
diff --git a/res/drawable/keybg_wood_p.9.png b/res/drawable/keybg_wood_p.9.png
new file mode 100644
index 0000000..aa6c810
--- /dev/null
+++ b/res/drawable/keybg_wood_p.9.png
Binary files differ
diff --git a/res/drawable/keybg_wood_psftoff.9.png b/res/drawable/keybg_wood_psftoff.9.png
new file mode 100644
index 0000000..fba919e
--- /dev/null
+++ b/res/drawable/keybg_wood_psftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_wood_psfton.9.png b/res/drawable/keybg_wood_psfton.9.png
new file mode 100644
index 0000000..6887e7d
--- /dev/null
+++ b/res/drawable/keybg_wood_psfton.9.png
Binary files differ
diff --git a/res/drawable/keybg_wood_sftoff.9.png b/res/drawable/keybg_wood_sftoff.9.png
new file mode 100644
index 0000000..4622de4
--- /dev/null
+++ b/res/drawable/keybg_wood_sftoff.9.png
Binary files differ
diff --git a/res/drawable/keybg_wood_sfton.9.png b/res/drawable/keybg_wood_sfton.9.png
new file mode 100644
index 0000000..3b4e8f7
--- /dev/null
+++ b/res/drawable/keybg_wood_sfton.9.png
Binary files differ
diff --git a/res/drawable/keyboard_background.png b/res/drawable/keyboard_background.png
new file mode 100644
index 0000000..956456e
--- /dev/null
+++ b/res/drawable/keyboard_background.png
Binary files differ
diff --git a/res/drawable/keyboard_key_feedback.xml b/res/drawable/keyboard_key_feedback.xml
new file mode 100644
index 0000000..c483b76
--- /dev/null
+++ b/res/drawable/keyboard_key_feedback.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_long_pressable="true"
+            android:drawable="@drawable/keyboard_key_feedback_more_background" />
+
+    <item android:drawable="@drawable/keyboard_key_feedback_background" />
+</selector>
diff --git a/res/drawable/tutorial_12key_enter.png b/res/drawable/tutorial_12key_enter.png
index 61abffc..9f8921b 100644
--- a/res/drawable/tutorial_12key_enter.png
+++ b/res/drawable/tutorial_12key_enter.png
Binary files differ
diff --git a/res/drawable/tutorial_12key_mode.png b/res/drawable/tutorial_12key_mode.png
index 42b939f..c9b2d60 100644
--- a/res/drawable/tutorial_12key_mode.png
+++ b/res/drawable/tutorial_12key_mode.png
Binary files differ
diff --git a/res/layout-sw768dp/keyboard_android_default.xml b/res/layout-sw768dp/keyboard_android_default.xml
new file mode 100644
index 0000000..420281f
--- /dev/null
+++ b/res/layout-sw768dp/keyboard_android_default.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<jp.co.omronsoft.openwnn.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:labelTextSize="@dimen/key_label_text_size"
+   android:keyTextSize="@dimen/key_text_size"
+   android:keyBackground="@drawable/btn_keyboard_key"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
+   android:background="@drawable/keyboard_background"
+   android:keyTextColor="@color/key_text_color"
+   android:paddingTop="10dip"
+   pj:keyBackground2nd="@drawable/btn_keyboard_key_2nd"
+   pj:keyTextColor2nd="@color/key_text_color_2nd"
+   />
+
diff --git a/res/layout-sw768dp/keyboard_metal.xml b/res/layout-sw768dp/keyboard_metal.xml
new file mode 100644
index 0000000..2d94a38
--- /dev/null
+++ b/res/layout-sw768dp/keyboard_metal.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<jp.co.omronsoft.openwnn.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:labelTextSize="@dimen/key_label_text_size"
+   android:keyTextSize="@dimen/key_text_size"
+   android:keyBackground="@drawable/keybg_metal_def"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
+   android:background="@drawable/keyboard_background"
+   android:keyTextColor="@color/key_text_color"
+   pj:keyBackground2nd="@drawable/keybg_metal_def"
+   pj:keyTextColor2nd="@color/key_text_color"
+/>
diff --git a/res/layout-sw768dp/keyboard_simple.xml b/res/layout-sw768dp/keyboard_simple.xml
new file mode 100644
index 0000000..dc7187e
--- /dev/null
+++ b/res/layout-sw768dp/keyboard_simple.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<jp.co.omronsoft.openwnn.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:labelTextSize="@dimen/key_label_text_size"
+   android:keyTextSize="@dimen/key_text_size"
+   android:keyBackground="@drawable/keybg_simple_def"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
+   android:background="@drawable/keybg_simple_bg"
+   android:keyTextColor="@color/key_text_color"
+   pj:keyBackground2nd="@drawable/keybg_simple_def"
+   pj:keyTextColor2nd="@color/key_text_color_2nd"
+/>
diff --git a/res/layout/bubble_text.xml b/res/layout/bubble_text.xml
index d754467..64b0a01 100644
--- a/res/layout/bubble_text.xml
+++ b/res/layout/bubble_text.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/layout/candidate_longpress_dialog.xml b/res/layout/candidate_longpress_dialog.xml
new file mode 100644
index 0000000..a0b4da2
--- /dev/null
+++ b/res/layout/candidate_longpress_dialog.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- candidate list -->
+<LinearLayout
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:orientation="vertical"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:gravity="center"
+   >
+  <TextView
+     android:id="@+id/candidate_longpress_dialog_text"
+     android:layout_width="wrap_content"
+     android:layout_height="wrap_content"
+     android:textSize="@dimen/candidate_longpress_dialog_candidate_word_size"
+     android:textColor="@color/candidate_longpress_dialog_text"
+     android:gravity="center"
+   />
+  <HorizontalScrollView
+     xmlns:android="http://schemas.android.com/apk/res/android"
+     android:layout_width="wrap_content"
+     android:layout_height="match_parent"
+     >
+    <LinearLayout
+       android:orientation="horizontal"
+       android:layout_width="match_parent"
+       android:layout_height="wrap_content"
+       android:gravity="center"
+       >
+      <Button
+         android:id="@+id/candidate_longpress_dialog_cancel"
+         android:layout_height="match_parent"
+         android:layout_width="wrap_content"
+         android:text="@string/dialog_button_cancel"
+         android:textSize="@dimen/candidate_longpress_dialog_button_word_size"
+         android:soundEffectsEnabled="false"
+         />
+      <Button
+         android:id="@+id/candidate_longpress_dialog_select"
+         android:layout_height="match_parent"
+         android:layout_width="wrap_content"
+         android:text="@string/button_candidate_select"
+         android:textSize="@dimen/candidate_longpress_dialog_button_word_size"
+         android:soundEffectsEnabled="false"
+         />
+      <Button
+         android:id="@+id/candidate_longpress_dialog_delete"
+         android:layout_height="match_parent"
+         android:layout_width="wrap_content"
+         android:text="@string/button_candidate_delete"
+         android:textSize="@dimen/candidate_longpress_dialog_button_word_size"
+         android:visibility="gone"
+         android:soundEffectsEnabled="false"
+         />
+    </LinearLayout>
+  </HorizontalScrollView>
+</LinearLayout>
diff --git a/res/layout/candidate_scale_up.xml b/res/layout/candidate_scale_up.xml
deleted file mode 100644
index e1d52a1..0000000
--- a/res/layout/candidate_scale_up.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!-- candidate list -->
-<LinearLayout
-   xmlns:android="http://schemas.android.com/apk/res/android"
-   android:orientation="vertical"
-   android:background="@color/candidate_back"
-   android:layout_width="match_parent"
-   android:layout_height="wrap_content"
-   >
-  <TextView
-     android:id="@+id/candidate_scale_up_text"
-     android:layout_width="match_parent"
-     android:layout_height="wrap_content"
-     android:background="@color/candidate_back"
-     android:textSize="@dimen/candidate_delete_word_size"
-     android:textColor="@color/candidate_text"
-     android:gravity="center"
-     />
-  <LinearLayout 
-     android:orientation="horizontal"
-     android:layout_width="match_parent" 
-     android:layout_height="wrap_content"
-     android:gravity="center"
-     >
-    <jp.co.omronsoft.openwnn.CandidateViewButton
-       android:id="@+id/candidate_select"
-       android:layout_height="match_parent"
-       android:layout_width="wrap_content" 
-       android:text="@string/button_candidate_select"
-       />
-    <jp.co.omronsoft.openwnn.CandidateViewButton
-       android:id="@+id/candidate_delete"
-       android:layout_height="match_parent"
-       android:layout_width="wrap_content" 
-       android:text="@string/button_candidate_delete"
-       android:visibility="gone"
-       />
-    <jp.co.omronsoft.openwnn.CandidateViewButton
-       android:id="@+id/candidate_cancel"
-       android:layout_height="match_parent"
-       android:layout_width="wrap_content" 
-       android:text="@string/button_candidate_cancel"
-       />
-  </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/candidates.xml b/res/layout/candidates.xml
index dc26030..09246a2 100644
--- a/res/layout/candidates.xml
+++ b/res/layout/candidates.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -21,19 +21,66 @@
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
+  <LinearLayout
+     android:orientation="vertical"
+     android:layout_width="match_parent"
+     android:layout_height="wrap_content"
+     >
+
+  <LinearLayout
+     android:id="@+id/candview_tab"
+     android:orientation="vertical"
+     android:layout_width="match_parent"
+     android:layout_height="wrap_content"
+     >
+    <LinearLayout
+       android:orientation="horizontal"
+       android:layout_width="match_parent"
+       android:layout_height="wrap_content"
+       android:background="@color/candidate_tab_back"
+       >
+      <TextView
+         android:id="@+id/candview_symbol"
+         android:layout_width="match_parent"
+         android:layout_height="wrap_content"
+         android:layout_weight="1"
+         android:background="@drawable/cand_tab"
+         android:singleLine="true"
+         android:gravity="center"
+         android:text="@string/cand_tab_symbol_txt"
+         android:textColor="@color/tab_textcolor_no_select"
+         android:textSize="@dimen/tab_text_size"
+         android:soundEffectsEnabled="false"
+         />
+      <TextView
+         android:id="@+id/candview_emoticon"
+         android:layout_width="match_parent"
+         android:layout_height="wrap_content"
+         android:layout_weight="1"
+         android:background="@drawable/cand_tab"
+         android:singleLine="true"
+         android:gravity="center"
+         android:text="@string/cand_tab_emoticon_txt"
+         android:textColor="@color/tab_textcolor_no_select"
+         android:textSize="@dimen/tab_text_size"
+         android:soundEffectsEnabled="false"
+         />
+    </LinearLayout>
+  </LinearLayout>
+
   <ScrollView
      android:id="@+id/candview_scroll"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:fadingEdgeLength="0dip"
      android:scrollbars="vertical"
+     android:background="@color/candidate_back"
      >
     <LinearLayout 
        android:id="@+id/candview_base"
        android:orientation="vertical"
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
-       android:background="@color/candidate_back"
        >
       <!--View
          android:layout_height="wrap_content" 
@@ -45,17 +92,15 @@
          android:orientation="vertical"
          android:layout_width="match_parent" 
          android:layout_height="wrap_content"
-         android:background="@color/candidate_back"
          />
       <AbsoluteLayout
          android:id="@+id/candidates_2nd_view"
          android:layout_width="match_parent" 
          android:layout_height="wrap_content"
-         android:background="@color/candidate_back"
          />
     </LinearLayout>
   </ScrollView>
-
+  </LinearLayout>
   <LinearLayout
      android:id="@+id/read_more"
      android:layout_width="match_parent"
@@ -65,9 +110,11 @@
      android:gravity="right"
      >
     <ImageView
-       android:id="@+id/read_more_text"
+       android:id="@+id/read_more_button"
        android:layout_height="wrap_content"
-       android:layout_width="wrap_content" 
+       android:layout_width="wrap_content"
+       android:paddingRight="2dip"
+       android:soundEffectsEnabled="false"
        />
   </LinearLayout>
 </FrameLayout>
diff --git a/res/layout/candidates_1line.xml b/res/layout/candidates_1line.xml
new file mode 100644
index 0000000..962486f
--- /dev/null
+++ b/res/layout/candidates_1line.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- candidate list -->
+<LinearLayout
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:orientation="horizontal"
+   android:layout_width="match_parent"
+   android:layout_height="@dimen/candidate_layout_height"
+   >
+
+  <LinearLayout
+     android:id="@+id/left_more"
+     android:layout_width="wrap_content"
+     android:layout_height="@dimen/candidate_layout_height"
+     android:orientation="horizontal"
+     android:background="@drawable/cand_back_1line"
+     >
+    <ImageView
+       android:id="@+id/left_more_imageview"
+       android:src="@drawable/cand_left"
+       android:layout_width="@dimen/candidate_layout_width"
+       android:layout_height="match_parent"
+       android:clickable="true"
+       android:background="@color/candidate_back_1line"
+       android:soundEffectsEnabled="false"
+       />
+  </LinearLayout>
+
+  <HorizontalScrollView
+     android:id="@+id/candview_scroll_1line"
+     android:layout_width="wrap_content"
+     android:layout_height="@dimen/candidate_layout_height"
+     android:scrollbars="none"
+     android:layout_weight="1"
+     android:fadingEdge="horizontal"
+     android:background="@color/candidate_back_1line"
+     >
+    <LinearLayout
+       android:id="@+id/candidates_view_1line"
+       android:layout_width="match_parent"
+       android:layout_height="@dimen/candidate_layout_height"
+       android:background="@color/candidate_back_1line"
+       />
+  </HorizontalScrollView>
+
+  <LinearLayout
+     android:id="@+id/right_more"
+     android:layout_width="wrap_content"
+     android:layout_height="@dimen/candidate_layout_height"
+     android:orientation="horizontal"
+     android:background="@drawable/cand_back_1line"
+     >
+    <ImageView
+       android:id="@+id/right_more_imageview"
+       android:src="@drawable/cand_right"
+       android:layout_width="@dimen/candidate_layout_width"
+       android:layout_height="match_parent"
+       android:clickable="true"
+       android:background="@color/candidate_back_1line"
+       android:soundEffectsEnabled="false"
+       />
+  </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/debug_tool_engine.xml b/res/layout/debug_tool_engine.xml
new file mode 100644
index 0000000..134f5d2
--- /dev/null
+++ b/res/layout/debug_tool_engine.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <TextView
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/openwnn_engine_label"
+    />
+    
+	<RadioGroup android:id="@+id/radio_group"
+	    android:layout_width="wrap_content"
+	    android:layout_height="wrap_content"
+	    android:orientation="vertical">
+
+	    <RadioButton android:id="@+id/radio_en"
+	        android:layout_width="wrap_content"
+	        android:layout_height="wrap_content"
+	        android:text="@string/debug_openwnn_engine_en"
+	        android:textSize="11sp"
+	    />
+	</RadioGroup>
+
+	<LinearLayout android:orientation="horizontal"
+					android:layout_width="fill_parent"
+					android:layout_height="wrap_content">
+
+		<Button android:id="@+id/execButton2"
+	        android:layout_width="wrap_content"
+	        android:layout_height="wrap_content"
+	        android:layout_marginRight="3dip"
+	        android:text="@string/execButton2"
+	        android:textSize="11sp"
+		/>
+
+		<TextView android:id="@+id/editText2"
+	   		android:layout_width="fill_parent"
+	   		android:layout_height="wrap_content"
+	   		android:textSize="11sp"
+		/>
+	</LinearLayout>
+
+	<ScrollView
+	    android:layout_width="fill_parent"
+    	android:layout_height="fill_parent"
+    	android:background="#000000">
+
+		<LinearLayout android:id="@+id/engine_scroll"
+        	          android:orientation="vertical"
+            	      android:layout_width="fill_parent"
+                	  android:layout_height="fill_parent">
+ 
+		</LinearLayout>
+	</ScrollView>
+</LinearLayout>
diff --git a/res/layout/debug_tool_onevent.xml b/res/layout/debug_tool_onevent.xml
new file mode 100644
index 0000000..9d82de0
--- /dev/null
+++ b/res/layout/debug_tool_onevent.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+   android:orientation="vertical"
+   android:layout_width="fill_parent"
+   android:layout_height="fill_parent">
+
+  <TextView
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:text="@string/app_openwnn_test"
+  />
+
+  <EditText android:id="@+id/editText"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+  />
+
+  <Button android:id="@+id/execButton"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginRight="3dip"
+    android:text="@string/execButton"/>
+
+    <ScrollView
+      android:layout_width="fill_parent"
+      android:layout_height="fill_parent"
+      android:background="#000000">
+      <TextView android:id="@+id/textView"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:textSize="5pt"
+      />
+    </ScrollView>
+</LinearLayout>
diff --git a/res/layout/debug_tool_text.xml b/res/layout/debug_tool_text.xml
new file mode 100644
index 0000000..680fbff
--- /dev/null
+++ b/res/layout/debug_tool_text.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+   <LinearLayout android:orientation="vertical"
+     android:layout_width="fill_parent"
+     android:layout_height="wrap_content">
+
+     <LinearLayout android:orientation="horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/debug_texttype_anything"
+        />
+
+        <EditText
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+        />
+        </LinearLayout>
+
+           <LinearLayout android:orientation="horizontal"
+              android:layout_width="fill_parent"
+              android:layout_height="wrap_content">
+              <TextView
+                 android:layout_width="wrap_content"
+                 android:layout_height="wrap_content"
+                 android:text="@string/debug_texttype_integer"
+              />
+
+              <EditText 
+                 android:numeric="integer"
+                 android:layout_width="fill_parent" 
+                 android:layout_height="wrap_content" 	
+              />
+           </LinearLayout>
+
+           <LinearLayout android:orientation="horizontal"
+                 android:layout_width="fill_parent"
+                 android:layout_height="wrap_content">
+
+                 <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/debug_texttype_signed"
+                 />
+
+                 <EditText
+                    android:numeric="signed"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                 />
+             </LinearLayout>
+
+             <LinearLayout android:orientation="horizontal"
+                 android:layout_width="fill_parent"
+                 android:layout_height="wrap_content">
+                 <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/debug_texttype_demical"
+                 />
+
+                 <EditText
+                    android:numeric="decimal"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                 />
+                 </LinearLayout>
+
+                 <LinearLayout android:orientation="horizontal"
+                     android:layout_width="fill_parent"
+                     android:layout_height="wrap_content">
+
+                     <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/debug_texttype_password"
+                     />
+
+                     <EditText
+                        android:password="true"
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                     />
+
+                 </LinearLayout>
+
+                 <LinearLayout android:orientation="horizontal"
+                     android:layout_width="fill_parent"
+                     android:layout_height="wrap_content">
+                     <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/debug_texttype_phone"
+                     />
+
+                     <EditText
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        android:phoneNumber="true"
+                     />
+                  </LinearLayout>
+
+                  <LinearLayout android:orientation="horizontal"
+                     android:layout_width="fill_parent"
+                     android:layout_height="wrap_content">
+                     <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/debug_texttype_singleLine"
+                     />
+
+                     <EditText
+                        android:id="@+id/singleLine"
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        android:singleLine="true"
+                     />
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/keyboard_android_default.xml b/res/layout/keyboard_android_default.xml
index 3fd8738..3a0550b 100644
--- a/res/layout/keyboard_android_default.xml
+++ b/res/layout/keyboard_android_default.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -14,11 +14,26 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<android.inputmethodservice.KeyboardView
+<jp.co.omronsoft.openwnn.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
+   android:background="@drawable/keyboard_background"
+   android:keyBackground="@drawable/btn_keyboard_key"
+   android:verticalCorrection="-10dip"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:keyPreviewOffset="-12dip"
+   android:keyPreviewHeight="80dip"
+   android:keyTextSize="22dip"
+   android:keyTextColor="@color/key_text_color"
+   android:labelTextSize="@dimen/key_label_text_size"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
+   android:shadowColor="#BB000000"
+   android:shadowRadius="0.5"
+   pj:keyBackground2nd="@drawable/btn_keyboard_key_2nd"
+   pj:keyTextColor2nd="@color/key_text_color_2nd"
    />
 
diff --git a/res/layout/keyboard_classic.xml b/res/layout/keyboard_classic.xml
new file mode 100644
index 0000000..bcb1c6f
--- /dev/null
+++ b/res/layout/keyboard_classic.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<android.inputmethodservice.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:keyBackground="@drawable/keybg_classic_def"
+   android:background="@drawable/keybg_classic_bg"
+/>
diff --git a/res/layout/keyboard_default_main.xml b/res/layout/keyboard_default_main.xml
index f93b7e8..c01e02c 100644
--- a/res/layout/keyboard_default_main.xml
+++ b/res/layout/keyboard_default_main.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-          android:orientation="vertical"
-              android:layout_width="match_parent"
-          android:layout_height="wrap_content"
-	      android:fadingEdge="vertical"
-	      android:fadingEdgeLength="5dip"
-          >
-</LinearLayout>
+
+<jp.co.omronsoft.openwnn.BaseInputView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:requiresFadingEdge="vertical"
+        android:fadingEdgeLength="5dip"/>
diff --git a/res/layout/keyboard_default_sub.xml b/res/layout/keyboard_default_sub.xml
index 2be1552..6ec3fab 100644
--- a/res/layout/keyboard_default_sub.xml
+++ b/res/layout/keyboard_default_sub.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/layout/keyboard_ice.xml b/res/layout/keyboard_ice.xml
new file mode 100644
index 0000000..f0722d9
--- /dev/null
+++ b/res/layout/keyboard_ice.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<android.inputmethodservice.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:keyBackground="@drawable/keybg_ice_def"
+   android:background="@drawable/keybg_ice_bg"
+/>
diff --git a/res/layout/keyboard_key_preview.xml b/res/layout/keyboard_key_preview.xml
new file mode 100644
index 0000000..7fe375a
--- /dev/null
+++ b/res/layout/keyboard_key_preview.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="80dip"
+    android:textSize="40dip"
+    android:textColor="@color/key_text_color"
+    android:minWidth="32dip"
+    android:gravity="center"
+    android:background="@drawable/keyboard_key_feedback"
+    />
diff --git a/res/layout/keyboard_kyoto.xml b/res/layout/keyboard_kyoto.xml
new file mode 100644
index 0000000..c313f3b
--- /dev/null
+++ b/res/layout/keyboard_kyoto.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<android.inputmethodservice.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:keyBackground="@drawable/keybg_kyoto_def"
+   android:background="@drawable/keybg_kyoto_bg"
+/>
diff --git a/res/layout/keyboard_light.xml b/res/layout/keyboard_light.xml
new file mode 100644
index 0000000..2ffbc0f
--- /dev/null
+++ b/res/layout/keyboard_light.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<android.inputmethodservice.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:keyBackground="@drawable/keybg_light_def"
+/>
diff --git a/res/layout/keyboard_metal.xml b/res/layout/keyboard_metal.xml
index 9acfa2c..9c5656b 100644
--- a/res/layout/keyboard_metal.xml
+++ b/res/layout/keyboard_metal.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -14,11 +14,18 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<android.inputmethodservice.KeyboardView
+<jp.co.omronsoft.openwnn.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyBackground="@drawable/keybg_metal_def"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
+   android:background="@drawable/keyboard_background"
+   android:keyTextColor="@color/key_text_color"
+   pj:keyBackground2nd="@drawable/keybg_metal_def"
+   pj:keyTextColor2nd="@color/key_text_color"
 />
diff --git a/res/layout/keyboard_popup_keyboard.xml b/res/layout/keyboard_popup_keyboard.xml
new file mode 100644
index 0000000..0215cfe
--- /dev/null
+++ b/res/layout/keyboard_popup_keyboard.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:background="@drawable/keyboard_popup_panel_background"
+        >
+ 
+    <jp.co.omronsoft.openwnn.KeyboardView
+            android:id="@+id/keyboardView"
+            android:background="@android:color/transparent"
+            android:layout_alignParentBottom="true"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:keyBackground="@drawable/btn_keyboard_key_std"
+            android:verticalCorrection="-10dip"
+            android:keyPreviewLayout="@layout/keyboard_key_preview"
+            android:keyPreviewOffset="-12dip"
+            android:keyPreviewHeight="80dip"
+            android:keyTextSize="22dip"
+            android:keyTextColor="@color/key_text_color_std"
+            android:labelTextSize="14dip"
+            android:popupLayout="@layout/keyboard_popup_keyboard"
+            android:shadowColor="#BB000000"
+            android:shadowRadius="0.5"
+            />
+    <ImageButton android:id="@+id/closeButton"
+        android:background="@android:color/transparent"
+        android:src="@drawable/btn_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_marginLeft="8dp"
+        android:clickable="true"
+        />
+</LinearLayout>
diff --git a/res/layout/keyboard_simple.xml b/res/layout/keyboard_simple.xml
index befe34f..3eed320 100644
--- a/res/layout/keyboard_simple.xml
+++ b/res/layout/keyboard_simple.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -14,12 +14,18 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<android.inputmethodservice.KeyboardView
+<jp.co.omronsoft.openwnn.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyBackground="@drawable/keybg_simple_def"
+   android:keyPreviewLayout="@layout/keyboard_key_preview"
+   android:popupLayout="@layout/keyboard_popup_keyboard"
    android:background="@drawable/keybg_simple_bg"
+   android:keyTextColor="@color/key_text_color"
+   pj:keyBackground2nd="@drawable/keybg_simple_def"
+   pj:keyTextColor2nd="@color/key_text_color_2nd"
 />
diff --git a/res/layout/keyboard_wood.xml b/res/layout/keyboard_wood.xml
new file mode 100644
index 0000000..81c136c
--- /dev/null
+++ b/res/layout/keyboard_wood.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<android.inputmethodservice.KeyboardView
+   xmlns:android="http://schemas.android.com/apk/res/android"
+   android:id="@+id/keyboard"
+   android:layout_alignParentBottom="true"
+   android:layout_width="match_parent"
+   android:layout_height="wrap_content"
+   android:keyBackground="@drawable/keybg_wood_def"
+   android:background="@drawable/keybg_wood_bg"
+/>
diff --git a/res/layout/user_dictionary_tools_edit.xml b/res/layout/user_dictionary_tools_edit.xml
index 5886857..39a074a 100644
--- a/res/layout/user_dictionary_tools_edit.xml
+++ b/res/layout/user_dictionary_tools_edit.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -46,22 +46,22 @@
         android:layout_height="?android:attr/listPreferredItemHeight"
         android:layout_marginTop="1dip"
         android:background="@android:drawable/bottom_bar">
-        <Button android:id="@+id/addButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:layout_alignParentLeft="true"
-            android:text="@string/user_dictionary_add"
-            android:minWidth="120dip"
-            android:minHeight="48dip"/>
-
         <Button android:id="@+id/cancelButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_alignParentRight="true"
+            android:layout_alignParentLeft="true"
             android:text="@string/dialog_button_cancel"
             android:minWidth="120dip"
             android:minHeight="48dip"/>
+
+        <Button android:id="@+id/addButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_alignParentRight="true"
+            android:text="@string/user_dictionary_add"
+            android:minWidth="120dip"
+            android:minHeight="48dip"/>
     </RelativeLayout>
 </LinearLayout>
diff --git a/res/layout/user_dictionary_tools_edit_header.xml b/res/layout/user_dictionary_tools_edit_header.xml
index 5e4c5d6..f074cfc 100644
--- a/res/layout/user_dictionary_tools_edit_header.xml
+++ b/res/layout/user_dictionary_tools_edit_header.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/layout/user_dictionary_tools_list.xml b/res/layout/user_dictionary_tools_list.xml
index 4ebfbd8..3fa8888 100644
--- a/res/layout/user_dictionary_tools_list.xml
+++ b/res/layout/user_dictionary_tools_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -19,6 +19,13 @@
               android:paddingTop="5sp"
               android:layout_width="match_parent"
               android:layout_height="wrap_content">
+    <TextView
+        android:id="@+id/user_dictionary_tools_list_title_words_count"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="right"
+        android:gravity="right"
+        android:textColor="?android:attr/textColorPrimary"/>
     <LinearLayout
        android:orientation="horizontal"
        android:gravity="center"
diff --git a/res/layout/user_dictionary_tools_list_header.xml b/res/layout/user_dictionary_tools_list_header.xml
deleted file mode 100644
index 3e5159c..0000000
--- a/res/layout/user_dictionary_tools_list_header.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="2dip"
-        android:layout_alignParentLeft="true"
-        android:text="@string/user_dictionary_list_words_en"
-        android:textColor="?android:attr/textColorPrimary"/>
-    <TextView
-        android:id="@+id/user_dictionary_tools_list_title_words_count"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="2dip"
-        android:layout_alignParentRight="true"
-        android:textColor="?android:attr/textColorPrimary"/>
-</RelativeLayout>
diff --git a/res/layout/user_dictionary_tools_list_header_ja.xml b/res/layout/user_dictionary_tools_list_header_ja.xml
deleted file mode 100644
index 0db6f27..0000000
--- a/res/layout/user_dictionary_tools_list_header_ja.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="2dip"
-        android:layout_alignParentLeft="true"
-        android:text="@string/user_dictionary_list_words_ja"
-        android:textColor="?android:attr/textColorPrimary"/>
-    <TextView
-        android:id="@+id/user_dictionary_tools_list_title_words_count"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="2dip"
-        android:layout_alignParentRight="true"
-        android:textColor="?android:attr/textColorPrimary"/>
-</RelativeLayout>
diff --git a/res/values-ja/string.xml b/res/values-ja/string.xml
index 296da5a..3699a0d 100644
--- a/res/values-ja/string.xml
+++ b/res/values-ja/string.xml
@@ -1,6 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ Copyright (C) 2008-2011  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -40,15 +55,18 @@
     <string name="preference_keyboard_simple">シンプル</string>
     <string name="preference_keyboard_metal">メタリック</string>
 
-    <string name="preference_conversion_menu">変換設定</string>
+    <string name="preference_conversion_menu_ja">日本語変換設定</string>
+    <string name="preference_conversion_menu_en">英語変換設定</string>
 
-    <string name="preference_prediction_title">予測変換</string>
+    <string name="preference_prediction_title_ja">日本語予測変換</string>
+    <string name="preference_prediction_title_en">英語予測変換</string>
     <string name="preference_prediction_summary">文字を入力すると変換候補を表示する</string>
 
-    <string name="preference_correct_spell_title">入力ミス補正</string>
+    <string name="preference_correct_spell_title_en">英語入力ミス補正</string>
     <string name="preference_correct_spell_summary">入力間違いの修正候補を表示する</string>
 
-    <string name="preference_input_learning_title">候補学習</string>
+    <string name="preference_input_learning_title_ja">日本語候補学習</string>
+    <string name="preference_input_learning_title_en">英語候補学習</string>
     <string name="preference_input_learning_summary">変換で確定した語句を学習する</string>
 
     <string name="preference_aboutime_menu">IMEについて</string>
@@ -84,9 +102,6 @@
 
     <!-- user dictionary -->
     <string name="user_dictionary_list_words">単語一覧</string>
-    <string name="user_dictionary_list_words_en">英語ユーザー辞書 単語一覧</string>
-    <string name="user_dictionary_list_words_ja">日本語ユーザー辞書 単語一覧</string>
-    <string name="user_dictionary_list_words_zhcn">中国語ユーザー辞書 単語一覧</string>
     <string name="user_dictionary_edit_words">単語編集</string>
     <string name="user_dictionary_title_read">読み</string>
     <string name="user_dictionary_title_candidate">表記</string>
@@ -103,18 +118,28 @@
 
   <!-- IME dependency -->
     <!-- OpenWnn English -->
-    <string name="openwnn_english_copyright">Ver.1.3.5\nオムロン ソフトウェア(株)</string>
+    <string name="openwnn_english_copyright">Ver.1.3.6\nオムロン ソフトウェア(株)</string>
 
     <!-- OpenWnn Japanese -->
-    <string name="openwnn_japanese_copyright">Ver.1.3.5\nオムロン ソフトウェア(株)</string>
+    <string name="openwnn_japanese_copyright">Ver.1.3.6\nオムロン ソフトウェア(株)</string>
 
     <!-- OpenWnn Chinese -->
-    <string name="openwnn_china_copyright">Ver.1.3.5\nオムロン ソフトウェア(株)</string>
+    <string name="openwnn_china_copyright">Ver.1.3.6\nオムロン ソフトウェア(株)</string>
 
-  <!-- Candidate Delete -->
-      <string name="button_candidate_select">選 択</string>
-      <string name="button_candidate_delete">学習削除</string>
-      <string name="button_candidate_cancel">閉じる</string>
+    <!-- Candidate Delete -->
+    <string name="button_candidate_select">選 択</string>
+    <string name="button_candidate_delete">学習削除</string>
+
+    <!-- Candidate -->
+    <string name="cand_tab_symbol_txt">記号</string>
+    <string name="cand_tab_emoticon_txt">顔文字</string>
+
+    <!-- Symbol -->
+    <string name="half_symbol_txt">記号(半角)</string>
+    <string name="full_symbol_txt">記号(全角)</string>
+
+    <!-- Symbol keyboard -->
+    <string name="key_symbol_mode">戻る</string>
 
     <!-- Tutorial -->
     <string name="touch_to_continue">次へ &gt;&gt;</string>
@@ -132,5 +157,15 @@
     <string name="tip_to_step5"><b>入力が完了したら、携帯の\n「戻る」キー(←)を押して\nキーボードを閉じます。</b></string>
     <string name="tip_to_step6"><b>これでチュートリアルは終わりです。</b></string>
 
+    <string name="ti_input_mode_full_hirakana_title_txt">ひらがな漢字</string>
+    <string name="ti_input_mode_full_katakana_title_txt">全角カタカナ</string>
+    <string name="ti_input_mode_half_katakana_title_txt">半角カタカナ</string>
+    <string name="ti_input_mode_full_alphabet_title_txt">全角英字</string>
+    <string name="ti_input_mode_half_alphabet_title_txt">半角英字</string>
+    <string name="ti_input_mode_full_number_title_txt">全角数字</string>
+    <string name="ti_input_mode_half_number_title_txt">半角数字</string>
+
+    <string name="ti_long_press_dialog_input_mode_txt">入力モード切替</string>
+
 </resources>
 
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
new file mode 100644
index 0000000..f5606b4
--- /dev/null
+++ b/res/values-land/dimens.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <!-- key_height x 4 = keyboard_height -->
+    <!-- key_height = symbol_keyboard_height -->
+    <dimen name="key_height">40dip</dimen>
+    <dimen name="key_height_voice">80dip</dimen>
+    <dimen name="key_height_4">40dip</dimen>
+    <dimen name="key_height_5">36dip</dimen>
+    <dimen name="key_height_5_bottom">68dip</dimen>
+    <dimen name="key_height_adjustment">4dip</dimen>
+    <dimen name="key_height_4key">46dip</dimen>
+    <dimen name="candidate_delete_word_size">18dip</dimen>
+    <dimen name="key_text_size">17.5dip</dimen>
+    <dimen name="cand_space_width_emoji_symbol">0dip</dimen>
+    <dimen name="keyboard_height">160dip</dimen>
+    <dimen name="symbol_keyboard_height">40dip</dimen>
+    <dimen name="key_label_text_size">12dip</dimen>
+</resources>
diff --git a/res/values-sw768dp-land/dimens.xml b/res/values-sw768dp-land/dimens.xml
new file mode 100644
index 0000000..1e5a65a
--- /dev/null
+++ b/res/values-sw768dp-land/dimens.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <dimen name="key_height">85dip</dimen>
+    <dimen name="key_height_4">46dip</dimen>
+    <dimen name="key_height_4key">85dip</dimen>
+    <dimen name="candidate_delete_word_size">40dip</dimen>
+    <dimen name="key_text_size">30sp</dimen>
+    <dimen name="cand_space_width_emoji_symbol">0dip</dimen>
+    <dimen name="keyboard_height">340dip</dimen>
+    <dimen name="symbol_keyboard_height">85dip</dimen>
+    <dimen name="key_label_text_size">26sp</dimen>
+</resources>
diff --git a/res/values-sw768dp/colors.xml b/res/values-sw768dp/colors.xml
new file mode 100644
index 0000000..03d157d
--- /dev/null
+++ b/res/values-sw768dp/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <color name="candidate_text">#FFFFFFFF</color>
+    <color name="candidate_back">#FF000000</color>
+</resources>
diff --git a/res/values-sw768dp/dimens.xml b/res/values-sw768dp/dimens.xml
new file mode 100644
index 0000000..733c66c
--- /dev/null
+++ b/res/values-sw768dp/dimens.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <dimen name="cand_minimum_height">60dip</dimen>
+    <dimen name="key_height">73dip</dimen>
+    <dimen name="key_height_4">50dip</dimen>
+    <dimen name="key_height_4key">73dip</dimen>
+    <dimen name="candidate_delete_word_size">40dip</dimen>
+    <dimen name="key_label_text_size">20sp</dimen>
+    <dimen name="key_text_size">24sp</dimen>
+	<dimen name="cand_normal_text_size">20sp</dimen>
+    <dimen name="cand_category_text_size">20sp</dimen>
+    <dimen name="cand_minimum_width">52dip</dimen>
+    <dimen name="cand_space_width">20dip</dimen>
+    <dimen name="cand_category_minimum_height">25dip</dimen>
+    <dimen name="cand_left_align_threshold">80dip</dimen>
+    <dimen name="keyboard_height">292dip</dimen>
+    <dimen name="symbol_keyboard_height">73dip</dimen>
+    <dimen name="tab_text_size">18sp</dimen>
+    <dimen name="candidate_layout_width">36dp</dimen>
+    <dimen name="candidate_layout_height">60dp</dimen>
+</resources>
diff --git a/res/values-zh-rCN/string.xml b/res/values-zh-rCN/string.xml
index 1f798a8..0d10514 100644
--- a/res/values-zh-rCN/string.xml
+++ b/res/values-zh-rCN/string.xml
@@ -1,6 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ Copyright (C) 2008-2011  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -36,15 +51,18 @@
     <string name="preference_keyboard_skin_title">键盘自定义</string>
     <string name="preference_keyboard_skin_summary">切换到键盘自定义功能。</string>
 
-    <string name="preference_conversion_menu">输入设定</string>
+    <string name="preference_conversion_menu_ja">日语用输入设定</string>
+    <string name="preference_conversion_menu_en">英语用输入设定</string>
 
-    <string name="preference_prediction_title">预测输入</string>
+    <string name="preference_prediction_title_ja">日语用预测输入</string>
+    <string name="preference_prediction_title_en">英语用预测输入</string>
     <string name="preference_prediction_summary">显示预测候选字词。</string>
 
-    <string name="preference_correct_spell_title">错误修正</string>
+    <string name="preference_correct_spell_title_en">英语用错误修正</string>
     <string name="preference_correct_spell_summary">修正错误输入并显示正确的候补词。</string>
 
-    <string name="preference_input_learning_title">学习词典</string>
+    <string name="preference_input_learning_title_ja">日语用学习词典</string>
+    <string name="preference_input_learning_title_en">英语用学习词典</string>
     <string name="preference_input_learning_summary">将输入的字词保存在学习词典。</string>
 
     <string name="preference_aboutime_menu">关于IME</string>
@@ -80,9 +98,6 @@
 
     <!-- user dictionary -->
     <string name="user_dictionary_list_words">单词一览</string>
-    <string name="user_dictionary_list_words_en">英语用户词典 单词一览</string>
-    <string name="user_dictionary_list_words_ja">日语用户词典 单词一览</string>
-    <string name="user_dictionary_list_words_zhcn">中文用户词典 单词一览</string>
     <string name="user_dictionary_edit_words">单词编辑</string>
     <string name="user_dictionary_title_read">读音</string>
     <string name="user_dictionary_title_candidate">候补词</string>
@@ -99,6 +114,16 @@
  
       <string name="button_candidate_select">选择</string>
       <string name="button_candidate_delete">删除</string>
-      <string name="button_candidate_cancel">关闭</string>
+
+    <string name="ti_input_mode_full_hirakana_title_txt">平假名-汉字</string>
+    <string name="ti_input_mode_full_katakana_title_txt">全角片假名</string>
+    <string name="ti_input_mode_half_katakana_title_txt">半角片假名</string>
+    <string name="ti_input_mode_full_alphabet_title_txt">全角字母</string>
+    <string name="ti_input_mode_half_alphabet_title_txt">半角字母</string>
+    <string name="ti_input_mode_full_number_title_txt">全角数字</string>
+    <string name="ti_input_mode_half_number_title_txt">半角数字</string>
+
+    <string name="ti_long_press_dialog_input_mode_txt">输入模式</string>
+
 </resources>
 
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 740668a..f0657de 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
new file mode 100644
index 0000000..5b86598
--- /dev/null
+++ b/res/values/attrs.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <declare-styleable name="WnnKeyboardView">
+        <!-- 2nd Image for the key. This image needs to be a StateListDrawable, with the following
+             possible states: normal, pressed, checkable, checkable+pressed, checkable+checked,
+             checkable+checked+pressed. -->
+        <attr name="keyBackground2nd" format="reference" />
+        <attr name="keyTextColor2nd" format="color" />
+    </declare-styleable>
+
+    <declare-styleable name="WnnKeyboard_Key">
+        <!-- Whether this is 2nd key -->
+        <attr name="isSecondKey" format="boolean" />
+    </declare-styleable>
+</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 66c1d9a..cfd19e0 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,16 +15,31 @@
  limitations under the License.
 -->
 <resources>
-    <color name="candidate_text">#ff404040</color>
-    <color name="candidate_back">#FFEFEBEF</color>
+    <color name="candidate_text">#FFFFFFFF</color>
+    <color name="candidate_text_1line">#FFFFFFFF</color>
+    <color name="candidate_back">#222222</color>
+    <color name="candidate_back_1line">#FF000000</color>
+    <color name="candidate_tab_back">#FF000000</color>
     <color name="indicator_textcolor_default">#0032CD32</color>
-    <color name="indicator_textcolor_caps_off">#0032CD32</color>
-    <color name="indicator_textcolor_caps_on">#Cd32CD32</color>
+    <color name="indicator_textcolor_caps_off">#FFC0C0C0</color>
+    <color name="indicator_textcolor_caps_on">#CD32CD32</color>
     <color name="indicator_textcolor_caps_lock">#FF32CD32</color>
-    <color name="indicator_textcolor_alt_off">#00ff8800</color>
-    <color name="indicator_textcolor_alt_on">#CDff8800</color>
-    <color name="indicator_textcolor_alt_lock">#ffff8800</color>
-    <color name="indicator_textbackground_default">#fff0f0f0</color>
+    <color name="indicator_textcolor_alt_off">#FFC0C0C0</color>
+    <color name="indicator_textcolor_alt_on">#CDFF8800</color>
+    <color name="indicator_textcolor_alt_lock">#FFFF8800</color>
+    <color name="indicator_textbackground_default">#FFF0F0F0</color>
     <color name="indicator_background_lock_caps">#5532CD32</color>
-    <color name="indicator_background_lock_alt">#55ff8800</color>
+    <color name="indicator_background_lock_alt">#55FF8800</color>
+    <color name="keybord_textcolor_default">#FFFFFFFF</color>
+    <color name="candidate_webapi_text">#FF0000FF</color>
+    <color name="nocandidate_text">#400000FF</color>
+    <color name="key_text_color">#FFFFFFFF</color>
+    <color name="key_text_color_2nd">#FFFFFFFF</color>
+    <color name="key_text_color_std">#FFFFFFFF</color>
+    <color name="symbol_tab">#FF000000</color>
+    <color name="symbol_tab_gray">#FFAAAAAA</color>
+    <color name="tab_textcolor_select">#FFFFFFFF</color>
+    <color name="tab_textcolor_no_select">#FFFFFFFF</color>
+    <color name="tab_textcolor_disable">#FF404040</color>
+    <color name="candidate_longpress_dialog_text">#FF000000</color>
 </resources>
diff --git a/res/values/debug_tool_values.xml b/res/values/debug_tool_values.xml
new file mode 100644
index 0000000..20b51aa
--- /dev/null
+++ b/res/values/debug_tool_values.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+    <string name="openwnn_label">OpenWnn</string>
+    <string name="app_openwnn_test">OpenWnn onEvent() Test</string>
+    <string name="execButton">Execute onEvent Test</string>
+    <string name="openwnn_engine_label">OpenWnnEngine</string>
+    <string name="execButton2">Engine All</string>
+
+    <string name="debug_openwnn_engine_en">OpenWnnEngineEN</string>
+    <string name="debug_openwnn_engine_jajp">OpenWnnEngineJAJP</string>
+    <string name="debug_openwnn_engine_znch">OpenWnnEngineZNCH</string>
+    <string name="debug_texttype_anything">textType:anything</string>
+    <string name="debug_texttype_integer">textType:integer</string>
+    <string name="debug_texttype_signed">textType:signed</string>
+    <string name="debug_texttype_demical">textType:demical</string>
+    <string name="debug_texttype_password">textType:password</string>
+    <string name="debug_texttype_phone">textType:phoneNumber</string>
+    <string name="debug_texttype_singleLine">android:singleLine</string>
+    <string name="debug_texttype_date_time">android:inputType</string>
+</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d90f9aa..0bc61d0 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,10 +15,38 @@
  limitations under the License.
 -->
 <resources>
+    <!-- key_height x 4 = keyboard_height -->
+    <!-- key_height = symbol_keyboard_height -->
     <dimen name="key_height">50dip</dimen>
+    <dimen name="key_height_4">50dip</dimen>
+    <dimen name="key_height_5">40dip</dimen>
+    <dimen name="key_height_5_bottom">60dip</dimen>
+    <dimen name="key_height_qwerty">44dip</dimen>
     <dimen name="key_height_landscape">34dip</dimen>
-    <dimen name="candidate_font_size">20sp</dimen>
-    <dimen name="candidate_delete_word_size">28px</dimen>
-    <dimen name="candidate_delete_word_size_landscape">24px</dimen>
+    <dimen name="key_height_adjustment">0dip</dimen>
+    <dimen name="key_height_4key">50dip</dimen>
+    <dimen name="candidate_delete_word_size">28dip</dimen>
+    <dimen name="key_label_text_size">12dip</dimen>
+    <dimen name="key_text_size">22dip</dimen>
+    <dimen name="cand_normal_text_size">18sp</dimen>
+    <dimen name="cand_category_text_size">18dip</dimen>
+    <dimen name="cand_minimum_width">52dip</dimen>
+    <dimen name="cand_minimum_height">37dip</dimen>
+    <dimen name="cand_space_width">20dip</dimen>
+    <dimen name="cand_space_width_emoji_symbol">4dip</dimen>
+    <dimen name="cand_category_minimum_height">25dip</dimen>
+    <dimen name="cand_left_align_threshold">80dip</dimen>
+    <dimen name="keyboard_height">200dip</dimen>
+    <dimen name="symbol_keyboard_height">50dip</dimen>
+    <dimen name="preview_offset_candidate">37dip</dimen>
+    <dimen name="preview_offset_symbol">148dip</dimen>
+    <dimen name="tab_text_size">18dip</dimen>
+    <dimen name="list_preference_span_string_gap">22dip</dimen>
+    <dimen name="list_preference_span_image_gap">11dip</dimen>
+    <dimen name="list_preference_span_right_gap">10dip</dimen>
+    <dimen name="candidate_layout_width">36dp</dimen>
+    <dimen name="candidate_layout_height">60dp</dimen>
     <dimen name="bubble_pointer_offset">22dip</dimen>
-</resources>
+    <dimen name="candidate_longpress_dialog_button_word_size">12dip</dimen>
+    <dimen name="candidate_longpress_dialog_candidate_word_size">28dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 883a927..e9e1019 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1,6 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ Copyright (C) 2008-2011  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -41,14 +56,21 @@
     <string name="preference_keyboard_metal">Metal</string>
 
     <string name="preference_conversion_menu">Conversion</string>
+    <string name="preference_conversion_menu_ja">Japanese Conversion</string>
+    <string name="preference_conversion_menu_en">English Conversion</string>
 
     <string name="preference_prediction_title">Word Prediction</string>
+    <string name="preference_prediction_title_ja">Japanese Word Prediction</string>
+    <string name="preference_prediction_title_en">English Word Prediction</string>
     <string name="preference_prediction_summary">Display predicted words as conversion candidates.</string>
 
     <string name="preference_correct_spell_title">Typing Error Correction</string>
+    <string name="preference_correct_spell_title_en">English Typing Error Correction</string>
     <string name="preference_correct_spell_summary">Display predicted words for correcting typing error.</string>
 
     <string name="preference_input_learning_title">Input Word Learning</string>
+    <string name="preference_input_learning_title_ja">Japanese Input Word Learning</string>
+    <string name="preference_input_learning_title_en">English Input Word Learning</string>
     <string name="preference_input_learning_summary">Learn input words.</string>
 
     <string name="preference_aboutime_menu"> About IME </string>
@@ -84,9 +106,9 @@
 
     <!-- user dictionary -->
     <string name="user_dictionary_list_words">Registered words</string>
-    <string name="user_dictionary_list_words_en">Registered words in English User Dic</string>
-    <string name="user_dictionary_list_words_ja">Registered words in Japanese User Dic</string>
-    <string name="user_dictionary_list_words_zhcn">Registered words in Chinese User Dic</string>
+    <string name="user_dictionary_list_words_en">@string/preference_dictionary_menu_en</string>
+    <string name="user_dictionary_list_words_ja">@string/preference_dictionary_menu_ja</string>
+    <string name="user_dictionary_list_words_zhcn">@string/preference_dictionary_menu_zhcn</string>
     <string name="user_dictionary_edit_words">Edit</string>
     <string name="user_dictionary_title_read">Reading</string>
     <string name="user_dictionary_title_candidate">Word</string>
@@ -105,33 +127,44 @@
 
   <!-- IME dependency -->
     <!-- OpenWnn English -->
-    <string name="openwnn_english_copyright">Ver.1.3.5\nOMRON SOFTWARE Co., Ltd.</string>
+    <string name="openwnn_english_copyright">Ver.1.3.6\nOMRON SOFTWARE Co.,Ltd.</string>
     <string name="openwnn_english">OpenWnn English</string>
     <string name="openwnn_english_system_dictionary">/data/data/jp.co.omronsoft.openwnn/lib/libWnnEngDic.so</string>
     <string name="openwnn_english_writable_dictionary">/data/data/jp.co.omronsoft.openwnn/writableEN.dic</string>
     <string name="en_word_separators">.,;:!?</string>
 
     <!-- OpenWnn Japanese -->
-    <string name="openwnn_japanese_copyright">Ver.1.3.5\nOMRON SOFTWARE Co., Ltd.</string>
+    <string name="openwnn_japanese_copyright">Ver.1.3.6\nOMRON SOFTWARE Co.,Ltd.</string>
     <string name="openwnn_japanese">Japanese IME</string>
     <string name="openwnn_japanese_system_dictionary">/data/data/jp.co.omronsoft.openwnn/lib/libWnnJpnDic.so</string>
     <string name="openwnn_japanese_writable_dictionary">/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic</string>
 
     <!-- OpenWnn Chinese -->
-    <string name="openwnn_china_copyright">Ver.1.3.5\nOMRON SOFTWARE Co., Ltd.</string>
+    <string name="openwnn_china_copyright">Ver.1.3.6\nOMRON SOFTWARE Co.,Ltd.</string>
     <string name="openwnn_china">OpenWnn Chinese</string>
     <string name="openwnn_china_system_dictionary">/data/data/jp.co.omronsoft.openwnn/lib/libWnnZHCNDic.so</string>
-<!-- After Config Change -->
+    <!-- After Config Change -->
     <string name="openwnn_china_writable_dictionary">/data/data/jp.co.omronsoft.openwnn/writableZHCN.dic</string>
     <string name="cn_word_separators">.,;:!?</string>
 
-  <!-- Candidate Delete -->
-      <string name="button_candidate_select">Select</string>
-      <string name="button_candidate_delete">Delete learning?</string>
-      <string name="button_candidate_cancel">Close</string>
+    <!-- Candidate Delete -->
+    <string name="button_candidate_select">Select</string>
+    <string name="button_candidate_delete">Delete learning?</string>
 
+    <!-- Candidate -->
+    <string name="cand_tab_symbol_txt">Symbol</string>
+    <string name="cand_tab_emoticon_txt">Emoticon</string>
 
-  <!-- Key top -->
+    <!-- Symbol -->
+    <string name="half_symbol_categories_txt">[Half Symbol Categories]</string>
+    <string name="full_symbol_categories_txt">[Full Symbol Categories]</string>
+    <string name="half_symbol_txt">Symbol(Half)</string>
+    <string name="full_symbol_txt">Symbol(Full)</string>
+
+    <!-- Symbol keyboard -->
+    <string name="key_symbol_mode">Cancel</string>
+
+    <!-- Key top -->
     <string name="key_left_arrow">↤</string>
     <string name="key_right_arrow">↦</string>
     <string name="key_space">スペース</string>
@@ -216,6 +249,7 @@
     <string name="key_qwerty_full_yen_sign">¥</string>
     <string name="key_qwerty_full_hat">^</string>
     <string name="key_qwerty_full_slash">/</string>
+    <string name="key_qwerty_euro">\u20AC</string>
 
     <string name="key_12key_switch_full_hiragana">あ</string>
     <string name="key_12key_switch_full_katakana">カ</string>
@@ -235,7 +269,6 @@
     <string name="indicator_caps">CAPS</string>
     <string name="indicator_alt">ALT</string>
 
-
     <!-- Tutorial -->
     <string name="touch_to_continue">Next »</string>
     <string name="touch_to_try">Try it on the button below.</string>
@@ -256,5 +289,18 @@
     <string name="tip_en_to_close_keyboard"><b>Press \"back\" (←) to close the keyboard.</b></string>
     <string name="tip_en_end_of_tutorial"><b>This is the end of the tutorial.</b></string>
 
+    <!-- subtype String -->
+    <string name="label_subtype_generic">%s</string>
+
+    <string name="ti_input_mode_full_hirakana_title_txt">Hiragana-Kanji</string>
+    <string name="ti_input_mode_full_katakana_title_txt">Full-width Katakana</string>
+    <string name="ti_input_mode_half_katakana_title_txt">Half-width Katakana</string>
+    <string name="ti_input_mode_full_alphabet_title_txt">Full-width Alphabet</string>
+    <string name="ti_input_mode_half_alphabet_title_txt">Half-width Alphabet</string>
+    <string name="ti_input_mode_full_number_title_txt">Full-width Numeric</string>
+    <string name="ti_input_mode_half_number_title_txt">Half-width Numeric</string>
+
+    <string name="ti_long_press_dialog_input_mode_txt">Input Mode</string>
+
 </resources>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
new file mode 100644
index 0000000..e129d73
--- /dev/null
+++ b/res/values/styles.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+    <style name="WnnKeyboardView" parent="@android:style/Widget.KeyboardView">
+    </style>
+    <style name="Dialog" parent="android:style/Theme.Holo.Light.Dialog">
+        <item name="android:windowNoTitle">true</item>
+    </style>
+</resources>
diff --git a/res/xml-land/keyboard_qwerty_jp.xml b/res/xml-land/keyboard_qwerty_jp.xml
new file mode 100644
index 0000000..b0c2bee
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+   android:keyWidth="9%p"
+   android:horizontalGap="0.93%p"
+   android:verticalGap="0dip"
+   android:keyHeight="@dimen/key_height"
+   >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="44" android:keyLabel="@string/key_qwerty_full_touten"/>
+    <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space_conv" android:iconPreview="@drawable/key_qwerty_space_conv_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="46" android:keyLabel="@string/key_qwerty_full_kuten"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_alphabet.xml b/res/xml-land/keyboard_qwerty_jp_full_alphabet.xml
new file mode 100644
index 0000000..f1815da
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_alphabet.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="65361" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65367" android:keyLabel="w"/>
+    <Key android:codes="65349" android:keyLabel="e"/>
+    <Key android:codes="65362" android:keyLabel="r"/>
+    <Key android:codes="65364" android:keyLabel="t"/>
+    <Key android:codes="65369" android:keyLabel="y"/>
+    <Key android:codes="65365" android:keyLabel="u"/>
+    <Key android:codes="65353" android:keyLabel="i"/>
+    <Key android:codes="65359" android:keyLabel="o"/>
+    <Key android:codes="65360" android:keyLabel="p" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="65345" android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65363" android:keyLabel="s"/>
+    <Key android:codes="65348" android:keyLabel="d"/>
+    <Key android:codes="65350" android:keyLabel="f"/>
+    <Key android:codes="65351" android:keyLabel="g"/>
+    <Key android:codes="65352" android:keyLabel="h"/>
+    <Key android:codes="65354" android:keyLabel="j"/>
+    <Key android:codes="65355" android:keyLabel="k"/>
+    <Key android:codes="65356" android:keyLabel="l"/>
+    <Key android:codes="65312" android:keyLabel="@string/key_qwerty_full_at_sign"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="65370" android:keyLabel="z"/>
+    <Key android:codes="65368" android:keyLabel="x"/>
+    <Key android:codes="65347" android:keyLabel="c"/>
+    <Key android:codes="65366" android:keyLabel="v"/>
+    <Key android:codes="65346" android:keyLabel="b"/>
+    <Key android:codes="65358" android:keyLabel="n"/>
+    <Key android:codes="65357" android:keyLabel="m"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"/>
+    <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_alphabet_shift.xml b/res/xml-land/keyboard_qwerty_jp_full_alphabet_shift.xml
new file mode 100644
index 0000000..53bcfde
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_alphabet_shift.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="65329" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65335" android:keyLabel="W"/>
+    <Key android:codes="65317" android:keyLabel="E"/>
+    <Key android:codes="65330" android:keyLabel="R"/>
+    <Key android:codes="65332" android:keyLabel="T"/>
+    <Key android:codes="65337" android:keyLabel="Y"/>
+    <Key android:codes="65333" android:keyLabel="U"/>
+    <Key android:codes="65321" android:keyLabel="I"/>
+    <Key android:codes="65327" android:keyLabel="O"/>
+    <Key android:codes="65328" android:keyLabel="P" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="65313" android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65331" android:keyLabel="S"/>
+    <Key android:codes="65316" android:keyLabel="D"/>
+    <Key android:codes="65318" android:keyLabel="F"/>
+    <Key android:codes="65319" android:keyLabel="G"/>
+    <Key android:codes="65320" android:keyLabel="H"/>
+    <Key android:codes="65322" android:keyLabel="J"/>
+    <Key android:codes="65323" android:keyLabel="K"/>
+    <Key android:codes="65324" android:keyLabel="L"/>
+    <Key android:codes="65295" android:keyLabel="@string/key_qwerty_full_slash"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="65338" android:keyLabel="Z"/>
+    <Key android:codes="65336" android:keyLabel="X"/>
+    <Key android:codes="65315" android:keyLabel="C"/>
+    <Key android:codes="65334" android:keyLabel="V"/>
+    <Key android:codes="65314" android:keyLabel="B"/>
+    <Key android:codes="65326" android:keyLabel="N"/>
+    <Key android:codes="65325" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
+    <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_katakana.xml b/res/xml-land/keyboard_qwerty_jp_full_katakana.xml
new file mode 100644
index 0000000..752d41c
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_katakana.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="12289" android:keyLabel="@string/key_qwerty_full_touten"/>
+    <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="12290" android:keyLabel="@string/key_qwerty_full_kuten"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_katakana_shift.xml b/res/xml-land/keyboard_qwerty_jp_full_katakana_shift.xml
new file mode 100644
index 0000000..2a086aa
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_katakana_shift.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
+    <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_symbols.xml b/res/xml-land/keyboard_qwerty_jp_full_symbols.xml
new file mode 100644
index 0000000..281f6a8
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_symbols.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+        <Key android:codes="65298" android:keyLabel="2"/>
+        <Key android:codes="65299" android:keyLabel="3"/>
+        <Key android:codes="65300" android:keyLabel="4"/>
+        <Key android:codes="65301" android:keyLabel="5"/>
+        <Key android:codes="65302" android:keyLabel="6"/>
+        <Key android:codes="65303" android:keyLabel="7"/>
+        <Key android:codes="65304" android:keyLabel="8"/>
+        <Key android:codes="65305" android:keyLabel="9"/>
+        <Key android:codes="65296" android:keyLabel="0" android:keyEdgeFlags="right"/>
+    </Row>
+
+    <Row>
+        <Key android:codes="65312" android:keyLabel="@string/key_qwerty_full_at_sign" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+        <Key android:codes="65283" android:keyLabel="@string/key_qwerty_full_number_sign" />
+        <Key android:codes="65285" android:keyLabel="@string/key_qwerty_full_percent_sign" />
+        <Key android:codes="65286" android:keyLabel="@string/key_qwerty_full_ampersand" />
+        <Key android:codes="65290" android:keyLabel="@string/key_qwerty_full_asterrisk" />
+	    <Key android:codes="65291" android:keyLabel="@string/key_qwerty_full_plus_sign" />
+        <Key android:codes="65293" android:keyLabel="@string/key_qwerty_full_minus_sign" />
+        <Key android:codes="65309" android:keyLabel="@string/key_qwerty_full_equal_sign" />
+        <Key android:codes="12300" android:keyLabel="@string/key_qwerty_kagi_kakko_left" />
+        <Key android:codes="12301" android:keyLabel="@string/key_qwerty_kagi_kakko_right"  android:keyEdgeFlags="right"/>
+    </Row>
+
+    <Row android:horizontalGap="0.82%p">
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+             android:keyWidth="14%p" android:horizontalGap="1.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+        <Key android:codes="65295" android:keyLabel="@string/key_qwerty_full_slash" />
+        <Key android:codes="65288" android:keyLabel="@string/key_qwerty_full_left_parenthesis" />
+        <Key android:codes="65289" android:keyLabel="@string/key_qwerty_full_right_parenthesis" />
+        <Key android:codes="65306" android:keyLabel="@string/key_qwerty_full_colon" />
+        <Key android:codes="65307" android:keyLabel="@string/key_qwerty_full_semicolon" />
+        <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"  />
+        <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question" />
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:keyWidth="13.9%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+    </Row>
+
+    <Row  android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
+	         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
+             android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true" />
+        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+             android:keyWidth="15%p" wnn:isSecondKey="true" />
+        <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"/>
+        <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+             android:keyWidth="15.1%p" android:isRepeatable="true"/>
+        <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+    </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_full_symbols_shift.xml b/res/xml-land/keyboard_qwerty_jp_full_symbols_shift.xml
new file mode 100644
index 0000000..014dbbb
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_full_symbols_shift.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65298" android:keyLabel="2"/>
+    <Key android:codes="65299" android:keyLabel="3"/>
+    <Key android:codes="65300" android:keyLabel="4"/>
+    <Key android:codes="65301" android:keyLabel="5"/>
+    <Key android:codes="65302" android:keyLabel="6"/>
+    <Key android:codes="65303" android:keyLabel="7"/>
+    <Key android:codes="65304" android:keyLabel="8"/>
+    <Key android:codes="65305" android:keyLabel="9"/>
+    <Key android:codes="65296" android:keyLabel="0" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="65374" android:keyLabel="@string/key_qwerty_full_thilde" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="65342" android:keyLabel="@string/key_qwerty_full_hat"/>
+    <Key android:codes="65509" android:keyLabel="@string/key_qwerty_full_yen_sign"/>
+    <Key android:codes="65284" android:keyLabel="@string/key_qwerty_full_dollar_sign"/>
+    <Key android:codes="8221" android:keyLabel="@string/key_qwerty_full_double_quotation_sign"/>
+    <Key android:codes="177" android:keyLabel="@string/key_qwerty_full_plus_minus_sign" />
+    <Key android:codes="65343" android:keyLabel="@string/key_qwerty_full_underscore"/>
+    <Key android:codes="65340" android:keyLabel="@string/key_qwerty_full_back_slash"/>
+    <Key android:codes="65371" android:keyLabel="@string/key_qwerty_full_left_curly_blacket"/>
+    <Key android:codes="65373" android:keyLabel="@string/key_qwerty_full_right_curly_blacket" android:keyEdgeFlags="right"/>
+  </Row>
+ 
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="65372" android:keyLabel="@string/key_qwerty_full_vertical_bar"/>
+    <Key android:codes="65308" android:keyLabel="@string/key_qwerty_full_less_than_sign"/>
+    <Key android:codes="65310" android:keyLabel="@string/key_qwerty_full_greater_than_sign"/>
+    <Key android:codes="8216" android:keyLabel="@string/key_qwerty_full_left_single_quote"/>
+    <Key android:codes="8217" android:keyLabel="@string/key_qwerty_full_right_single_quote"/>
+    <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma" />
+    <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period" />
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+	     android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
+         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true" />
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true" />
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
+    <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="12539" android:keyLabel="@string/key_qwerty_full_middot"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_alphabet.xml b/res/xml-land/keyboard_qwerty_jp_half_alphabet.xml
new file mode 100644
index 0000000..7022546
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_alphabet.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+      >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="64"  android:keyLabel="\@" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="44" android:keyLabel=","/>
+    <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="46" android:keyLabel="."/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_alphabet_shift.xml b/res/xml-land/keyboard_qwerty_jp_half_alphabet_shift.xml
new file mode 100644
index 0000000..8dd1403
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_alphabet_shift.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="47"  android:keyLabel="/" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
+    <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_katakana.xml b/res/xml-land/keyboard_qwerty_jp_half_katakana.xml
new file mode 100644
index 0000000..2ba273d
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_katakana.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="65392" android:keyLabel="@string/key_qwerty_half_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65380" android:keyLabel="@string/key_qwerty_half_comma"/>
+    <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65377" android:keyLabel="@string/key_qwerty_half_period"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_katakana_shift.xml b/res/xml-land/keyboard_qwerty_jp_half_katakana_shift.xml
new file mode 100644
index 0000000..fa48feb
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_katakana_shift.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="65392" android:keyLabel="@string/key_qwerty_half_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
+    <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_symbols.xml b/res/xml-land/keyboard_qwerty_jp_half_symbols.xml
new file mode 100644
index 0000000..47676ca
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_symbols.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+        <Key android:codes="50" android:keyLabel="2"/>
+        <Key android:codes="51" android:keyLabel="3"/>
+        <Key android:codes="52" android:keyLabel="4"/>
+        <Key android:codes="53" android:keyLabel="5"/>
+        <Key android:codes="54" android:keyLabel="6"/>
+        <Key android:codes="55" android:keyLabel="7"/>
+        <Key android:codes="56" android:keyLabel="8"/>
+        <Key android:codes="57" android:keyLabel="9"/>
+        <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+        <Key android:codes="35" android:keyLabel="\#"/>
+        <Key android:codes="37" android:keyLabel="%"/>
+        <Key android:codes="38" android:keyLabel="&amp;"/>
+        <Key android:codes="42" android:keyLabel="*"/>
+        <Key android:codes="43" android:keyLabel="+"/>
+        <Key android:codes="45" android:keyLabel="-"/>
+        <Key android:codes="61" android:keyLabel="="/>
+        <Key android:codes="91" android:keyLabel="["/>
+        <Key android:codes="93" android:keyLabel="]" android:keyEdgeFlags="right"/>
+    </Row>
+ 
+    <Row android:horizontalGap="0.82%p">
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+             android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+        <Key android:codes="47" android:keyLabel="/" />
+        <Key android:codes="40" android:keyLabel="("/>
+        <Key android:codes="41" android:keyLabel=")"/>
+        <Key android:codes="58" android:keyLabel=":"/>
+        <Key android:codes="59" android:keyLabel=";"/>
+        <Key android:codes="33" android:keyLabel="!" />
+        <Key android:codes="63" android:keyLabel="\?"/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:keyWidth="13.9%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+    </Row>
+ 
+    <Row  android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
+             android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+             android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+             android:keyWidth="15%p" wnn:isSecondKey="true" />
+        <Key android:codes="44" android:keyLabel=","/>
+        <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+             android:keyWidth="15.1%p" android:isRepeatable="true"/>
+        <Key android:codes="46" android:keyLabel="."/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+    </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_half_symbols_shift.xml b/res/xml-land/keyboard_qwerty_jp_half_symbols_shift.xml
new file mode 100644
index 0000000..a5bc804
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_half_symbols_shift.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+      >
+
+  <Row>
+    <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="50" android:keyLabel="2"/>
+    <Key android:codes="51" android:keyLabel="3"/>
+    <Key android:codes="52" android:keyLabel="4"/>
+    <Key android:codes="53" android:keyLabel="5"/>
+    <Key android:codes="54" android:keyLabel="6"/>
+    <Key android:codes="55" android:keyLabel="7"/>
+    <Key android:codes="56" android:keyLabel="8"/>
+    <Key android:codes="57" android:keyLabel="9"/>
+    <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="126" android:keyLabel="~" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="94" android:keyLabel="^"/>
+    <Key android:codes="165" android:keyLabel="¥"/>
+    <Key android:codes="36" android:keyLabel="$"/>
+    <Key android:codes="34" android:keyLabel="&quot;"/>
+    <Key android:codes="43" android:keyLabel="+" />
+    <Key android:codes="95" android:keyLabel="_"/>
+    <Key android:codes="92" android:keyLabel="\\" />
+    <Key android:codes="123" android:keyLabel="{"/>
+    <Key android:codes="125" android:keyLabel="}" android:keyEdgeFlags="right"/>
+  </Row>
+ 
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="124" android:keyLabel="|"/>
+    <Key android:codes="60" android:keyLabel="&lt;"/>
+    <Key android:codes="62" android:keyLabel="&gt;"/>
+    <Key android:codes="96" android:keyLabel="`"/>
+    <Key android:codes="39" android:keyLabel="'"/>
+    <Key android:codes="44" android:keyLabel="," />
+    <Key android:codes="46" android:keyLabel="." />
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
+         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
+    <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-land/keyboard_qwerty_jp_shift.xml b/res/xml-land/keyboard_qwerty_jp_shift.xml
new file mode 100644
index 0000000..c1e1f9e
--- /dev/null
+++ b/res/xml-land/keyboard_qwerty_jp_shift.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="0dip"
+      android:keyHeight="@dimen/key_height"
+  >
+
+  <Row>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
+         android:keyEdgeFlags="right"/>
+  </Row>
+
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
+    <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space_conv" android:iconPreview="@drawable/key_qwerty_space_conv_b"
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
+  </Row>
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_12key_phone.xml b/res/xml-sw768dp/keyboard_12key_phone.xml
new file mode 100644
index 0000000..ecf7d6a
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_12key_phone.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyWidth="20%p"
+    android:horizontalGap="0.9%p"
+    android:verticalGap="0.9%p"
+    android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="-310" android:keyLabel=""
+             android:keyEdgeFlags="left" android:keyWidth="18%" pj:isSecondKey="true"/>
+        <Key android:codes="49" android:keyLabel="1" android:horizontalGap="2%"/>
+        <Key android:codes="50" android:keyLabel="2"/>
+        <Key android:codes="51" android:keyLabel="3"/>
+        <Key android:codes="-214"
+             android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" pj:isSecondKey="true"/>
+        <Key android:codes="52" android:keyLabel="4" android:horizontalGap="2%"/>
+        <Key android:codes="53" android:keyLabel="5"/>
+        <Key android:codes="54" android:keyLabel="6"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="45" android:keyLabel="-" android:keyWidth="18%" pj:isSecondKey="true"/>
+        <Key android:codes="55" android:keyLabel="7" android:horizontalGap="2%"/>
+        <Key android:codes="56" android:keyLabel="8"/>
+        <Key android:codes="57" android:keyLabel="9"/>
+        <Key android:codes="43" android:keyLabel="+" android:horizontalGap="2%" android:keyWidth="18%" pj:isSecondKey="true"/>
+    </Row>
+
+    <Row android:rowEdgeFlags="bottom">
+        <Key android:codes="-310" android:keyLabel="" android:keyEdgeFlags="left"  android:keyWidth="18%" pj:isSecondKey="true"/>
+        <Key android:codes="42" android:keyLabel="*"  android:horizontalGap="2%"/>
+        <Key android:codes="48" android:keyLabel="0" />
+        <Key android:codes="35" android:keyLabel="#" />
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter"
+             android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" pj:isSecondKey="true"/>
+    </Row>
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp.xml b/res/xml-sw768dp/keyboard_qwerty_jp.xml
new file mode 100644
index 0000000..9b67157
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+         xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+         android:keyWidth="7%p"
+         android:horizontalGap="0.9%p"
+         android:verticalGap="0.9%p"
+         android:keyHeight="@dimen/key_height"
+         >
+
+  <Row>
+    <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+    <Key android:codes="113" android:keyLabel="q"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true" />
+  </Row>
+
+  <Row>
+    <Key android:codes="-304" android:keyLabel=".?123"
+         android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+    <Key android:codes="97"  android:keyLabel="a"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="12540" android:keyLabel="ー"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+         android:keyEdgeFlags="right" android:keyWidth="9%p" pj:isSecondKey="true"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:keyWidth="12.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="44"  android:keyLabel="、"/>
+    <Key android:codes="46"  android:keyLabel="。"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" pj:isSecondKey="true" android:isRepeatable="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom">
+    <Key android:codes="-307" android:keyIcon="@drawable/key_mode_hira"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+    <Key android:codes="12288" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+  </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols.xml b/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols.xml
new file mode 100644
index 0000000..2bb94ec
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyWidth="7%p"
+    android:horizontalGap="0.9%p"
+    android:verticalGap="0.9%p"
+    android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"/>
+        <Key android:codes="65297" android:keyLabel="1"/>
+        <Key android:codes="65298" android:keyLabel="2"/>
+        <Key android:codes="65299" android:keyLabel="3"/>
+        <Key android:codes="65300" android:keyLabel="4"/>
+        <Key android:codes="65301" android:keyLabel="5"/>
+        <Key android:codes="65302" android:keyLabel="6"/>
+        <Key android:codes="65303" android:keyLabel="7"/>
+        <Key android:codes="65304" android:keyLabel="8"/>
+        <Key android:codes="65305" android:keyLabel="9"/>
+        <Key android:codes="65296" android:keyLabel="0"/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-301" android:keyLabel="ABC" android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"/>
+        <Key android:codes="65294" android:keyLabel="." />
+        <Key android:codes="65292" android:keyLabel="," />
+        <Key android:codes="65306" android:keyLabel=":"/>
+        <Key android:codes="65307" android:keyLabel=";"/>
+        <Key android:codes="65288" android:keyLabel="("/>
+        <Key android:codes="65289" android:keyLabel=")"/>
+        <Key android:codes="65509" android:keyLabel="¥"/>
+        <Key android:codes="65286" android:keyLabel="&amp;"/>
+        <Key android:codes="65312" android:keyLabel="\@"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+             android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:keyWidth="12.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%"/>
+        <Key android:codes="65291" android:keyLabel="+"/>
+        <Key android:codes="65293" android:keyLabel="-"/>
+        <Key android:codes="65290" android:keyLabel="*" />
+        <Key android:codes="65295" android:keyLabel="/"/>
+        <Key android:codes="12300" android:keyLabel="「"/>
+        <Key android:codes="12301" android:keyLabel="」" />
+        <Key android:codes="12539" android:keyLabel="・" />
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:horizontalGap="16.85%p" pj:isSecondKey="true" android:isRepeatable="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+    </Row>
+ 
+    <Row android:rowEdgeFlags="bottom">
+        <Key android:codes="-308" android:keyIcon="@drawable/key_mode_full_num"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+        <Key android:codes="12288" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+  </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols_shift.xml b/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols_shift.xml
new file mode 100644
index 0000000..5e283af
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_full_symbols_shift.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyWidth="7%p"
+    android:horizontalGap="0.9%p"
+    android:verticalGap="0.9%p"
+    android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"/>
+        <Key android:codes="65339" android:keyLabel="[" />
+        <Key android:codes="65341" android:keyLabel="]" />
+        <Key android:codes="65371" android:keyLabel="{"/>
+        <Key android:codes="65373" android:keyLabel="}"/>
+        <Key android:codes="65283" android:keyLabel="\#"/>
+        <Key android:codes="65285" android:keyLabel="%"/>
+        <Key android:codes="65342" android:keyLabel="^"/>
+        <Key android:codes="65290" android:keyLabel="*"/>
+        <Key android:codes="65291" android:keyLabel="+"/>
+        <Key android:codes="65309" android:keyLabel="="/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-301" android:keyLabel="ABC" android:keyWidth="10%p"  android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"/>
+        <Key android:codes="65343" android:keyLabel="_" />
+        <Key android:codes="65509" android:keyLabel="¥"/>
+        <Key android:codes="65372" android:keyLabel="|"/>
+        <Key android:codes="65374" android:keyLabel="~"/>
+        <Key android:codes="65308" android:keyLabel="&lt;"/>
+        <Key android:codes="65310" android:keyLabel="&gt;"/>
+        <Key android:codes="65284" android:keyLabel="$"/>
+        <Key android:codes="8364" android:keyLabel="@string/key_qwerty_euro"/>
+        <Key android:codes="65505" android:keyLabel="£"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+             android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift_locked" android:keyWidth="12.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%"/>
+        <Key android:codes="65294" android:keyLabel="." />
+        <Key android:codes="65292" android:keyLabel="," />
+        <Key android:codes="65311" android:keyLabel="\?" />
+        <Key android:codes="65281" android:keyLabel="!" />
+        <Key android:codes="8217" android:keyLabel="@string/key_qwerty_full_right_single_quote" />
+        <Key android:codes="8221" android:keyLabel="@string/key_qwerty_full_double_quotation_sign" />
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:horizontalGap="24.85%p" pj:isSecondKey="true" android:isRepeatable="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+    </Row>
+
+    <Row android:rowEdgeFlags="bottom">
+        <Key android:codes="-308" android:keyIcon="@drawable/key_mode_full_num"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+        <Key android:codes="12288" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+    </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet.xml b/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet.xml
new file mode 100644
index 0000000..82f2888
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+         xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+         android:keyWidth="7%p"
+         android:horizontalGap="0.9%p"
+         android:verticalGap="0.9%p"
+         android:keyHeight="@dimen/key_height"
+  >
+  
+  <Row>
+    <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%" />
+    <Key android:codes="113" android:keyLabel="q"/>
+    <Key android:codes="119" android:keyLabel="w"/>
+    <Key android:codes="101" android:keyLabel="e"/>
+    <Key android:codes="114" android:keyLabel="r"/>
+    <Key android:codes="116" android:keyLabel="t"/>
+    <Key android:codes="121" android:keyLabel="y"/>
+    <Key android:codes="117" android:keyLabel="u"/>
+    <Key android:codes="105" android:keyLabel="i"/>
+    <Key android:codes="111" android:keyLabel="o"/>
+    <Key android:codes="112" android:keyLabel="p"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="-308"  android:keyLabel=".?123" android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%" />
+    <Key android:codes="97"  android:keyLabel="a"/>
+    <Key android:codes="115" android:keyLabel="s"/>
+    <Key android:codes="100" android:keyLabel="d"/>
+    <Key android:codes="102" android:keyLabel="f"/>
+    <Key android:codes="103" android:keyLabel="g"/>
+    <Key android:codes="104" android:keyLabel="h"/>
+    <Key android:codes="106" android:keyLabel="j"/>
+    <Key android:codes="107" android:keyLabel="k"/>
+    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+         android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:keyWidth="12.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%"/>
+    <Key android:codes="122" android:keyLabel="z"/>
+    <Key android:codes="120" android:keyLabel="x"/>
+    <Key android:codes="99" android:keyLabel="c"/>
+    <Key android:codes="118" android:keyLabel="v"/>
+    <Key android:codes="98" android:keyLabel="b"/>
+    <Key android:codes="110" android:keyLabel="n"/>
+    <Key android:codes="109" android:keyLabel="m"/>
+    <Key android:codes="44" android:keyLabel="," />
+    <Key android:codes="46" android:keyLabel="." />
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" pj:isSecondKey="true" android:isRepeatable="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom">
+    <Key android:codes="-301" android:keyIcon="@drawable/key_mode_half_alpha"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+    <Key android:codes="32" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+  </Row>
+
+</Keyboard>
+
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet_shift.xml b/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet_shift.xml
new file mode 100644
index 0000000..3d42ec8
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_half_alphabet_shift.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+         xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+         android:keyWidth="7%p"
+         android:horizontalGap="0.9%p"
+         android:verticalGap="0.9%p"
+         android:keyHeight="@dimen/key_height"
+           >
+ 
+  <Row>
+    <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%" />
+    <Key android:codes="113" android:keyLabel="Q"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+  </Row>
+ 
+  <Row>
+    <Key android:codes="-308"  android:keyLabel=".?123" android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%" />
+    <Key android:codes="97"  android:keyLabel="A"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+         android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+  </Row>
+
+  <Row>
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift_locked" android:keyWidth="12.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%" />
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="33" android:keyLabel="!" />
+    <Key android:codes="63" android:keyLabel="\?" />
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" pj:isSecondKey="true" android:isRepeatable="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom">
+    <Key android:codes="-301" android:keyIcon="@drawable/key_mode_half_alpha"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+    <Key android:codes="32" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+  </Row>
+
+</Keyboard>
+
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols.xml b/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols.xml
new file mode 100644
index 0000000..882649c
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyWidth="7%p"
+    android:horizontalGap="0.9%p"
+    android:verticalGap="0.9%p"
+    android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+        <Key android:codes="49" android:keyLabel="1"/>
+        <Key android:codes="50" android:keyLabel="2"/>
+        <Key android:codes="51" android:keyLabel="3"/>
+        <Key android:codes="52" android:keyLabel="4"/>
+        <Key android:codes="53" android:keyLabel="5"/>
+        <Key android:codes="54" android:keyLabel="6"/>
+        <Key android:codes="55" android:keyLabel="7"/>
+        <Key android:codes="56" android:keyLabel="8"/>
+        <Key android:codes="57" android:keyLabel="9"/>
+        <Key android:codes="48" android:keyLabel="0"/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p" 
+             android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-307" android:keyLabel="ABC" android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+        <Key android:codes="46" android:keyLabel="." />
+        <Key android:codes="44" android:keyLabel="," />
+        <Key android:codes="58" android:keyLabel=":"/>
+        <Key android:codes="59" android:keyLabel=";"/>
+        <Key android:codes="40" android:keyLabel="("/>
+        <Key android:codes="41" android:keyLabel=")"/>
+        <Key android:codes="165" android:keyLabel="¥"/>
+        <Key android:codes="38" android:keyLabel="&amp;"/>
+        <Key android:codes="64" android:keyLabel="\@"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+             android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:keyWidth="12.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+        <Key android:codes="43" android:keyLabel="+"/>
+        <Key android:codes="45" android:keyLabel="-"/>
+        <Key android:codes="42" android:keyLabel="*"/>
+        <Key android:codes="47" android:keyLabel="/"/>
+        <Key android:codes="65378" android:keyLabel="「"/>
+        <Key android:codes="65379" android:keyLabel="」" />
+        <Key android:codes="183" android:keyLabel="・" />
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:horizontalGap="16.9%p" pj:isSecondKey="true" android:isRepeatable="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+    </Row>
+
+    <Row android:rowEdgeFlags="bottom">
+        <Key android:codes="-304" android:keyIcon="@drawable/key_mode_half_num"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+        <Key android:codes="32" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+    </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols_shift.xml b/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols_shift.xml
new file mode 100644
index 0000000..78c8e46
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_half_symbols_shift.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyWidth="7%p"
+    android:horizontalGap="0.9%p"
+    android:verticalGap="0.9%p"
+    android:keyHeight="@dimen/key_height"
+    >
+
+    <Row>
+        <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+        <Key android:codes="91" android:keyLabel="[" />
+        <Key android:codes="93" android:keyLabel="]" />
+        <Key android:codes="123" android:keyLabel="{"/>
+        <Key android:codes="125" android:keyLabel="}"/>
+        <Key android:codes="35" android:keyLabel="\#"/>
+        <Key android:codes="37" android:keyLabel="%"/>
+        <Key android:codes="94" android:keyLabel="^"/>
+        <Key android:codes="42" android:keyLabel="*"/>
+        <Key android:codes="43" android:keyLabel="+"/>
+        <Key android:codes="61" android:keyLabel="="/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-307" android:keyLabel="ABC" android:keyWidth="10%p"  android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"  />
+        <Key android:codes="95" android:keyLabel="_" />
+        <Key android:codes="165" android:keyLabel="¥"/>
+        <Key android:codes="124" android:keyLabel="|"/>
+        <Key android:codes="126" android:keyLabel="~"/>
+        <Key android:codes="60" android:keyLabel="&lt;"/>
+        <Key android:codes="62" android:keyLabel="&gt;"/>
+        <Key android:codes="36" android:keyLabel="$"/>
+        <Key android:codes="8364" android:keyLabel="@string/key_qwerty_euro"/>
+        <Key android:codes="163" android:keyLabel="£"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+             android:keyEdgeFlags="right" android:keyWidth="17%p" pj:isSecondKey="true"/>
+    </Row>
+ 
+    <Row>
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift_locked" android:keyWidth="12.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p"  />
+        <Key android:codes="46" android:keyLabel="." />
+        <Key android:codes="44" android:keyLabel="," />
+        <Key android:codes="63" android:keyLabel="\?" />
+        <Key android:codes="33" android:keyLabel="!" />
+        <Key android:codes="39" android:keyLabel="@string/key_qwerty_full_right_single_quote" />
+        <Key android:codes="34" android:keyLabel="@string/key_qwerty_full_double_quotation_sign" />
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:horizontalGap="24.85%p" pj:isSecondKey="true" android:isRepeatable="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+    </Row>
+   
+    <Row android:rowEdgeFlags="bottom">
+        <Key android:codes="-304" android:keyIcon="@drawable/key_mode_half_num"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+        <Key android:codes="32" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+    </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/keyboard_qwerty_jp_shift.xml b/res/xml-sw768dp/keyboard_qwerty_jp_shift.xml
new file mode 100644
index 0000000..f355a4f
--- /dev/null
+++ b/res/xml-sw768dp/keyboard_qwerty_jp_shift.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+         xmlns:pj="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+         android:keyWidth="7%p"
+         android:horizontalGap="0.9%p"
+         android:verticalGap="0.9%p"
+         android:keyHeight="@dimen/key_height"
+         >
+
+  <Row>
+    <Key android:codes="-106" android:keyLabel="記号" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+    <Key android:codes="113" android:keyLabel="Q"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:keyWidth="12%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" pj:isSecondKey="true" />
+  </Row>
+
+  <Row>
+    <Key android:codes="-304" android:keyLabel=".?123"
+         android:keyWidth="10%p" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%p" />
+    <Key android:codes="97"  android:keyLabel="A"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
+    <Key android:codes="12540" android:keyLabel="ー"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_return"
+         android:keyEdgeFlags="right" android:keyWidth="9%p" pj:isSecondKey="true"/>
+  </Row>
+ 
+  <Row>
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift_locked" android:keyWidth="12.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" pj:isSecondKey="true" android:horizontalGap="0.1%"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="65281"  android:keyLabel="!"/>
+    <Key android:codes="65311"  android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" pj:isSecondKey="true" android:isRepeatable="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:keyEdgeFlags="right" pj:isSecondKey="true" android:isRepeatable="true"/>
+  </Row>
+
+  <Row android:rowEdgeFlags="bottom">
+    <Key android:codes="-307" android:keyIcon="@drawable/key_mode_hira"
+         android:keyWidth="12%p" android:horizontalGap="15%p" pj:isSecondKey="true"/>
+    <Key android:codes="12288" android:keyLabel=" " android:keyWidth="50%p" android:isRepeatable="true"/>
+  </Row>
+
+</Keyboard>
diff --git a/res/xml-sw768dp/openwnn_pref_ja.xml b/res/xml-sw768dp/openwnn_pref_ja.xml
new file mode 100644
index 0000000..729c7f2
--- /dev/null
+++ b/res/xml-sw768dp/openwnn_pref_ja.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+		  android:key="openwnn_pref_ja">
+
+  <PreferenceCategory android:title="@string/preference_key_setting_menu">
+    <CheckBoxPreference android:key="key_sound"
+                        android:title="@string/preference_key_sound_title"
+                        android:summary="@string/preference_key_sound_summary"/>
+    <CheckBoxPreference android:key="key_vibration"
+                        android:title="@string/preference_key_vibration_title"
+                        android:summary="@string/preference_key_vibration_summary"/>
+    <CheckBoxPreference android:key="auto_caps"
+                        android:title="@string/preference_auto_caps_title"
+                        android:summary="@string/preference_auto_caps_summary"
+                        android:defaultValue="true" />
+    <jp.co.omronsoft.openwnn.JAJP.KeyboardListPreferenceJAJP
+                        android:key="keyboard_skin"
+                        android:title="@string/preference_keyboard_skin_title"
+                        android:summary="@string/preference_keyboard_skin_summary"
+                        android:entries="@array/keyboard_skin"
+                        android:entryValues="@array/keyboard_skin_id"
+                        android:defaultValue="keyboard_android_default" />
+  </PreferenceCategory>
+ 
+  <PreferenceCategory android:title="@string/preference_conversion_menu_ja">
+    <CheckBoxPreference android:key="opt_enable_learning_ja"
+                        android:title="@string/preference_input_learning_title_ja"
+                        android:summary="@string/preference_input_learning_summary"
+                        android:defaultValue="true" />
+    <CheckBoxPreference android:key="opt_prediction_ja"
+                        android:title="@string/preference_prediction_title_ja"
+                        android:summary="@string/preference_prediction_summary"
+                        android:defaultValue="true" />
+  </PreferenceCategory>
+
+  <PreferenceCategory android:title="@string/preference_conversion_menu_en">
+    <CheckBoxPreference android:key="opt_enable_learning_en"
+                        android:title="@string/preference_input_learning_title_en"
+                        android:summary="@string/preference_input_learning_summary"
+                        android:defaultValue="true" />
+    <CheckBoxPreference android:key="opt_prediction_en"
+                        android:title="@string/preference_prediction_title_en"
+                        android:summary="@string/preference_prediction_summary"
+                        android:defaultValue="false" />
+  </PreferenceCategory>
+ 
+  <PreferenceCategory android:title="@string/preference_dictionary_menu">
+    <PreferenceScreen android:key="user_dictionary_edit_words"
+                      android:title="@string/preference_dictionary_menu_ja"
+                      android:summary="@string/preference_user_dictionary_edit_words_summary_ja"
+                      android:persistent="false">
+         <intent android:action="android.intent.action.MAIN"
+            android:targetPackage="jp.co.omronsoft.openwnn"
+            android:targetClass="jp.co.omronsoft.openwnn.JAJP.UserDictionaryToolsListJAJP" />
+    </PreferenceScreen>
+ 
+    <PreferenceScreen android:key="user_dictionary_edit_words"
+                      android:title="@string/preference_dictionary_menu_en"
+                      android:summary="@string/preference_user_dictionary_edit_words_summary_en"
+                      android:persistent="false">
+         <intent android:action="android.intent.action.MAIN"
+            android:targetPackage="jp.co.omronsoft.openwnn"
+            android:targetClass="jp.co.omronsoft.openwnn.EN.UserDictionaryToolsListEN" />
+    </PreferenceScreen>
+
+    <jp.co.omronsoft.openwnn.JAJP.ClearLearnDictionaryDialogPreferenceJAJP
+                      android:key="clear_learn_dictionary"
+                      android:title="@string/preference_user_dictionary_clear_learning_title"
+                      android:summary="@string/preference_user_dictionary_clear_learning_summary"
+       android:dialogMessage="@string/dialog_clear_learning_dictionary_message"
+                      android:positiveButtonText="@string/dialog_button_ok"
+                      android:negativeButtonText="@string/dialog_button_cancel"/>
+ 
+  </PreferenceCategory>
+  
+  <PreferenceCategory android:title="@string/preference_aboutime_menu">
+    <Preference android:key="openwnn_version"
+			style="?android:preferenceInformationStyle"
+			android:title="@string/openwnn_japanese"
+			android:summary="@string/openwnn_japanese_copyright" />
+  </PreferenceCategory>
+
+</PreferenceScreen>
+
diff --git a/res/xml/debug_tool_engine.xml b/res/xml/debug_tool_engine.xml
new file mode 100644
index 0000000..993b83b
--- /dev/null
+++ b/res/xml/debug_tool_engine.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<OpenWnnEngine>
+	<!-- key testName is Unique -->
+
+	<!-- OpenWnnEngineEN -->
+	<!-- For int predict(ComposingText text, int minLen, int maxLen) -->
+	<!-- param = "target<null or empty or text or comma>,minLen,maxLen,text" -->
+	<key testName = "TestCase01_predict" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "predict" param = "null,0,-1," intRet = "0" isRet = "" strRet = ""/>
+
+	<key testName = "TestCase02_predict" targetClassName = "OpenWnnEngineEN"
+		 targetMethod = "predict" param = "empty,0,-1," intRet = "0" isRet ="" strRet = ""/>
+
+	<key testName = "TestCase03_predict" targetClassName = "OpenWnnEngineEN"
+		 targetMethod = "predict" param = "text,10,5,testCase03" intRet = "1" isRet ="" strRet = ""/>
+
+	<key testName = "TestCase04_predict" targetClassName = "OpenWnnEngineEN"
+		 targetMethod = "predict" param = "comma,10,5," intRet = "1" isRet ="" strRet = ""/>
+
+	<!-- For convert() -->
+	<key testName = "TestCase01_convert" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "convert" param = "convertTest" intRet = "0" isRet = "" strRet = ""/>
+
+	<!-- For searchDictionary() -->
+
+	<key testName = "TestCase01_searchDictionary" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "searchDictionary" param = "convertTest" intRet = "0" isRet = "" strRet = ""/>
+
+	<!-- For getNextCandidate() -->
+	<!-- WnnWord getNextCandidate() -->
+	<!-- before predict() call -->
+	<key testName = "TestCase01_getNextCandidate" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "getNextCandidate" param = "getNextCondi" intRet = "" isRet = "" strRet = "getNextCondi"/>
+
+	<!-- predict() not call. -->
+	<key testName = "TestCase02_getNextCandidate" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "getNextCandidate" param = "" intRet = "" isRet = "" strRet = ""/>
+
+	<!-- For learn() -->
+	<!-- boolean learn(WnnWord word) WnnWord(String candidate, String stroke, int frequency) -->
+	<!-- param = "candidate,stroke,frequency" -->
+	<key testName = "TestCase01_learn" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "learn" param = "learn,learn,0" intRet = "" isRet = "true" strRet = ""/>
+
+	<key testName = "TestCase02_learn" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "learn" param = "nolearn,nolearn,0" intRet = "" isRet = "true" strRet = ""/>
+
+	<!-- For addWord() -->
+	<!-- int addWord(WnnWord word) WnnWord(String candidate, String stroke, int frequency) -->
+	<!-- param = "candidate,stroke,frequency"-->
+	<key testName = "TestCase01_addWord" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "addWord" param = "addWordText,addWordText,0" intRet = "0" isRet = "" strRet = ""/>
+
+	<!-- For deleteWord() -->
+	<!-- boolean deleteWord(WnnWord word) WnnWord(String candidate, String stroke, int frequency) -->
+	<!-- param = "candidate,stroke,frequency"-->
+	<key testName = "TestCase01_deleteWord" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "deleteWord" param = "deleteWord,deleteWord,0" intRet = "" isRet = "false" strRet = ""/>
+
+	<!-- void setPreferences(SharedPreferences pref) -->
+	<key testName = "TestCase01_setPreferences" targetClassName = "OpenWnnEngineEN"
+	     targetMethod = "setPreferences" param = "" intRet = "" isRet = "" strRet = ""/>
+
+
+	<!-- OpenWnnEngineJAJP -->
+	<!-- For int predict(ComposingText text, int minLen, int maxLen) -->
+	<!-- param = "target<null or empty or text or comma>,minLen,maxLen,text" -->
+	<key testName = "TestCase01_predict" targetClassName = "OpenWnnEngineJAJP"
+	     targetMethod = "predict" param = "null,0,-1," intRet = "0" isRet = "" strRet = ""/>
+</OpenWnnEngine>
diff --git a/res/xml/debug_tool_onevent.xml b/res/xml/debug_tool_onevent.xml
new file mode 100644
index 0000000..a28bd87
--- /dev/null
+++ b/res/xml/debug_tool_onevent.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<OpenWnn_Test>
+<!-- OpenWnn onEvent() Test -->
+<!-- OpenWnnEN_Test -->
+
+<!-- (Qwerty KeyBoard Shift On) -->
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase001_onEvent()_Q" displayValue = "Q" keyValue = "Q" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase002_onEvent()_W" displayValue = "W" keyValue = "W" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase003_onEvent()_E" displayValue = "E" keyValue = "E" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase004_onEvent()_R" displayValue = "R" keyValue = "R" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase005_onEvent()_T" displayValue = "T" keyValue = "T" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase006_onEvent()_Y" displayValue = "Y" keyValue = "Y" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase007_onEvent()_U" displayValue = "U" keyValue = "U" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase008_onEvent()_I" displayValue = "I" keyValue = "I" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase009_onEvent()_O" displayValue = "O" keyValue = "O" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase010_onEvent()_P" displayValue = "P" keyValue = "P" keyCode= ""/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase011_onEvent()_A" displayValue = "A" keyValue = "A" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase012_onEvent()_S" displayValue = "S" keyValue = "S" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase013_onEvent()_D" displayValue = "D" keyValue = "D" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase014_onEvent()_F" displayValue = "F" keyValue = "F" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase015_onEvent()_G" displayValue = "G" keyValue = "G" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase016_onEvent()_H" displayValue = "H" keyValue = "H" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase017_onEvent()_J" displayValue = "J" keyValue = "J" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase018_onEvent()_K" displayValue = "K" keyValue = "K" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase019_onEvent()_L" displayValue = "L" keyValue = "L" keyCode= ""/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase020_onEvent()_Shift" displayValue = "" keyValue = "" keyCode= "59"/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase021_onEvent()_Z" displayValue = "Z" keyValue = "Z" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase022_onEvent()_X" displayValue = "X" keyValue = "X" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase023_onEvent()_C" displayValue = "C" keyValue = "C" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase024_onEvent()_V" displayValue = "V" keyValue = "V" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase025_onEvent()_B" displayValue = "B" keyValue = "B" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase026_onEvent()_N" displayValue = "N" keyValue = "N" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase027_onEvent()_M" displayValue = "M" keyValue = "M" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase028_onEvent()_DEL" displayValue = "" keyValue = "" keyCode= "67"/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase029_onEvent()_切替" displayValue = "" keyValue = "" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase030_onEvent()_SYM" displayValue = "" keyValue = "" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase031_onEvent()_," displayValue = "," keyValue = "," keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase032_onEvent()_スペース" displayValue = " " keyValue = " " keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase033_onEvent()_." displayValue = "." keyValue = "." keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase034_onEvent()_?" displayValue = "\?" keyValue = "\?" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase035_onEvent()_改行" displayValue = "" keyValue = "" keyCode= "66"/>
+
+<!-- (Qwerty KeyBoard Shift Off) -->
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase036_onEvent()_q" displayValue = "q" keyValue = "q" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase037_onEvent()_w" displayValue = "w" keyValue = "w" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase038_onEvent()_e" displayValue = "e" keyValue = "e" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase039_onEvent()_r" displayValue = "r" keyValue = "r" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase040_onEvent()_t" displayValue = "t" keyValue = "t" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase041_onEvent()_y" displayValue = "y" keyValue = "y" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase042_onEvent()_u" displayValue = "u" keyValue = "u" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase043_onEvent()_I" displayValue = "I" keyValue = "I" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase044_onEvent()_o" displayValue = "o" keyValue = "o" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase045_onEvent()_p" displayValue = "p" keyValue = "p" keyCode= ""/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase046_onEvent()_a" displayValue = "a" keyValue = "a" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase047_onEvent()_s" displayValue = "s" keyValue = "s" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase048_onEvent()_d" displayValue = "d" keyValue = "d" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase049_onEvent()_f" displayValue = "f" keyValue = "f" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase050_onEvent()_g" displayValue = "g" keyValue = "g" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase051_onEvent()_h" displayValue = "h" keyValue = "h" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase052_onEvent()_j" displayValue = "j" keyValue = "j" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase053_onEvent()_k" displayValue = "k" keyValue = "k" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase054_onEvent()_l" displayValue = "l" keyValue = "l" keyCode= ""/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase055_onEvent()_Shift" displayValue = "" keyValue = "" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase056_onEvent()_z" displayValue = "z" keyValue = "z" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase057_onEvent()_x" displayValue = "x" keyValue = "x" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase058_onEvent()_c" displayValue = "c" keyValue = "c" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase059_onEvent()_v" displayValue = "v" keyValue = "v" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase060_onEvent()_b" displayValue = "b" keyValue = "b" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase061_onEvent()_n" displayValue = "n" keyValue = "n" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase062_onEvent()_m" displayValue = "m" keyValue = "m" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase063_onEvent()_DEL" displayValue = "" keyValue = "" keyCode= "67"/>
+
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase064_onEvent()_切替" displayValue = "" keyValue = "" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase065_onEvent()_SYM" displayValue = "" keyValue = "" keyCode= "63"/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase066_onEvent()_," displayValue = "," keyValue = "," keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase067_onEvent()_スペース" displayValue = "" keyValue = "" keyCode= "62"/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase068_onEvent()_." displayValue = "." keyValue = "." keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase069_onEvent()_?" displayValue = "\?" keyValue = "\?" keyCode= ""/>
+<key targetTest = "OpenWnnEN_Test"  testName = "EN_TestCase070_onEvent()_改行" displayValue = "" keyValue = "" keyCode= "66"/>
+
+<!-- OpenWnnJAJP_Test -->
+<key targetTest = "OpenWnnJAJP_Test"  testName = "JP_TestCase01_onEvent()_q"
+    displayValue = "q" keyValue = "q" keyCode= ""/>
+
+<key targetTest = "OpenWnnJAJP_Test"  testName = "JP_TestCase02_onEvent()_w"
+    displayValue = "w" keyValue = "w" keyCode= ""/>
+
+<key targetTest = "OpenWnnJAJP_Test"  testName = "JP_TestCase03_onEvent()_e"
+    displayValue = "e" keyValue = "e" keyCode= ""/>
+
+<!-- For OpenWnnEvent.INPUT_SOFT_KEY -->
+<key targetTest = "OpenWnnJAJP_Test"  testName = "JP_TestCaseXX_onEvent()_1"
+    displayValue = "1" keyValue = "" keyCode= "8"/>
+
+<!-- OpenWnnZHCN_Test -->
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase001_onEvent()_Q" displayValue = "Q" keyValue = "Q" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase002_onEvent()_W" displayValue = "W" keyValue = "W" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase003_onEvent()_E" displayValue = "E" keyValue = "E" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase004_onEvent()_R" displayValue = "R" keyValue = "R" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase005_onEvent()_T" displayValue = "T" keyValue = "T" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase006_onEvent()_Y" displayValue = "Y" keyValue = "Y" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase007_onEvent()_U" displayValue = "U" keyValue = "U" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase008_onEvent()_I" displayValue = "I" keyValue = "I" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase009_onEvent()_O" displayValue = "O" keyValue = "O" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase010_onEvent()_P" displayValue = "P" keyValue = "P" keyCode= ""/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase011_onEvent()_A" displayValue = "A" keyValue = "A" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase012_onEvent()_S" displayValue = "S" keyValue = "S" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase013_onEvent()_D" displayValue = "D" keyValue = "D" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase014_onEvent()_F" displayValue = "F" keyValue = "F" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase015_onEvent()_G" displayValue = "G" keyValue = "G" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase016_onEvent()_H" displayValue = "H" keyValue = "H" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase017_onEvent()_J" displayValue = "J" keyValue = "J" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase018_onEvent()_K" displayValue = "K" keyValue = "K" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase019_onEvent()_L" displayValue = "L" keyValue = "L" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase020_onEvent()_Shift" displayValue = "" keyValue = "" keyCode= "59"/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase021_onEvent()_Z" displayValue = "Z" keyValue = "Z" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase022_onEvent()_X" displayValue = "X" keyValue = "X" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase023_onEvent()_C" displayValue = "C" keyValue = "C" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase024_onEvent()_V" displayValue = "V" keyValue = "V" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase025_onEvent()_B" displayValue = "B" keyValue = "B" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase026_onEvent()_N" displayValue = "N" keyValue = "N" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase027_onEvent()_M" displayValue = "M" keyValue = "M" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase028_onEvent()_DEL" displayValue = "" keyValue = "" keyCode= "67"/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase029_onEvent()_ALT" displayValue = "" keyValue = "" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase030_onEvent()_SYM" displayValue = "" keyValue = "" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase031_onEvent()_," displayValue = "," keyValue = "," keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase032_onEvent()_SPACE" displayValue = "" keyValue = "" keyCode= "62"/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase033_onEvent()_." displayValue = "." keyValue = "." keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase034_onEvent()_!" displayValue = "!" keyValue = "!" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase035_onEvent()_RETURN" displayValue = "" keyValue = "" keyCode= "66"/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase036_onEvent()_q" displayValue = "q" keyValue = "q" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase037_onEvent()_w" displayValue = "w" keyValue = "w" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase038_onEvent()_e" displayValue = "e" keyValue = "e" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase039_onEvent()_r" displayValue = "r" keyValue = "r" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase040_onEvent()_t" displayValue = "t" keyValue = "t" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase041_onEvent()_y" displayValue = "y" keyValue = "y" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase042_onEvent()_u" displayValue = "u" keyValue = "u" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase043_onEvent()_i" displayValue = "i" keyValue = "i" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase044_onEvent()_o" displayValue = "o" keyValue = "o" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase045_onEvent()_p" displayValue = "p" keyValue = "p" keyCode= ""/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase046_onEvent()_a" displayValue = "a" keyValue = "a" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase047_onEvent()_s" displayValue = "s" keyValue = "s" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase048_onEvent()_d" displayValue = "d" keyValue = "d" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase049_onEvent()_f" displayValue = "f" keyValue = "f" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase050_onEvent()_g" displayValue = "g" keyValue = "g" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase051_onEvent()_h" displayValue = "h" keyValue = "h" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase052_onEvent()_j" displayValue = "j" keyValue = "j" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase053_onEvent()_k" displayValue = "k" keyValue = "k" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase054_onEvent()_l" displayValue = "l" keyValue = "l" keyCode= ""/>
+ 
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase055_onEvent()_Shift" displayValue = "" keyValue = "" keyCode= "59"/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase056_onEvent()_z" displayValue = "z" keyValue = "z" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase057_onEvent()_x" displayValue = "x" keyValue = "x" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase058_onEvent()_c" displayValue = "c" keyValue = "c" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase059_onEvent()_v" displayValue = "v" keyValue = "v" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase060_onEvent()_b" displayValue = "b" keyValue = "b" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase061_onEvent()_n" displayValue = "n" keyValue = "n" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase062_onEvent()_m" displayValue = "m" keyValue = "m" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase063_onEvent()_DEL" displayValue = "" keyValue = "" keyCode= "67"/>
+
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase064_onEvent()_ALT" displayValue = "" keyValue = "" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase065_onEvent()_SYM" displayValue = "" keyValue = "" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase066_onEvent()_," displayValue = "," keyValue = "," keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase067_onEvent()_SPACE" displayValue = "" keyValue = "" keyCode= "62"/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase068_onEvent()_." displayValue = "." keyValue = "." keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase069_onEvent()_\?" displayValue = "\?" keyValue = "\?" keyCode= ""/>
+    <key targetTest = "OpenWnnZHCN_Test"  testName = "ZHCN_TestCase070_onEvent()_RETURN" displayValue = "" keyValue = "" keyCode= "66"/>
+</OpenWnn_Test>
diff --git a/res/xml/default_en_qwerty.xml b/res/xml/default_en_qwerty.xml
index 35068ee..ac085e5 100644
--- a/res/xml/default_en_qwerty.xml
+++ b/res/xml/default_en_qwerty.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -60,7 +60,7 @@
     <Key android:codes="110" android:keyLabel="n"/>
     <Key android:codes="109" android:keyLabel="m"/>
     <Key android:codes="-100"
-	 android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b"
+	 android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
 	 android:keyWidth="15%p" android:keyEdgeFlags="right" android:isRepeatable="true"/>
   </Row>
   
@@ -76,7 +76,7 @@
     <Key android:codes="46" android:keyLabel="."  android:keyWidth="10%p"/>
     <Key android:codes="63" android:keyLabel="\?" android:keyWidth="10%p"/>
     <Key android:codes="-101"
-	 android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
+	 android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
          android:keyWidth="15%p" android:keyEdgeFlags="right"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/default_en_switch_key.xml b/res/xml/default_en_switch_key.xml
index 319546b..968118b 100644
--- a/res/xml/default_en_switch_key.xml
+++ b/res/xml/default_en_switch_key.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/default_en_symbols.xml b/res/xml/default_en_symbols.xml
index 16d5fe1..ca03916 100644
--- a/res/xml/default_en_symbols.xml
+++ b/res/xml/default_en_symbols.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -60,7 +60,7 @@
     <Key android:codes="47" android:keyLabel="/" />
     <Key android:codes="33" android:keyLabel="!" />
     <Key android:codes="-100"
-	 android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b"
+	 android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
 	 android:keyWidth="15%p" android:keyEdgeFlags="right" android:isRepeatable="true"/>
   </Row>
   
@@ -76,7 +76,7 @@
     <Key android:codes="46" android:keyLabel="."  android:keyWidth="10%p"/>
     <Key android:codes="63" android:keyLabel="\?" android:keyWidth="10%p"/>
     <Key android:codes="-101"
-	 android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
+	 android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
          android:keyWidth="15%p" android:keyEdgeFlags="right"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/default_en_symbols_shift.xml b/res/xml/default_en_symbols_shift.xml
index c2eb67b..dc723a5 100644
--- a/res/xml/default_en_symbols_shift.xml
+++ b/res/xml/default_en_symbols_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -60,7 +60,7 @@
     <Key android:codes="92" android:keyLabel="\\" />
     <Key android:codes="124" android:keyLabel="|"/>
     <Key android:codes="-100"
-	 android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b"
+	 android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
 	 android:keyWidth="15%p" android:keyEdgeFlags="right" android:isRepeatable="true"/>
   </Row>
   
@@ -76,7 +76,7 @@
     <Key android:codes="46" android:keyLabel="."  android:keyWidth="10%p"/>
     <Key android:codes="63" android:keyLabel="\?" android:keyWidth="10%p"/>
     <Key android:codes="-101"
-	 android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
+	 android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
          android:keyWidth="15%p" android:keyEdgeFlags="right"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_full_alphabet.xml b/res/xml/keyboard_12key_full_alphabet.xml
index 4637af2..30b8254 100644
--- a/res/xml/keyboard_12key_full_alphabet.xml
+++ b/res/xml/keyboard_12key_full_alphabet.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
 
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_alpha1" android:iconPreview="@drawable/key_12key_alpha1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_alpha2" android:iconPreview="@drawable/key_12key_alpha2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_alpha3" android:iconPreview="@drawable/key_12key_alpha3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_alpha4" android:iconPreview="@drawable/key_12key_alpha4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_alpha5" android:iconPreview="@drawable/key_12key_alpha5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_alpha6" android:iconPreview="@drawable/key_12key_alpha6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_alpha7" android:iconPreview="@drawable/key_12key_alpha7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_alpha8" android:iconPreview="@drawable/key_12key_alpha8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_alpha9" android:iconPreview="@drawable/key_12key_alpha9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_caps" android:iconPreview="@drawable/key_12key_caps_b" android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_alpha0" android:iconPreview="@drawable/key_12key_alpha0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_period_comma" android:iconPreview="@drawable/key_12key_period_comma_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_full_alphabet_input.xml b/res/xml/keyboard_12key_full_alphabet_input.xml
index d34007d..7dafc86 100644
--- a/res/xml/keyboard_12key_full_alphabet_input.xml
+++ b/res/xml/keyboard_12key_full_alphabet_input.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_alpha1" android:iconPreview="@drawable/key_12key_alpha1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_alpha2" android:iconPreview="@drawable/key_12key_alpha2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_alpha3" android:iconPreview="@drawable/key_12key_alpha3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_alpha4" android:iconPreview="@drawable/key_12key_alpha4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_alpha5" android:iconPreview="@drawable/key_12key_alpha5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_alpha6" android:iconPreview="@drawable/key_12key_alpha6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_alpha7" android:iconPreview="@drawable/key_12key_alpha7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_alpha8" android:iconPreview="@drawable/key_12key_alpha8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_alpha9" android:iconPreview="@drawable/key_12key_alpha9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_caps" android:iconPreview="@drawable/key_12key_caps_b" android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_alpha0" android:iconPreview="@drawable/key_12key_alpha0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_period_comma" android:iconPreview="@drawable/key_12key_period_comma_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_full_katakana.xml b/res/xml/keyboard_12key_full_katakana.xml
index aefc90f..ae7a73a 100644
--- a/res/xml/keyboard_12key_full_katakana.xml
+++ b/res/xml/keyboard_12key_full_katakana.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="@string/key_12key_katakana_1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="@string/key_12key_katakana_2"/>
         <Key android:codes="-203" android:keyLabel="@string/key_12key_katakana_3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="@string/key_12key_katakana_4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="@string/key_12key_katakana_5"/>
         <Key android:codes="-206" android:keyLabel="@string/key_12key_katakana_6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="@string/key_12key_katakana_7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="@string/key_12key_katakana_8"/>
         <Key android:codes="-209" android:keyLabel="@string/key_12key_katakana_9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="@string/key_12key_katakana_0" />
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_full_katakana_input.xml b/res/xml/keyboard_12key_full_katakana_input.xml
index f17bc81..369e3d0 100644
--- a/res/xml/keyboard_12key_full_katakana_input.xml
+++ b/res/xml/keyboard_12key_full_katakana_input.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
    <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="@string/key_12key_katakana_1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="@string/key_12key_katakana_2"/>
         <Key android:codes="-203" android:keyLabel="@string/key_12key_katakana_3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="@string/key_12key_katakana_4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="@string/key_12key_katakana_5"/>
         <Key android:codes="-206" android:keyLabel="@string/key_12key_katakana_6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="@string/key_12key_katakana_7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="@string/key_12key_katakana_8"/>
         <Key android:codes="-209" android:keyLabel="@string/key_12key_katakana_9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
      
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="@string/key_12key_katakana_0" />
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_full_num.xml b/res/xml/keyboard_12key_full_num.xml
index c17d031..c92ecb9 100644
--- a/res/xml/keyboard_12key_full_num.xml
+++ b/res/xml/keyboard_12key_full_num.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="2"/>
         <Key android:codes="-203" android:keyLabel="3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="5"/>
         <Key android:codes="-206" android:keyLabel="6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="8"/>
         <Key android:codes="-209" android:keyLabel="9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyLabel="*"  android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="0" />
         <Key android:codes="-211" android:keyLabel="#" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter" android:iconPreview="@drawable/key_12key_enter_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_half_alphabet.xml b/res/xml/keyboard_12key_half_alphabet.xml
index 2588c46..4b9ed76 100644
--- a/res/xml/keyboard_12key_half_alphabet.xml
+++ b/res/xml/keyboard_12key_half_alphabet.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
 
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_alpha1" android:iconPreview="@drawable/key_12key_alpha1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_alpha2" android:iconPreview="@drawable/key_12key_alpha2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_alpha3" android:iconPreview="@drawable/key_12key_alpha3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_alpha4" android:iconPreview="@drawable/key_12key_alpha4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_alpha5" android:iconPreview="@drawable/key_12key_alpha5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_alpha6" android:iconPreview="@drawable/key_12key_alpha6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_alpha7" android:iconPreview="@drawable/key_12key_alpha7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_alpha8" android:iconPreview="@drawable/key_12key_alpha8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_alpha9" android:iconPreview="@drawable/key_12key_alpha9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_caps" android:iconPreview="@drawable/key_12key_caps_b" android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_alpha0" android:iconPreview="@drawable/key_12key_alpha0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_period_comma" android:iconPreview="@drawable/key_12key_period_comma_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_half_alphabet_input.xml b/res/xml/keyboard_12key_half_alphabet_input.xml
index a7c6549..9b96f10 100644
--- a/res/xml/keyboard_12key_half_alphabet_input.xml
+++ b/res/xml/keyboard_12key_half_alphabet_input.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_alpha1" android:iconPreview="@drawable/key_12key_alpha1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_alpha2" android:iconPreview="@drawable/key_12key_alpha2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_alpha3" android:iconPreview="@drawable/key_12key_alpha3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_alpha4" android:iconPreview="@drawable/key_12key_alpha4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_alpha5" android:iconPreview="@drawable/key_12key_alpha5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_alpha6" android:iconPreview="@drawable/key_12key_alpha6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_alpha7" android:iconPreview="@drawable/key_12key_alpha7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_alpha8" android:iconPreview="@drawable/key_12key_alpha8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_alpha9" android:iconPreview="@drawable/key_12key_alpha9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_caps" android:iconPreview="@drawable/key_12key_caps_b" android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_alpha0" android:iconPreview="@drawable/key_12key_alpha0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_period_comma" android:iconPreview="@drawable/key_12key_period_comma_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_half_katakana.xml b/res/xml/keyboard_12key_half_katakana.xml
index 6d52364..a63224c 100644
--- a/res/xml/keyboard_12key_half_katakana.xml
+++ b/res/xml/keyboard_12key_half_katakana.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="@string/key_12key_katakana_1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="@string/key_12key_katakana_2"/>
         <Key android:codes="-203" android:keyLabel="@string/key_12key_katakana_3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="@string/key_12key_katakana_4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="@string/key_12key_katakana_5"/>
         <Key android:codes="-206" android:keyLabel="@string/key_12key_katakana_6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222"  android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="@string/key_12key_katakana_7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="@string/key_12key_katakana_8"/>
         <Key android:codes="-209" android:keyLabel="@string/key_12key_katakana_9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="@string/key_12key_katakana_0" />
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_half_katakana_input.xml b/res/xml/keyboard_12key_half_katakana_input.xml
index 19cd68f..dfeefdf 100644
--- a/res/xml/keyboard_12key_half_katakana_input.xml
+++ b/res/xml/keyboard_12key_half_katakana_input.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
    <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="@string/key_12key_katakana_1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="@string/key_12key_katakana_2"/>
         <Key android:codes="-203" android:keyLabel="@string/key_12key_katakana_3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="@string/key_12key_katakana_4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="@string/key_12key_katakana_5"/>
         <Key android:codes="-206" android:keyLabel="@string/key_12key_katakana_6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="@string/key_12key_katakana_7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="@string/key_12key_katakana_8"/>
         <Key android:codes="-209" android:keyLabel="@string/key_12key_katakana_9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
      
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="@string/key_12key_katakana_0" />
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_half_num.xml b/res/xml/keyboard_12key_half_num.xml
index 49a6562..9d9cc52 100644
--- a/res/xml/keyboard_12key_half_num.xml
+++ b/res/xml/keyboard_12key_half_num.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyLabel="1" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyLabel="2"/>
         <Key android:codes="-203" android:keyLabel="3"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyLabel="4" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyLabel="5"/>
         <Key android:codes="-206" android:keyLabel="6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyLabel="7" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyLabel="8"/>
         <Key android:codes="-209" android:keyLabel="9"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_jp" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyLabel="*"  android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyLabel="0" />
         <Key android:codes="-211" android:keyLabel="#" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter" android:iconPreview="@drawable/key_12key_enter_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12key_phone.xml b/res/xml/keyboard_12key_phone.xml
index 7637058..704d6cd 100644
--- a/res/xml/keyboard_12key_phone.xml
+++ b/res/xml/keyboard_12key_phone.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -22,39 +23,38 @@
     >
   
     <Row>
-        <Key android:codes="-310" android:keyLabel=""
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="32" android:keyIcon="@drawable/key_12key_space" android:iconPreview="@drawable/key_12key_space_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="49" android:keyLabel="1" android:horizontalGap="2%"/>
         <Key android:codes="50" android:keyLabel="2"/>
         <Key android:codes="51" android:keyLabel="3"/>
         <Key android:codes="-214"
-	     android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+	     android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="52" android:keyLabel="4" android:horizontalGap="2%"/>
         <Key android:codes="53" android:keyLabel="5"/>
         <Key android:codes="54" android:keyLabel="6"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="45" android:keyLabel="-" android:keyWidth="18%"/>
+        <Key android:codes="45" android:keyLabel="-" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="55" android:keyLabel="7" android:horizontalGap="2%"/>
         <Key android:codes="56" android:keyLabel="8"/>
         <Key android:codes="57" android:keyLabel="9"/>
-        <Key android:codes="43" android:keyLabel="+" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="43" android:keyLabel="+" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-310" android:keyLabel="" android:keyEdgeFlags="left"  android:keyWidth="18%"/>
+        <Key android:codes="44" android:keyLabel="Pause" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="42" android:keyLabel="*"  android:horizontalGap="2%"/>
         <Key android:codes="48" android:keyLabel="0" />
         <Key android:codes="35" android:keyLabel="#" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter"
-             android:iconPreview="@drawable/key_12key_enter_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter"
+             android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12keyjp.xml b/res/xml/keyboard_12keyjp.xml
index b96fc4f..675d9ea 100644
--- a/res/xml/keyboard_12keyjp.xml
+++ b/res/xml/keyboard_12keyjp.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,39 +24,39 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_hiragana1" android:iconPreview="@drawable/key_12key_hiragana1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_hiragana2" android:iconPreview="@drawable/key_12key_hiragana2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_hiragana3" android:iconPreview="@drawable/key_12key_hiragana3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_hiragana4" android:iconPreview="@drawable/key_12key_hiragana4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_hiragana5" android:iconPreview="@drawable/key_12key_hiragana5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_hiragana6" android:iconPreview="@drawable/key_12key_hiragana6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_12key_pict_sym_b"
-	     android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-222" android:keyIcon="@drawable/key_12key_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+	     android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_hiragana7" android:iconPreview="@drawable/key_12key_hiragana7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_hiragana8" android:iconPreview="@drawable/key_12key_hiragana8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_hiragana9" android:iconPreview="@drawable/key_12key_hiragana9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space_jp" android:iconPreview="@drawable/key_12key_space_jp_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space_jp" android:iconPreview="@drawable/key_12key_space_jp_b" android:isRepeatable="true" android:keyEdgeFlags="right"  android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
              android:popupKeyboard="@xml/keyboard_switch_key_jp"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_hiragana0" android:iconPreview="@drawable/key_12key_hiragana0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b" 
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_12keyjp_input.xml b/res/xml/keyboard_12keyjp_input.xml
index fa86cd5..c965d90 100644
--- a/res/xml/keyboard_12keyjp_input.xml
+++ b/res/xml/keyboard_12keyjp_input.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
     android:keyWidth="20%p"
     android:horizontalGap="0dip"
     android:verticalGap="0dip"
@@ -23,38 +24,38 @@
   
     <Row>
         <Key android:codes="-219" android:keyIcon="@drawable/key_12key_reverse" android:iconPreview="@drawable/key_12key_reverse_b"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-201" android:keyIcon="@drawable/key_12key_hiragana1" android:iconPreview="@drawable/key_12key_hiragana1_b" android:horizontalGap="2%"/>
         <Key android:codes="-202" android:keyIcon="@drawable/key_12key_hiragana2" android:iconPreview="@drawable/key_12key_hiragana2_b"/>
         <Key android:codes="-203" android:keyIcon="@drawable/key_12key_hiragana3" android:iconPreview="@drawable/key_12key_hiragana3_b"/>
-        <Key android:codes="-214" android:keyIcon="@drawable/key_12key_del" android:iconPreview="@drawable/key_12key_del_b"
-             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-214" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_12key_left" android:iconPreview="@drawable/key_12key_left_b" android:isRepeatable="true" android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-204" android:keyIcon="@drawable/key_12key_hiragana4" android:iconPreview="@drawable/key_12key_hiragana4_b" android:horizontalGap="2%"/>
         <Key android:codes="-205" android:keyIcon="@drawable/key_12key_hiragana5" android:iconPreview="@drawable/key_12key_hiragana5_b"/>
         <Key android:codes="-206" android:keyIcon="@drawable/key_12key_hiragana6" android:iconPreview="@drawable/key_12key_hiragana6_b"/>
-        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_12key_right" android:iconPreview="@drawable/key_12key_right_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row>
-        <Key android:codes="-305" android:keyIcon="@drawable/key_12key_eisukana" android:iconPreview="@drawable/key_12key_eisukana_b" android:keyWidth="18%"/>
+        <Key android:codes="-305" android:keyIcon="@drawable/key_12key_eisukana" android:iconPreview="@drawable/key_12key_eisukana_b" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-207" android:keyIcon="@drawable/key_12key_hiragana7" android:iconPreview="@drawable/key_12key_hiragana7_b" android:horizontalGap="2%"/>
         <Key android:codes="-208" android:keyIcon="@drawable/key_12key_hiragana8" android:iconPreview="@drawable/key_12key_hiragana8_b"/>
         <Key android:codes="-209" android:keyIcon="@drawable/key_12key_hiragana9" android:iconPreview="@drawable/key_12key_hiragana9_b"/>
-        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space_jp" android:iconPreview="@drawable/key_12key_space_jp_b" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-215" android:keyIcon="@drawable/key_12key_space_jp" android:iconPreview="@drawable/key_12key_space_jp_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
     
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_12key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
              android:popupKeyboard="@xml/keyboard_switch_key_jp"
-             android:keyEdgeFlags="left" android:keyWidth="18%"/>
+             android:keyEdgeFlags="left" android:keyWidth="18%" wnn:isSecondKey="true"/>
         <Key android:codes="-213" android:keyIcon="@drawable/key_12key_dakuten" android:iconPreview="@drawable/key_12key_dakuten_b"   android:horizontalGap="2%"/>
         <Key android:codes="-210" android:keyIcon="@drawable/key_12key_hiragana0" android:iconPreview="@drawable/key_12key_hiragana0_b"/>
         <Key android:codes="-211" android:keyIcon="@drawable/key_12key_ten" android:iconPreview="@drawable/key_12key_ten_b" />
-        <Key android:codes="-216" android:keyIcon="@drawable/key_12key_enter_jp" android:iconPreview="@drawable/key_12key_enter_jp_b" 
-             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%"/>
+        <Key android:codes="-216" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyEdgeFlags="right" android:horizontalGap="2%" android:keyWidth="18%" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_4key.xml b/res/xml/keyboard_4key.xml
new file mode 100644
index 0000000..9061302
--- /dev/null
+++ b/res/xml/keyboard_4key.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+    android:keyHeight="@dimen/key_height_4key"
+    >
+
+    <Row>
+        <Key android:codes="-300" android:keyLabel="@string/key_symbol_mode" android:keyEdgeFlags="left" android:keyWidth="25%p" wnn:isSecondKey="true"/>
+        <Key android:codes="-301" android:keyWidth="25%p" android:keyLabel="\u25b2" wnn:isSecondKey="true" />
+        <Key android:codes="-302" android:keyWidth="25%p" android:keyLabel="\u25bc" wnn:isSecondKey="true" />
+        <Key android:codes="-303" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b" android:isRepeatable="true" android:keyEdgeFlags="right" android:keyWidth="25%p" wnn:isSecondKey="true" />
+    </Row>
+</Keyboard>
+
diff --git a/res/xml/keyboard_qwerty_jp.xml b/res/xml/keyboard_qwerty_jp.xml
index ca87e72..1a5c956 100644
--- a/res/xml/keyboard_qwerty_jp.xml
+++ b/res/xml/keyboard_qwerty_jp.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+	  android:keyWidth="9%p"
+	  android:horizontalGap="0.93%p"
+	  android:verticalGap="8dip"
+	  android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="119" android:keyLabel="w"/>
     <Key android:codes="101" android:keyLabel="e"/>
     <Key android:codes="114" android:keyLabel="r"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="115" android:keyLabel="s"/>
     <Key android:codes="100" android:keyLabel="d"/>
     <Key android:codes="102" android:keyLabel="f"/>
@@ -48,9 +49,10 @@
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="122" android:keyLabel="z"/>
     <Key android:codes="120" android:keyLabel="x"/>
     <Key android:codes="99" android:keyLabel="c"/>
@@ -58,23 +60,26 @@
     <Key android:codes="98" android:keyLabel="b"/>
     <Key android:codes="110" android:keyLabel="n"/>
     <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="44" android:keyLabel="@string/key_qwerty_full_touten"/>
     <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space_conv" android:iconPreview="@drawable/key_qwerty_space_conv_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="44" android:keyLabel="@string/key_qwerty_full_touten"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="46" android:keyLabel="@string/key_qwerty_full_kuten"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="46" android:keyLabel="@string/key_qwerty_full_kuten"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_alphabet.xml b/res/xml/keyboard_qwerty_jp_full_alphabet.xml
index ea7d72f..34de3db 100644
--- a/res/xml/keyboard_qwerty_jp_full_alphabet.xml
+++ b/res/xml/keyboard_qwerty_jp_full_alphabet.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="65361" android:keyLabel="q" android:keyEdgeFlags="left"/>
+    <Key android:codes="65361" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65367" android:keyLabel="w"/>
     <Key android:codes="65349" android:keyLabel="e"/>
     <Key android:codes="65362" android:keyLabel="r"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="65345" android:keyLabel="a" android:keyEdgeFlags="left"/>
+    <Key android:codes="65345" android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65363" android:keyLabel="s"/>
     <Key android:codes="65348" android:keyLabel="d"/>
     <Key android:codes="65350" android:keyLabel="f"/>
@@ -48,9 +49,10 @@
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="65370" android:keyLabel="z"/>
     <Key android:codes="65368" android:keyLabel="x"/>
     <Key android:codes="65347" android:keyLabel="c"/>
@@ -58,23 +60,26 @@
     <Key android:codes="65346" android:keyLabel="b"/>
     <Key android:codes="65358" android:keyLabel="n"/>
     <Key android:codes="65357" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"/>
     <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b" 
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_alphabet_shift.xml b/res/xml/keyboard_qwerty_jp_full_alphabet_shift.xml
index 38005c8..7a02ba7 100644
--- a/res/xml/keyboard_qwerty_jp_full_alphabet_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_full_alphabet_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="65329" android:keyLabel="Q" android:keyEdgeFlags="left"/>
+    <Key android:codes="65329" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65335" android:keyLabel="W"/>
     <Key android:codes="65317" android:keyLabel="E"/>
     <Key android:codes="65330" android:keyLabel="R"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="65313" android:keyLabel="A" android:keyEdgeFlags="left"/>
+    <Key android:codes="65313" android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65331" android:keyLabel="S"/>
     <Key android:codes="65316" android:keyLabel="D"/>
     <Key android:codes="65318" android:keyLabel="F"/>
@@ -48,9 +49,10 @@
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="65338" android:keyLabel="Z"/>
     <Key android:codes="65336" android:keyLabel="X"/>
     <Key android:codes="65315" android:keyLabel="C"/>
@@ -58,23 +60,26 @@
     <Key android:codes="65314" android:keyLabel="B"/>
     <Key android:codes="65326" android:keyLabel="N"/>
     <Key android:codes="65325" android:keyLabel="M"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
     <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b" 
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_katakana.xml b/res/xml/keyboard_qwerty_jp_full_katakana.xml
index 5e2c0cd..c0bdd44 100644
--- a/res/xml/keyboard_qwerty_jp_full_katakana.xml
+++ b/res/xml/keyboard_qwerty_jp_full_katakana.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="119" android:keyLabel="w"/>
     <Key android:codes="101" android:keyLabel="e"/>
     <Key android:codes="114" android:keyLabel="r"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="115" android:keyLabel="s"/>
     <Key android:codes="100" android:keyLabel="d"/>
     <Key android:codes="102" android:keyLabel="f"/>
@@ -48,9 +49,10 @@
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="122" android:keyLabel="z"/>
     <Key android:codes="120" android:keyLabel="x"/>
     <Key android:codes="99" android:keyLabel="c"/>
@@ -58,23 +60,26 @@
     <Key android:codes="98" android:keyLabel="b"/>
     <Key android:codes="110" android:keyLabel="n"/>
     <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="12289" android:keyLabel="@string/key_qwerty_full_touten"/>
     <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="12289" android:keyLabel="@string/key_qwerty_full_touten"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="12290" android:keyLabel="@string/key_qwerty_full_kuten"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="12290" android:keyLabel="@string/key_qwerty_full_kuten"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b" 
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_katakana_shift.xml b/res/xml/keyboard_qwerty_jp_full_katakana_shift.xml
index dfee410..11f946f 100644
--- a/res/xml/keyboard_qwerty_jp_full_katakana_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_full_katakana_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,66 +15,71 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
-    <Key android:codes="119" android:keyLabel="w"/>
-    <Key android:codes="101" android:keyLabel="e"/>
-    <Key android:codes="114" android:keyLabel="r"/>
-    <Key android:codes="116" android:keyLabel="t"/>
-    <Key android:codes="121" android:keyLabel="y"/>
-    <Key android:codes="117" android:keyLabel="u"/>
-    <Key android:codes="105" android:keyLabel="i"/>
-    <Key android:codes="111" android:keyLabel="o"/>
-    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
-    <Key android:codes="115" android:keyLabel="s"/>
-    <Key android:codes="100" android:keyLabel="d"/>
-    <Key android:codes="102" android:keyLabel="f"/>
-    <Key android:codes="103" android:keyLabel="g"/>
-    <Key android:codes="104" android:keyLabel="h"/>
-    <Key android:codes="106" android:keyLabel="j"/>
-    <Key android:codes="107" android:keyLabel="k"/>
-    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
     <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
-    <Key android:codes="122" android:keyLabel="z"/>
-    <Key android:codes="120" android:keyLabel="x"/>
-    <Key android:codes="99" android:keyLabel="c"/>
-    <Key android:codes="118" android:keyLabel="v"/>
-    <Key android:codes="98" android:keyLabel="b"/>
-    <Key android:codes="110" android:keyLabel="n"/>
-    <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
     <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_symbols.xml b/res/xml/keyboard_qwerty_jp_full_symbols.xml
index 1fcf7fa..48ab92c 100644
--- a/res/xml/keyboard_qwerty_jp_full_symbols.xml
+++ b/res/xml/keyboard_qwerty_jp_full_symbols.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-    android:keyWidth="10%p"
-    android:horizontalGap="0dip"
-    android:verticalGap="0dip"
-    android:keyHeight="@dimen/key_height"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
     >
 
     <Row>
-        <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left"/>
+        <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
         <Key android:codes="65298" android:keyLabel="2"/>
         <Key android:codes="65299" android:keyLabel="3"/>
         <Key android:codes="65300" android:keyLabel="4"/>
@@ -35,7 +36,7 @@
     </Row>
     
     <Row>
-        <Key android:codes="65312" android:keyLabel="@string/key_qwerty_full_at_sign" android:keyEdgeFlags="left"/>
+        <Key android:codes="65312" android:keyLabel="@string/key_qwerty_full_at_sign" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
         <Key android:codes="65283" android:keyLabel="@string/key_qwerty_full_number_sign" />
         <Key android:codes="65285" android:keyLabel="@string/key_qwerty_full_percent_sign" />
         <Key android:codes="65286" android:keyLabel="@string/key_qwerty_full_ampersand" />
@@ -47,9 +48,10 @@
         <Key android:codes="12301" android:keyLabel="@string/key_qwerty_kagi_kakko_right"  android:keyEdgeFlags="right"/>
     </Row>
     
-    <Row>
-        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+    <Row android:horizontalGap="0.82%p">
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+             android:keyWidth="14%p" android:horizontalGap="1.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
         <Key android:codes="65295" android:keyLabel="@string/key_qwerty_full_slash" />
         <Key android:codes="65288" android:keyLabel="@string/key_qwerty_full_left_parenthesis" />
         <Key android:codes="65289" android:keyLabel="@string/key_qwerty_full_right_parenthesis" />
@@ -57,21 +59,26 @@
         <Key android:codes="65307" android:keyLabel="@string/key_qwerty_full_semicolon" />
         <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"  />
         <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question" />
-        <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-             android:keyEdgeFlags="right" android:isRepeatable="true"/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:keyWidth="13.9%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
     </Row>
     
-    <Row  android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
+    <Row  android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
 	         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-             android:keyWidth="15%p" android:keyEdgeFlags="left" />
-        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-             android:keyWidth="15%p" />
+             android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true" />
+        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+             android:keyWidth="15%p" wnn:isSecondKey="true" />
+        <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"/>
         <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-             android:keyWidth="30%p" android:isRepeatable="true"/>
-        <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma"  android:keyWidth="12.5%p" />
-        <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"  android:keyWidth="12.5%p" />
-        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-             android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+             android:keyWidth="15.1%p" android:isRepeatable="true"/>
+        <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period"/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_full_symbols_shift.xml b/res/xml/keyboard_qwerty_jp_full_symbols_shift.xml
index 26e5cb3..8421f69 100644
--- a/res/xml/keyboard_qwerty_jp_full_symbols_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_full_symbols_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left"/>
+    <Key android:codes="65297" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65298" android:keyLabel="2"/>
     <Key android:codes="65299" android:keyLabel="3"/>
     <Key android:codes="65300" android:keyLabel="4"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="65374" android:keyLabel="@string/key_qwerty_full_thilde" android:keyEdgeFlags="left"/>
+    <Key android:codes="65374" android:keyLabel="@string/key_qwerty_full_thilde" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="65342" android:keyLabel="@string/key_qwerty_full_hat"/>
     <Key android:codes="65509" android:keyLabel="@string/key_qwerty_full_yen_sign"/>
     <Key android:codes="65284" android:keyLabel="@string/key_qwerty_full_dollar_sign"/>
@@ -47,9 +48,10 @@
     <Key android:codes="65373" android:keyLabel="@string/key_qwerty_full_right_curly_blacket" android:keyEdgeFlags="right"/>
   </Row>
     
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="65372" android:keyLabel="@string/key_qwerty_full_vertical_bar"/>
     <Key android:codes="65308" android:keyLabel="@string/key_qwerty_full_less_than_sign"/>
     <Key android:codes="65310" android:keyLabel="@string/key_qwerty_full_greater_than_sign"/>
@@ -57,23 +59,26 @@
     <Key android:codes="8217" android:keyLabel="@string/key_qwerty_full_right_single_quote"/>
     <Key android:codes="65292" android:keyLabel="@string/key_qwerty_full_comma" />
     <Key android:codes="65294" android:keyLabel="@string/key_qwerty_full_period" />
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-	     android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+	     android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
-         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left" />
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p" />
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_full_num" android:iconPreview="@drawable/key_mode_change_b"
+         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true" />
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true" />
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
     <Key android:codes="12288"  android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"
-         android:keyWidth="12.5%p" />
-    <Key android:codes="12539" android:keyLabel="@string/key_qwerty_full_middot"
-         android:keyWidth="12.5%p" />
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="12539" android:keyLabel="@string/key_qwerty_full_middot"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_alphabet.xml b/res/xml/keyboard_qwerty_jp_half_alphabet.xml
index 80b7934..58b2181 100644
--- a/res/xml/keyboard_qwerty_jp_half_alphabet.xml
+++ b/res/xml/keyboard_qwerty_jp_half_alphabet.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
-	  >
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
+      >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="119" android:keyLabel="w"/>
     <Key android:codes="101" android:keyLabel="e"/>
     <Key android:codes="114" android:keyLabel="r"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="115" android:keyLabel="s"/>
     <Key android:codes="100" android:keyLabel="d"/>
     <Key android:codes="102" android:keyLabel="f"/>
@@ -47,9 +48,10 @@
     <Key android:codes="64"  android:keyLabel="\@" android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="122" android:keyLabel="z"/>
     <Key android:codes="120" android:keyLabel="x"/>
     <Key android:codes="99" android:keyLabel="c"/>
@@ -57,23 +59,26 @@
     <Key android:codes="98" android:keyLabel="b"/>
     <Key android:codes="110" android:keyLabel="n"/>
     <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="44" android:keyLabel=","/>
     <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="44" android:keyLabel=","
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="46" android:keyLabel="."
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="46" android:keyLabel="."/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_alphabet_shift.xml b/res/xml/keyboard_qwerty_jp_half_alphabet_shift.xml
index 7dc0869..21112d4 100644
--- a/res/xml/keyboard_qwerty_jp_half_alphabet_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_half_alphabet_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,65 +15,70 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
-    <Key android:codes="119" android:keyLabel="w"/>
-    <Key android:codes="101" android:keyLabel="e"/>
-    <Key android:codes="114" android:keyLabel="r"/>
-    <Key android:codes="116" android:keyLabel="t"/>
-    <Key android:codes="121" android:keyLabel="y"/>
-    <Key android:codes="117" android:keyLabel="u"/>
-    <Key android:codes="105" android:keyLabel="i"/>
-    <Key android:codes="111" android:keyLabel="o"/>
-    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
-    <Key android:codes="115" android:keyLabel="s"/>
-    <Key android:codes="100" android:keyLabel="d"/>
-    <Key android:codes="102" android:keyLabel="f"/>
-    <Key android:codes="103" android:keyLabel="g"/>
-    <Key android:codes="104" android:keyLabel="h"/>
-    <Key android:codes="106" android:keyLabel="j"/>
-    <Key android:codes="107" android:keyLabel="k"/>
-    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
     <Key android:codes="47"  android:keyLabel="/" android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
-    <Key android:codes="122" android:keyLabel="z"/>
-    <Key android:codes="120" android:keyLabel="x"/>
-    <Key android:codes="99" android:keyLabel="c"/>
-    <Key android:codes="118" android:keyLabel="v"/>
-    <Key android:codes="98" android:keyLabel="b"/>
-    <Key android:codes="110" android:keyLabel="n"/>
-    <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
-	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_alpha" android:iconPreview="@drawable/key_mode_change_b"
+	     android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
     <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="33" android:keyLabel="!"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="63" android:keyLabel="\?"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_katakana.xml b/res/xml/keyboard_qwerty_jp_half_katakana.xml
index 18d6c4c..190a55e 100644
--- a/res/xml/keyboard_qwerty_jp_half_katakana.xml
+++ b/res/xml/keyboard_qwerty_jp_half_katakana.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
+    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="119" android:keyLabel="w"/>
     <Key android:codes="101" android:keyLabel="e"/>
     <Key android:codes="114" android:keyLabel="r"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
+    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="115" android:keyLabel="s"/>
     <Key android:codes="100" android:keyLabel="d"/>
     <Key android:codes="102" android:keyLabel="f"/>
@@ -48,9 +49,10 @@
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+         android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="122" android:keyLabel="z"/>
     <Key android:codes="120" android:keyLabel="x"/>
     <Key android:codes="99" android:keyLabel="c"/>
@@ -58,23 +60,26 @@
     <Key android:codes="98" android:keyLabel="b"/>
     <Key android:codes="110" android:keyLabel="n"/>
     <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65380" android:keyLabel="@string/key_qwerty_half_comma"/>
     <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65380" android:keyLabel="@string/key_qwerty_half_comma"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="65377" android:keyLabel="@string/key_qwerty_half_period"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65377" android:keyLabel="@string/key_qwerty_half_period"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_katakana_shift.xml b/res/xml/keyboard_qwerty_jp_half_katakana_shift.xml
index c250968..ca9b724 100644
--- a/res/xml/keyboard_qwerty_jp_half_katakana_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_half_katakana_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,66 +15,71 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
-	  >
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
+      >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
-    <Key android:codes="119" android:keyLabel="w"/>
-    <Key android:codes="101" android:keyLabel="e"/>
-    <Key android:codes="114" android:keyLabel="r"/>
-    <Key android:codes="116" android:keyLabel="t"/>
-    <Key android:codes="121" android:keyLabel="y"/>
-    <Key android:codes="117" android:keyLabel="u"/>
-    <Key android:codes="105" android:keyLabel="i"/>
-    <Key android:codes="111" android:keyLabel="o"/>
-    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
-    <Key android:codes="115" android:keyLabel="s"/>
-    <Key android:codes="100" android:keyLabel="d"/>
-    <Key android:codes="102" android:keyLabel="f"/>
-    <Key android:codes="103" android:keyLabel="g"/>
-    <Key android:codes="104" android:keyLabel="h"/>
-    <Key android:codes="106" android:keyLabel="j"/>
-    <Key android:codes="107" android:keyLabel="k"/>
-    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
     <Key android:codes="65392" android:keyLabel="@string/key_qwerty_half_tyouon"
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
-    <Key android:codes="122" android:keyLabel="z"/>
-    <Key android:codes="120" android:keyLabel="x"/>
-    <Key android:codes="99" android:keyLabel="c"/>
-    <Key android:codes="118" android:keyLabel="v"/>
-    <Key android:codes="98" android:keyLabel="b"/>
-    <Key android:codes="110" android:keyLabel="n"/>
-    <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_kata" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
     <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="33" android:keyLabel="!"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="63" android:keyLabel="\?"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_symbols.xml b/res/xml/keyboard_qwerty_jp_half_symbols.xml
index 4621b9e..6ce9cf6 100644
--- a/res/xml/keyboard_qwerty_jp_half_symbols.xml
+++ b/res/xml/keyboard_qwerty_jp_half_symbols.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-    android:keyWidth="10%p"
-    android:horizontalGap="0dip"
-    android:verticalGap="0dip"
-    android:keyHeight="@dimen/key_height"
+    xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
     >
 
     <Row>
-        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
+        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
         <Key android:codes="50" android:keyLabel="2"/>
         <Key android:codes="51" android:keyLabel="3"/>
         <Key android:codes="52" android:keyLabel="4"/>
@@ -35,7 +36,7 @@
     </Row>
     
     <Row>
-        <Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left"/>
+        <Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
         <Key android:codes="35" android:keyLabel="\#"/>
         <Key android:codes="37" android:keyLabel="%"/>
         <Key android:codes="38" android:keyLabel="&amp;"/>
@@ -47,9 +48,10 @@
         <Key android:codes="93" android:keyLabel="]" android:keyEdgeFlags="right"/>
     </Row>
     
-    <Row>
-        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+    <Row android:horizontalGap="0.82%p">
+        <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b"
+             android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+             android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
         <Key android:codes="47" android:keyLabel="/" />
         <Key android:codes="40" android:keyLabel="("/>
         <Key android:codes="41" android:keyLabel=")"/>
@@ -57,21 +59,26 @@
         <Key android:codes="59" android:keyLabel=";"/>
         <Key android:codes="33" android:keyLabel="!" />
         <Key android:codes="63" android:keyLabel="\?"/>
-        <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-             android:keyEdgeFlags="right" android:isRepeatable="true"/>
+        <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+             android:keyWidth="13.9%p"
+             android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
     </Row>
     
-    <Row  android:rowEdgeFlags="bottom">
-        <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
-	         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-             android:keyWidth="15%p" android:keyEdgeFlags="left" />
-        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-             android:keyWidth="15%p" />
+    <Row  android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+        <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
+	         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+             android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+        <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+             android:keyWidth="15%p" wnn:isSecondKey="true" />
+        <Key android:codes="44" android:keyLabel=","/>
         <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-             android:keyWidth="30%p" android:isRepeatable="true"/>
-        <Key android:codes="44" android:keyLabel="," android:keyWidth="12.5%p" />
-        <Key android:codes="46" android:keyLabel="." android:keyWidth="12.5%p" />
-        <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-             android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+             android:keyWidth="15.1%p" android:isRepeatable="true"/>
+        <Key android:codes="46" android:keyLabel="."/>
+        <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+             android:isRepeatable="true" wnn:isSecondKey="true"/>
+        <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+             android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
     </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_half_symbols_shift.xml b/res/xml/keyboard_qwerty_jp_half_symbols_shift.xml
index e7871f1..5df9fec 100644
--- a/res/xml/keyboard_qwerty_jp_half_symbols_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_half_symbols_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,14 +15,15 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
-	  >
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
+      >
   
   <Row>
-    <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
+    <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="50" android:keyLabel="2"/>
     <Key android:codes="51" android:keyLabel="3"/>
     <Key android:codes="52" android:keyLabel="4"/>
@@ -35,7 +36,7 @@
   </Row>
   
   <Row>
-    <Key android:codes="126" android:keyLabel="~" android:keyEdgeFlags="left"/>
+    <Key android:codes="126" android:keyLabel="~" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
     <Key android:codes="94" android:keyLabel="^"/>
     <Key android:codes="165" android:keyLabel="¥"/>
     <Key android:codes="36" android:keyLabel="$"/>
@@ -47,9 +48,10 @@
     <Key android:codes="125" android:keyLabel="}" android:keyEdgeFlags="right"/>
   </Row>
     
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p"  android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
     <Key android:codes="124" android:keyLabel="|"/>
     <Key android:codes="60" android:keyLabel="&lt;"/>
     <Key android:codes="62" android:keyLabel="&gt;"/>
@@ -57,21 +59,26 @@
     <Key android:codes="39" android:keyLabel="'"/>
     <Key android:codes="44" android:keyLabel="," />
     <Key android:codes="46" android:keyLabel="." />
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-	     android:keyEdgeFlags="right" android:isRepeatable="true"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+	     android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
-         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left" />
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p" />
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_half_num" android:iconPreview="@drawable/key_mode_change_b"
+         android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="33" android:keyLabel="!"/>
     <Key android:codes="32" android:keyIcon="@drawable/key_qwerty_space" android:iconPreview="@drawable/key_qwerty_space_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="33" android:keyLabel="!" android:keyWidth="12.5%p" />
-    <Key android:codes="63" android:keyLabel="\?" android:keyWidth="12.5%p" />
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter" android:iconPreview="@drawable/key_qwerty_enter_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="63" android:keyLabel="\?"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_qwerty_jp_shift.xml b/res/xml/keyboard_qwerty_jp_shift.xml
index 99b8ea8..d5f542b 100644
--- a/res/xml/keyboard_qwerty_jp_shift.xml
+++ b/res/xml/keyboard_qwerty_jp_shift.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,66 +15,71 @@
  limitations under the License.
 -->
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-	  android:keyWidth="10%p"
-	  android:horizontalGap="0dip"
-	  android:verticalGap="0dip"
-	  android:keyHeight="@dimen/key_height"
+      xmlns:wnn="http://schemas.android.com/apk/res/jp.co.omronsoft.openwnn"
+      android:keyWidth="9%p"
+      android:horizontalGap="0.93%p"
+      android:verticalGap="8dip"
+      android:keyHeight="@dimen/key_height_qwerty"
 	  >
   
   <Row>
-    <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
-    <Key android:codes="119" android:keyLabel="w"/>
-    <Key android:codes="101" android:keyLabel="e"/>
-    <Key android:codes="114" android:keyLabel="r"/>
-    <Key android:codes="116" android:keyLabel="t"/>
-    <Key android:codes="121" android:keyLabel="y"/>
-    <Key android:codes="117" android:keyLabel="u"/>
-    <Key android:codes="105" android:keyLabel="i"/>
-    <Key android:codes="111" android:keyLabel="o"/>
-    <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+    <Key android:codes="113" android:keyLabel="Q" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="119" android:keyLabel="W"/>
+    <Key android:codes="101" android:keyLabel="E"/>
+    <Key android:codes="114" android:keyLabel="R"/>
+    <Key android:codes="116" android:keyLabel="T"/>
+    <Key android:codes="121" android:keyLabel="Y"/>
+    <Key android:codes="117" android:keyLabel="U"/>
+    <Key android:codes="105" android:keyLabel="I"/>
+    <Key android:codes="111" android:keyLabel="O"/>
+    <Key android:codes="112" android:keyLabel="P" android:keyEdgeFlags="right"/>
   </Row>
   
   <Row>
-    <Key android:codes="97"  android:keyLabel="a" android:keyEdgeFlags="left"/>
-    <Key android:codes="115" android:keyLabel="s"/>
-    <Key android:codes="100" android:keyLabel="d"/>
-    <Key android:codes="102" android:keyLabel="f"/>
-    <Key android:codes="103" android:keyLabel="g"/>
-    <Key android:codes="104" android:keyLabel="h"/>
-    <Key android:codes="106" android:keyLabel="j"/>
-    <Key android:codes="107" android:keyLabel="k"/>
-    <Key android:codes="108" android:keyLabel="l"/>
+    <Key android:codes="97"  android:keyLabel="A" android:keyEdgeFlags="left" android:horizontalGap="1.2%p"/>
+    <Key android:codes="115" android:keyLabel="S"/>
+    <Key android:codes="100" android:keyLabel="D"/>
+    <Key android:codes="102" android:keyLabel="F"/>
+    <Key android:codes="103" android:keyLabel="G"/>
+    <Key android:codes="104" android:keyLabel="H"/>
+    <Key android:codes="106" android:keyLabel="J"/>
+    <Key android:codes="107" android:keyLabel="K"/>
+    <Key android:codes="108" android:keyLabel="L"/>
     <Key android:codes="12540" android:keyLabel="@string/key_qwerty_tyouon"
          android:keyEdgeFlags="right"/>
   </Row>
   
-  <Row>
-    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift" android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="15%p"
-         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left"/>
-    <Key android:codes="122" android:keyLabel="z"/>
-    <Key android:codes="120" android:keyLabel="x"/>
-    <Key android:codes="99" android:keyLabel="c"/>
-    <Key android:codes="118" android:keyLabel="v"/>
-    <Key android:codes="98" android:keyLabel="b"/>
-    <Key android:codes="110" android:keyLabel="n"/>
-    <Key android:codes="109" android:keyLabel="m"/>
-    <Key android:codes="-100" android:keyIcon="@drawable/key_qwerty_del" android:iconPreview="@drawable/key_qwerty_del_b" android:keyWidth="15%p" 
-         android:keyEdgeFlags="right" android:isRepeatable="true"/>
+  <Row android:horizontalGap="0.82%p">
+    <Key android:codes="-1" android:keyIcon="@drawable/key_qwerty_shift"
+         android:iconPreview="@drawable/key_qwerty_shift_b" android:keyWidth="14%p" android:horizontalGap="1.2%p"
+         android:isModifier="true" android:isSticky="false" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="122" android:keyLabel="Z"/>
+    <Key android:codes="120" android:keyLabel="X"/>
+    <Key android:codes="99" android:keyLabel="C"/>
+    <Key android:codes="118" android:keyLabel="V"/>
+    <Key android:codes="98" android:keyLabel="B"/>
+    <Key android:codes="110" android:keyLabel="N"/>
+    <Key android:codes="109" android:keyLabel="M"/>
+    <Key android:codes="-100" android:keyIcon="@drawable/key_del" android:iconPreview="@drawable/key_del_b"
+         android:keyWidth="13.9%p"
+         android:keyEdgeFlags="right" android:isRepeatable="true" wnn:isSecondKey="true"/>
   </Row>
   
-  <Row android:rowEdgeFlags="bottom">
-    <Key android:codes="-230" android:keyIcon="@drawable/key_qwerty_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
-	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp"
-         android:keyWidth="15%p" android:keyEdgeFlags="left"/>
-    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_qwerty_pict_sym_b"
-         android:keyWidth="15%p"/>
+  <Row android:rowEdgeFlags="bottom" android:horizontalGap="0.28%p">
+    <Key android:codes="-230" android:keyIcon="@drawable/key_mode_hira" android:iconPreview="@drawable/key_mode_change_b"
+	 android:popupKeyboard="@xml/keyboard_switch_key_qwerty_jp" android:horizontalGap="1.2%p"
+         android:keyWidth="15%p" android:keyEdgeFlags="left" wnn:isSecondKey="true"/>
+    <Key android:codes="-106" android:keyIcon="@drawable/key_qwerty_pict_sym" android:iconPreview="@drawable/key_pict_sym_b"
+         android:keyWidth="15%p" wnn:isSecondKey="true"/>
+    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"/>
     <Key android:codes="12288" android:keyIcon="@drawable/key_qwerty_space_conv" android:iconPreview="@drawable/key_qwerty_space_conv_b" 
-         android:keyWidth="30%p" android:isRepeatable="true"/>
-    <Key android:codes="65281" android:keyLabel="@string/key_qwerty_full_exclamation_mark"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"
-         android:keyWidth="12.5%p"/>
-    <Key android:codes="-101" android:keyIcon="@drawable/key_qwerty_enter_jp" android:iconPreview="@drawable/key_qwerty_enter_jp_b" 
-         android:keyWidth="15%p" android:keyEdgeFlags="right"/>
+         android:keyWidth="15.1%p" android:isRepeatable="true"/>
+    <Key android:codes="65311" android:keyLabel="@string/key_qwerty_full_question"/>
+    <Key android:codes="-218" android:keyIcon="@drawable/key_qwerty_left" android:iconPreview="@drawable/key_qwerty_left_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-217" android:keyIcon="@drawable/key_qwerty_right" android:iconPreview="@drawable/key_qwerty_right_b"
+         android:isRepeatable="true" wnn:isSecondKey="true"/>
+    <Key android:codes="-101" android:keyIcon="@drawable/key_enter" android:iconPreview="@drawable/key_enter_b"
+         android:keyWidth="15%p" android:keyEdgeFlags="right" wnn:isSecondKey="true"/>
   </Row>
 </Keyboard>
diff --git a/res/xml/keyboard_switch_key_jp.xml b/res/xml/keyboard_switch_key_jp.xml
index 0ba7976..f5e461c 100644
--- a/res/xml/keyboard_switch_key_jp.xml
+++ b/res/xml/keyboard_switch_key_jp.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/keyboard_switch_key_qwerty_jp.xml b/res/xml/keyboard_switch_key_qwerty_jp.xml
index 3c09b96..9305017 100644
--- a/res/xml/keyboard_switch_key_qwerty_jp.xml
+++ b/res/xml/keyboard_switch_key_qwerty_jp.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/method_ja.xml b/res/xml/method_ja.xml
index 4e5f157..b36d24a 100644
--- a/res/xml/method_ja.xml
+++ b/res/xml/method_ja.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -19,4 +19,9 @@
 
 <input-method xmlns:android="http://schemas.android.com/apk/res/android"
               android:settingsActivity="jp.co.omronsoft.openwnn.OpenWnnControlPanelJAJP"
-/>
+              >
+   <subtype android:label="@string/label_subtype_generic"
+           android:imeSubtypeLocale="ja"
+           android:imeSubtypeMode="keyboard"
+   />
+</input-method>
diff --git a/res/xml/openwnn_pref_ja.xml b/res/xml/openwnn_pref_ja.xml
index 6de5fbf..bc90ddd 100644
--- a/res/xml/openwnn_pref_ja.xml
+++ b/res/xml/openwnn_pref_ja.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -23,7 +23,8 @@
 			android:summary="@string/preference_key_sound_summary"/>
     <CheckBoxPreference android:key="key_vibration"
 			android:title="@string/preference_key_vibration_title"
-			android:summary="@string/preference_key_vibration_summary"/>
+			android:summary="@string/preference_key_vibration_summary"
+			android:defaultValue="true" />
     <CheckBoxPreference android:key="popup_preview"
 			android:title="@string/preference_preview_title"
 			android:summary="@string/preference_preview_summary"
@@ -41,20 +42,31 @@
 			android:defaultValue="keyboard_android_default" />
   </PreferenceCategory>
     
-  <PreferenceCategory android:title="@string/preference_conversion_menu">
-    <CheckBoxPreference android:key="opt_enable_learning"
-			android:title="@string/preference_input_learning_title"
+  <PreferenceCategory android:title="@string/preference_conversion_menu_ja">
+    <CheckBoxPreference android:key="opt_enable_learning_ja"
+			android:title="@string/preference_input_learning_title_ja"
 			android:summary="@string/preference_input_learning_summary"
 			android:defaultValue="true" />
-    <CheckBoxPreference android:key="opt_prediction"
-			android:title="@string/preference_prediction_title"
+    <CheckBoxPreference android:key="opt_prediction_ja"
+			android:title="@string/preference_prediction_title_ja"
 			android:summary="@string/preference_prediction_summary"
 			android:defaultValue="true" />
-    <CheckBoxPreference android:key="opt_spell_correction"
-			android:title="@string/preference_correct_spell_title"
+  </PreferenceCategory>
+
+  <PreferenceCategory android:title="@string/preference_conversion_menu_en">
+    <CheckBoxPreference android:key="opt_enable_learning_en"
+			android:title="@string/preference_input_learning_title_en"
+			android:summary="@string/preference_input_learning_summary"
+			android:defaultValue="true" />
+    <CheckBoxPreference android:key="opt_prediction_en"
+			android:title="@string/preference_prediction_title_en"
+			android:summary="@string/preference_prediction_summary"
+			android:defaultValue="false" />
+    <CheckBoxPreference android:key="opt_spell_correction_en"
+			android:title="@string/preference_correct_spell_title_en"
 			android:summary="@string/preference_correct_spell_summary"
 			android:defaultValue="true"
-			android:dependency="opt_prediction" />
+			android:dependency="opt_prediction_en" />
   </PreferenceCategory>
     
   <PreferenceCategory android:title="@string/preference_dictionary_menu">
diff --git a/res/xml/symbols_china_list.xml b/res/xml/symbols_china_list.xml
index a9fc71b..3e9839d 100644
--- a/res/xml/symbols_china_list.xml
+++ b/res/xml/symbols_china_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/symbols_japan_emoji_list.xml b/res/xml/symbols_japan_emoji_list.xml
new file mode 100644
index 0000000..22e3004
--- /dev/null
+++ b/res/xml/symbols_japan_emoji_list.xml
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--symbols -->
+<keystring>
+
+<string value="\udbb8\udc00"/>
+<string value="\udbb8\udc01"/>
+<string value="\udbb8\udc02"/>
+<string value="\udbb8\udc03"/>
+<string value="\udbb8\udc04"/>
+<string value="\udbb8\udc05"/>
+<string value="\udbb8\udc06"/>
+<string value="\udbb8\udc07"/>
+<string value="\udbb8\udc08"/>
+<string value="\udbb8\udc09"/>
+<string value="\udbb8\udc0a"/>
+<string value="\udbb8\udc0b"/>
+<string value="\udbb8\udc0c"/>
+<string value="\udbb8\udc0d"/>
+<string value="\udbb8\udc0e"/>
+<string value="\udbb8\udc0f"/>
+<string value="\udbb8\udc10"/>
+<string value="\udbb8\udc11"/>
+<string value="\udbb8\udc12"/>
+<string value="\udbb8\udc13"/>
+<string value="\udbb8\udc14"/>
+<string value="\udbb8\udc15"/>
+<string value="\udbb8\udc16"/>
+<string value="\udbb8\udc17"/>
+<string value="\udbb8\udc18"/>
+<string value="\udbb8\udc19"/>
+<string value="\udbb8\udc1a"/>
+<string value="\udbb8\udc1b"/>
+<string value="\udbb8\udc1c"/>
+<string value="\udbb8\udc1d"/>
+<string value="\udbb8\udc1e"/>
+<string value="\udbb8\udc1f"/>
+<string value="\udbb8\udc20"/>
+<string value="\udbb8\udc21"/>
+<string value="\udbb8\udc22"/>
+<string value="\udbb8\udc23"/>
+<string value="\udbb8\udc24"/>
+<string value="\udbb8\udc25"/>
+<string value="\udbb8\udc26"/>
+<string value="\udbb8\udc27"/>
+<string value="\udbb8\udc28"/>
+<string value="\udbb8\udc29"/>
+<string value="\udbb8\udc2a"/>
+<string value="\udbb8\udc2b"/>
+<string value="\udbb8\udc2c"/>
+<string value="\udbb8\udc2d"/>
+<string value="\udbb8\udc2e"/>
+<string value="\udbb8\udc2f"/>
+<string value="\udbb8\udc30"/>
+<string value="\udbb8\udc31"/>
+<string value="\udbb8\udc32"/>
+<string value="\udbb8\udc33"/>
+<string value="\udbb8\udc34"/>
+<string value="\udbb8\udc35"/>
+<string value="\udbb8\udc36"/>
+<string value="\udbb8\udc37"/>
+<string value="\udbb8\udc38"/>
+<string value="\udbb8\udc39"/>
+<string value="\udbb8\udc3a"/>
+<string value="\udbb8\udc3b"/>
+<string value="\udbb8\udc3c"/>
+<string value="\udbb8\udc3d"/>
+<string value="\udbb8\udc3e"/>
+<string value="\udbb8\udc3f"/>
+<string value="\udbb8\udc40"/>
+<string value="\udbb8\udc41"/>
+<string value="\udbb8\udc42"/>
+<string value="\udbb8\udc43"/>
+<string value="\udbb8\udc44"/>
+<string value="\udbb8\udc45"/>
+<string value="\udbb8\udc46"/>
+<string value="\udbb8\udc47"/>
+<string value="\udbb8\udc48"/>
+<string value="\udbb8\udc49"/>
+<string value="\udbb8\udc4a"/>
+<string value="\udbb8\udc4b"/>
+<string value="\udbb8\udc4c"/>
+<string value="\udbb8\udc4d"/>
+<string value="\udbb8\udc4e"/>
+<string value="\udbb8\udc4f"/>
+<string value="\udbb8\udc50"/>
+<string value="\udbb8\udc51"/>
+<string value="\udbb8\udc52"/>
+<string value="\udbb8\udc53"/>
+<string value="\udbb8\udc54"/>
+<string value="\udbb8\udc55"/>
+<string value="\udbb8\udc56"/>
+<string value="\udbb8\udc57"/>
+<string value="\udbb8\udc58"/>
+<string value="\udbb8\udc59"/>
+<string value="\udbb8\udc5a"/>
+<string value="\udbb8\udc5b"/>
+<string value="\udbb8\udd90"/>
+<string value="\udbb8\udd91"/>
+<string value="\udbb8\udd92"/>
+<string value="\udbb8\udd93"/>
+<string value="\udbb8\udd94"/>
+<string value="\udbb8\udd95"/>
+<string value="\udbb8\udd96"/>
+<string value="\udbb8\udd97"/>
+<string value="\udbb8\udd98"/>
+<string value="\udbb8\udd99"/>
+<string value="\udbb8\udd9a"/>
+<string value="\udbb8\udd9b"/>
+<string value="\udbb8\udd9c"/>
+<string value="\udbb8\udd9d"/>
+<string value="\udbb8\udd9e"/>
+<string value="\udbb8\udd9f"/>
+<string value="\udbb8\udda0"/>
+<string value="\udbb8\udda1"/>
+<string value="\udbb8\udda2"/>
+<string value="\udbb8\udda3"/>
+<string value="\udbb8\udda4"/>
+<string value="\udbb8\udda5"/>
+<string value="\udbb8\udda6"/>
+<string value="\udbb8\udda7"/>
+<string value="\udbb8\udda8"/>
+<string value="\udbb8\udda9"/>
+<string value="\udbb8\uddaa"/>
+<string value="\udbb8\uddab"/>
+<string value="\udbb8\uddac"/>
+<string value="\udbb8\uddad"/>
+<string value="\udbb8\uddae"/>
+<string value="\udbb8\uddaf"/>
+<string value="\udbb8\uddb0"/>
+<string value="\udbb8\uddb1"/>
+<string value="\udbb8\uddb2"/>
+<string value="\udbb8\uddb3"/>
+<string value="\udbb8\uddb4"/>
+<string value="\udbb8\uddb5"/>
+<string value="\udbb8\uddb6"/>
+<string value="\udbb8\uddb7"/>
+<string value="\udbb8\uddb8"/>
+<string value="\udbb8\uddb9"/>
+<string value="\udbb8\uddba"/>
+<string value="\udbb8\uddbb"/>
+<string value="\udbb8\uddbc"/>
+<string value="\udbb8\uddbd"/>
+<string value="\udbb8\uddbe"/>
+<string value="\udbb8\uddbf"/>
+<string value="\udbb8\uddc0"/>
+<string value="\udbb8\uddc1"/>
+<string value="\udbb8\uddc2"/>
+<string value="\udbb8\uddc3"/>
+<string value="\udbb8\uddc4"/>
+<string value="\udbb8\uddc5"/>
+<string value="\udbb8\uddc6"/>
+<string value="\udbb8\uddc7"/>
+<string value="\udbb8\uddc8"/>
+<string value="\udbb8\uddc9"/>
+<string value="\udbb8\uddca"/>
+<string value="\udbb8\uddcb"/>
+<string value="\udbb8\uddcc"/>
+<string value="\udbb8\uddcd"/>
+<string value="\udbb8\uddce"/>
+<string value="\udbb8\uddcf"/>
+<string value="\udbb8\uddd0"/>
+<string value="\udbb8\uddd1"/>
+<string value="\udbb8\uddd2"/>
+<string value="\udbb8\uddd3"/>
+<string value="\udbb8\uddd4"/>
+<string value="\udbb8\uddd5"/>
+<string value="\udbb8\uddd6"/>
+<string value="\udbb8\uddd7"/>
+<string value="\udbb8\uddd8"/>
+<string value="\udbb8\uddd9"/>
+<string value="\udbb8\uddda"/>
+<string value="\udbb8\udddb"/>
+<string value="\udbb8\udddc"/>
+<string value="\udbb8\udddd"/>
+<string value="\udbb8\uddde"/>
+<string value="\udbb8\udddf"/>
+<string value="\udbb8\udde0"/>
+<string value="\udbb8\udde1"/>
+<string value="\udbb8\udde2"/>
+<string value="\udbb8\udde3"/>
+<string value="\udbb8\udf20"/>
+<string value="\udbb8\udf21"/>
+<string value="\udbb8\udf22"/>
+<string value="\udbb8\udf23"/>
+<string value="\udbb8\udf24"/>
+<string value="\udbb8\udf25"/>
+<string value="\udbb8\udf26"/>
+<string value="\udbb8\udf27"/>
+<string value="\udbb8\udf28"/>
+<string value="\udbb8\udf29"/>
+<string value="\udbb8\udf2a"/>
+<string value="\udbb8\udf2b"/>
+<string value="\udbb8\udf2c"/>
+<string value="\udbb8\udf2d"/>
+<string value="\udbb8\udf2e"/>
+<string value="\udbb8\udf2f"/>
+<string value="\udbb8\udf30"/>
+<string value="\udbb8\udf31"/>
+<string value="\udbb8\udf32"/>
+<string value="\udbb8\udf33"/>
+<string value="\udbb8\udf34"/>
+<string value="\udbb8\udf35"/>
+<string value="\udbb8\udf36"/>
+<string value="\udbb8\udf37"/>
+<string value="\udbb8\udf38"/>
+<string value="\udbb8\udf39"/>
+<string value="\udbb8\udf3a"/>
+<string value="\udbb8\udf3b"/>
+<string value="\udbb8\udf3c"/>
+<string value="\udbb8\udf3d"/>
+<string value="\udbb8\udf3e"/>
+<string value="\udbb8\udf3f"/>
+<string value="\udbb8\udf40"/>
+<string value="\udbb8\udf41"/>
+<string value="\udbb8\udf42"/>
+<string value="\udbb8\udf43"/>
+<string value="\udbb8\udf44"/>
+<string value="\udbb8\udf45"/>
+<string value="\udbb8\udf46"/>
+<string value="\udbb8\udf47"/>
+<string value="\udbb8\udf48"/>
+<string value="\udbb8\udf49"/>
+<string value="\udbb8\udf4a"/>
+<string value="\udbb8\udf4b"/>
+<string value="\udbb8\udf4c"/>
+<string value="\udbb8\udf4d"/>
+<string value="\udbb8\udf4e"/>
+<string value="\udbb8\udf4f"/>
+<string value="\udbb8\udf50"/>
+<string value="\udbb8\udf51"/>
+<string value="\udbb8\udf52"/>
+<string value="\udbb8\udf53"/>
+<string value="\udbb8\udf54"/>
+<string value="\udbb8\udf55"/>
+<string value="\udbb8\udf56"/>
+<string value="\udbb8\udf57"/>
+<string value="\udbb8\udf58"/>
+<string value="\udbb8\udf59"/>
+<string value="\udbb8\udf5a"/>
+<string value="\udbb8\udf5b"/>
+<string value="\udbb8\udf5c"/>
+<string value="\udbb8\udf5d"/>
+<string value="\udbb8\udf5e"/>
+<string value="\udbb8\udf5f"/>
+<string value="\udbb8\udf60"/>
+<string value="\udbb8\udf61"/>
+<string value="\udbb8\udf62"/>
+<string value="\udbb8\udf63"/>
+<string value="\udbb8\udf64"/>
+<string value="\udbb8\udf65"/>
+<string value="\udbb8\udf66"/>
+<string value="\udbb8\udf67"/>
+<string value="\udbb8\udf68"/>
+<string value="\udbb8\udf69"/>
+<string value="\udbb9\udcb0"/>
+<string value="\udbb9\udcb1"/>
+<string value="\udbb9\udcb2"/>
+<string value="\udbb9\udcb3"/>
+<string value="\udbb9\udcb4"/>
+<string value="\udbb9\udcb5"/>
+<string value="\udbb9\udcb6"/>
+<string value="\udbb9\udcb7"/>
+<string value="\udbb9\udcb8"/>
+<string value="\udbb9\udcb9"/>
+<string value="\udbb9\udcba"/>
+<string value="\udbb9\udcbb"/>
+<string value="\udbb9\udcbc"/>
+<string value="\udbb9\udcbd"/>
+<string value="\udbb9\udcbe"/>
+<string value="\udbb9\udcbf"/>
+<string value="\udbb9\udcc0"/>
+<string value="\udbb9\udcc1"/>
+<string value="\udbb9\udcc2"/>
+<string value="\udbb9\udcc3"/>
+<string value="\udbb9\udcc4"/>
+<string value="\udbb9\udcc5"/>
+<string value="\udbb9\udcc6"/>
+<string value="\udbb9\udcc7"/>
+<string value="\udbb9\udcc8"/>
+<string value="\udbb9\udcc9"/>
+<string value="\udbb9\udcca"/>
+<string value="\udbb9\udccb"/>
+<string value="\udbb9\udccc"/>
+<string value="\udbb9\udccd"/>
+<string value="\udbb9\udcce"/>
+<string value="\udbb9\udccf"/>
+<string value="\udbb9\udcd0"/>
+<string value="\udbb9\udcd1"/>
+<string value="\udbb9\udcd2"/>
+<string value="\udbb9\udcd3"/>
+<string value="\udbb9\udcd4"/>
+<string value="\udbb9\udcd5"/>
+<string value="\udbb9\udcd6"/>
+<string value="\udbb9\udcd7"/>
+<string value="\udbb9\udcd8"/>
+<string value="\udbb9\udcd9"/>
+<string value="\udbb9\udcda"/>
+<string value="\udbb9\udcdb"/>
+<string value="\udbb9\udcdc"/>
+<string value="\udbb9\udcdd"/>
+<string value="\udbb9\udcde"/>
+<string value="\udbb9\udcdf"/>
+<string value="\udbb9\udce0"/>
+<string value="\udbb9\udce1"/>
+<string value="\udbb9\udce2"/>
+<string value="\udbb9\udce3"/>
+<string value="\udbb9\udce4"/>
+<string value="\udbb9\udce5"/>
+<string value="\udbb9\udce6"/>
+<string value="\udbb9\udce7"/>
+<string value="\udbb9\udce8"/>
+<string value="\udbb9\udce9"/>
+<string value="\udbb9\udcea"/>
+<string value="\udbb9\udceb"/>
+<string value="\udbb9\udcec"/>
+<string value="\udbb9\udced"/>
+<string value="\udbb9\udcee"/>
+<string value="\udbb9\udcef"/>
+<string value="\udbb9\udcf0"/>
+<string value="\udbb9\udcf1"/>
+<string value="\udbb9\udcf2"/>
+<string value="\udbb9\udcf3"/>
+<string value="\udbb9\udcf4"/>
+<string value="\udbb9\udcf5"/>
+<string value="\udbb9\udcf6"/>
+<string value="\udbb9\udcf7"/>
+<string value="\udbb9\udcf8"/>
+<string value="\udbb9\udcf9"/>
+<string value="\udbb9\udcfa"/>
+<string value="\udbb9\udcfb"/>
+<string value="\udbb9\udcfc"/>
+<string value="\udbb9\udcfd"/>
+<string value="\udbb9\udcfe"/>
+<string value="\udbb9\udcff"/>
+<string value="\udbb9\udd00"/>
+<string value="\udbb9\udd01"/>
+<string value="\udbb9\udd02"/>
+<string value="\udbb9\udd03"/>
+<string value="\udbb9\udd04"/>
+<string value="\udbb9\udd05"/>
+<string value="\udbb9\udd06"/>
+<string value="\udbb9\udd07"/>
+<string value="\udbb9\udd08"/>
+<string value="\udbb9\udd09"/>
+<string value="\udbb9\udd0a"/>
+<string value="\udbb9\udd0b"/>
+<string value="\udbb9\udd0c"/>
+<string value="\udbb9\udd0d"/>
+<string value="\udbb9\udd0e"/>
+<string value="\udbb9\udd0f"/>
+<string value="\udbb9\udd10"/>
+<string value="\udbb9\udd11"/>
+<string value="\udbb9\udd12"/>
+<string value="\udbb9\udd13"/>
+<string value="\udbb9\udd14"/>
+<string value="\udbb9\udd15"/>
+<string value="\udbb9\udd16"/>
+<string value="\udbb9\udd17"/>
+<string value="\udbb9\udd18"/>
+<string value="\udbb9\udd19"/>
+<string value="\udbb9\udd1a"/>
+<string value="\udbb9\udd1b"/>
+<string value="\udbb9\udd1c"/>
+<string value="\udbb9\udd1d"/>
+<string value="\udbb9\udd1e"/>
+<string value="\udbb9\udd1f"/>
+<string value="\udbb9\udd20"/>
+<string value="\udbb9\udd21"/>
+<string value="\udbb9\udd22"/>
+<string value="\udbb9\udd23"/>
+<string value="\udbb9\udd24"/>
+<string value="\udbb9\udd25"/>
+<string value="\udbb9\udd26"/>
+<string value="\udbb9\udd27"/>
+<string value="\udbb9\udd28"/>
+<string value="\udbb9\udd29"/>
+<string value="\udbb9\udd2a"/>
+<string value="\udbb9\udd2b"/>
+<string value="\udbb9\udd2c"/>
+<string value="\udbb9\udd2d"/>
+<string value="\udbb9\udd2e"/>
+<string value="\udbb9\udd2f"/>
+<string value="\udbb9\udd30"/>
+<string value="\udbb9\udd31"/>
+<string value="\udbb9\udd32"/>
+<string value="\udbb9\udd33"/>
+<string value="\udbb9\udd34"/>
+<string value="\udbb9\udd35"/>
+<string value="\udbb9\udd36"/>
+<string value="\udbb9\udd37"/>
+<string value="\udbb9\udd38"/>
+<string value="\udbb9\udd39"/>
+<string value="\udbb9\udd3a"/>
+<string value="\udbb9\udd3b"/>
+<string value="\udbb9\udd3c"/>
+<string value="\udbb9\udd3d"/>
+<string value="\udbb9\udd3e"/>
+<string value="\udbb9\udd3f"/>
+<string value="\udbb9\udd40"/>
+<string value="\udbb9\udd41"/>
+<string value="\udbb9\udd42"/>
+<string value="\udbb9\udd43"/>
+<string value="\udbb9\udd44"/>
+<string value="\udbb9\udd45"/>
+<string value="\udbb9\udd46"/>
+<string value="\udbb9\udd47"/>
+<string value="\udbb9\udd48"/>
+<string value="\udbb9\udd49"/>
+<string value="\udbb9\udd4a"/>
+<string value="\udbb9\udd4b"/>
+<string value="\udbb9\udd4c"/>
+<string value="\udbb9\udd4d"/>
+<string value="\udbb9\udd4e"/>
+<string value="\udbb9\udd4f"/>
+<string value="\udbb9\udd50"/>
+<string value="\udbb9\udd51"/>
+<string value="\udbb9\udd52"/>
+<string value="\udbb9\udd53"/>
+<string value="\udbb9\udfd0"/>
+<string value="\udbb9\udfd1"/>
+<string value="\udbb9\udfd2"/>
+<string value="\udbb9\udfd3"/>
+<string value="\udbb9\udfd4"/>
+<string value="\udbb9\udfd5"/>
+<string value="\udbb9\udfd6"/>
+<string value="\udbb9\udfd7"/>
+<string value="\udbb9\udfd8"/>
+<string value="\udbb9\udfd9"/>
+<string value="\udbb9\udfda"/>
+<string value="\udbb9\udfdb"/>
+<string value="\udbb9\udfdc"/>
+<string value="\udbb9\udfdd"/>
+<string value="\udbb9\udfde"/>
+<string value="\udbb9\udfdf"/>
+<string value="\udbb9\udfe0"/>
+<string value="\udbb9\udfe1"/>
+<string value="\udbb9\udfe2"/>
+<string value="\udbb9\udfe3"/>
+<string value="\udbb9\udfe4"/>
+<string value="\udbb9\udfe5"/>
+<string value="\udbb9\udfe6"/>
+<string value="\udbb9\udfe7"/>
+<string value="\udbb9\udfe8"/>
+<string value="\udbb9\udfe9"/>
+<string value="\udbb9\udfea"/>
+<string value="\udbb9\udfeb"/>
+<string value="\udbb9\udfec"/>
+<string value="\udbb9\udfed"/>
+<string value="\udbb9\udfee"/>
+<string value="\udbb9\udfef"/>
+<string value="\udbb9\udff0"/>
+<string value="\udbb9\udff1"/>
+<string value="\udbb9\udff2"/>
+<string value="\udbb9\udff3"/>
+<string value="\udbb9\udff4"/>
+<string value="\udbb9\udff5"/>
+<string value="\udbb9\udff6"/>
+<string value="\udbb9\udff7"/>
+<string value="\udbb9\udff8"/>
+<string value="\udbb9\udff9"/>
+<string value="\udbb9\udffa"/>
+<string value="\udbb9\udffb"/>
+<string value="\udbb9\udffc"/>
+<string value="\udbb9\udffd"/>
+<string value="\udbb9\udffe"/>
+<string value="\udbb9\udfff"/>
+<string value="\udbba\udc00"/>
+<string value="\udbba\udc01"/>
+<string value="\udbba\udc02"/>
+<string value="\udbba\udc03"/>
+<string value="\udbba\udc04"/>
+<string value="\udbba\udc05"/>
+<string value="\udbba\udc06"/>
+<string value="\udbba\udc07"/>
+<string value="\udbba\udc08"/>
+<string value="\udbba\udc09"/>
+<string value="\udbba\udc0a"/>
+<string value="\udbba\udc0b"/>
+<string value="\udbba\udc0c"/>
+<string value="\udbba\udc0d"/>
+<string value="\udbba\udc0e"/>
+<string value="\udbba\udc0f"/>
+<string value="\udbba\udc10"/>
+<string value="\udbba\udc11"/>
+<string value="\udbba\udc12"/>
+<string value="\udbba\udc13"/>
+<string value="\udbba\udc14"/>
+<string value="\udbba\udc15"/>
+<string value="\udbba\udc16"/>
+<string value="\udbba\udc17"/>
+<string value="\udbba\udc18"/>
+<string value="\udbba\udc19"/>
+<string value="\udbba\udc1a"/>
+<string value="\udbba\udc1b"/>
+<string value="\udbba\udc1c"/>
+<string value="\udbba\udc1d"/>
+<string value="\udbba\udc1e"/>
+<string value="\udbba\udc1f"/>
+<string value="\udbba\udc20"/>
+<string value="\udbba\udc21"/>
+<string value="\udbba\udc22"/>
+<string value="\udbba\udc23"/>
+<string value="\udbba\udc24"/>
+<string value="\udbba\udc25"/>
+<string value="\udbba\udc26"/>
+<string value="\udbba\udc27"/>
+<string value="\udbba\udc28"/>
+<string value="\udbba\udc29"/>
+<string value="\udbba\udc2a"/>
+<string value="\udbba\udc2b"/>
+<string value="\udbba\udc2c"/>
+<string value="\udbba\udc2d"/>
+<string value="\udbba\udc2e"/>
+<string value="\udbba\udc2f"/>
+<string value="\udbba\udc30"/>
+<string value="\udbba\udc31"/>
+<string value="\udbba\udc32"/>
+<string value="\udbba\udc33"/>
+<string value="\udbba\udc34"/>
+<string value="\udbba\udc35"/>
+<string value="\udbba\udc36"/>
+<string value="\udbba\udc37"/>
+<string value="\udbba\udc38"/>
+<string value="\udbba\udc39"/>
+<string value="\udbba\udc3a"/>
+<string value="\udbba\udc3b"/>
+<string value="\udbba\udc3c"/>
+<string value="\udbba\udd60"/>
+<string value="\udbba\udd61"/>
+<string value="\udbba\udd62"/>
+<string value="\udbba\udd63"/>
+<string value="\udbba\udd64"/>
+<string value="\udbba\udd65"/>
+<string value="\udbba\udd66"/>
+<string value="\udbba\udd67"/>
+<string value="\udbba\udd68"/>
+<string value="\udbba\udd69"/>
+<string value="\udbba\udd6a"/>
+<string value="\udbba\udd6b"/>
+<string value="\udbba\udd6c"/>
+<string value="\udbba\udd6d"/>
+<string value="\udbba\udd6e"/>
+<string value="\udbba\udd6f"/>
+<string value="\udbba\udd70"/>
+<string value="\udbba\udd71"/>
+<string value="\udbba\udd72"/>
+<string value="\udbba\udd73"/>
+<string value="\udbba\udd74"/>
+<string value="\udbba\udd75"/>
+<string value="\udbba\udd76"/>
+<string value="\udbba\udd77"/>
+<string value="\udbba\udd78"/>
+<string value="\udbba\udd79"/>
+<string value="\udbba\udd7a"/>
+<string value="\udbba\udd7b"/>
+<string value="\udbba\udd7c"/>
+<string value="\udbba\udd7d"/>
+<string value="\udbba\udd7e"/>
+<string value="\udbba\udd7f"/>
+<string value="\udbba\udd80"/>
+<string value="\udbba\udd81"/>
+<string value="\udbba\udd82"/>
+<string value="\udbba\udd83"/>
+<string value="\udbba\udd84"/>
+<string value="\udbba\udd85"/>
+<string value="\udbba\udd86"/>
+<string value="\udbba\udd87"/>
+<string value="\udbba\udd88"/>
+<string value="\udbba\udef0"/>
+<string value="\udbba\udef1"/>
+<string value="\udbba\udef2"/>
+<string value="\udbba\udef3"/>
+<string value="\udbba\udef4"/>
+<string value="\udbba\udef5"/>
+<string value="\udbba\udef6"/>
+<string value="\udbba\udef7"/>
+<string value="\udbba\udef8"/>
+<string value="\udbba\udef9"/>
+<string value="\udbba\udefa"/>
+<string value="\udbba\udefb"/>
+<string value="\udbba\udefc"/>
+<string value="\udbba\udefd"/>
+<string value="\udbba\udefe"/>
+<string value="\udbba\udeff"/>
+<string value="\udbba\udf00"/>
+<string value="\udbba\udf01"/>
+<string value="\udbba\udf02"/>
+<string value="\udbba\udf03"/>
+<string value="\udbba\udf04"/>
+<string value="\udbba\udf05"/>
+<string value="\udbba\udf06"/>
+<string value="\udbba\udf07"/>
+<string value="\udbba\udf08"/>
+<string value="\udbba\udf09"/>
+<string value="\udbba\udf0a"/>
+<string value="\udbba\udf0b"/>
+<string value="\udbba\udf0c"/>
+<string value="\udbba\udf0d"/>
+<string value="\udbba\udf0e"/>
+<string value="\udbba\udf0f"/>
+<string value="\udbba\udf10"/>
+<string value="\udbba\udf11"/>
+<string value="\udbba\udf12"/>
+<string value="\udbba\udf13"/>
+<string value="\udbba\udf14"/>
+<string value="\udbba\udf15"/>
+<string value="\udbba\udf16"/>
+<string value="\udbba\udf17"/>
+<string value="\udbba\udf18"/>
+<string value="\udbba\udf19"/>
+<string value="\udbba\udf1a"/>
+<string value="\udbba\udf1b"/>
+<string value="\udbba\udf1c"/>
+<string value="\udbba\udf1d"/>
+<string value="\udbba\udf1e"/>
+<string value="\udbba\udf1f"/>
+<string value="\udbba\udf20"/>
+<string value="\udbba\udf21"/>
+<string value="\udbba\udf22"/>
+<string value="\udbba\udf23"/>
+<string value="\udbba\udf24"/>
+<string value="\udbba\udf25"/>
+<string value="\udbba\udf26"/>
+<string value="\udbba\udf27"/>
+<string value="\udbba\udf28"/>
+<string value="\udbba\udf29"/>
+<string value="\udbba\udf2a"/>
+<string value="\udbba\udf2b"/>
+<string value="\udbba\udf2c"/>
+<string value="\udbba\udf2d"/>
+<string value="\udbba\udf2e"/>
+<string value="\udbba\udf2f"/>
+<string value="\udbba\udf30"/>
+<string value="\udbba\udf31"/>
+<string value="\udbba\udf32"/>
+<string value="\udbba\udf33"/>
+<string value="\udbba\udf34"/>
+<string value="\udbba\udf35"/>
+<string value="\udbba\udf36"/>
+<string value="\udbba\udf37"/>
+<string value="\udbba\udf38"/>
+<string value="\udbba\udf39"/>
+<string value="\udbba\udf3a"/>
+<string value="\udbba\udf3b"/>
+<string value="\udbba\udf3c"/>
+<string value="\udbba\udf3d"/>
+<string value="\udbba\udf3e"/>
+<string value="\udbba\udf3f"/>
+<string value="\udbba\udf40"/>
+<string value="\udbba\udf41"/>
+<string value="\udbba\udf42"/>
+<string value="\udbba\udf43"/>
+<string value="\udbba\udf44"/>
+<string value="\udbba\udf45"/>
+<string value="\udbba\udf46"/>
+<string value="\udbba\udf47"/>
+<string value="\udbba\udf48"/>
+<string value="\udbba\udf49"/>
+<string value="\udbba\udf4a"/>
+<string value="\udbba\udf4b"/>
+<string value="\udbba\udf4c"/>
+<string value="\udbba\udf4d"/>
+<string value="\udbba\udf4e"/>
+<string value="\udbba\udf4f"/>
+<string value="\udbba\udf50"/>
+<string value="\udbba\udf51"/>
+<string value="\udbba\udf52"/>
+<string value="\udbba\udf53"/>
+<string value="\udbba\udf54"/>
+<string value="\udbba\udf55"/>
+<string value="\udbba\udf56"/>
+<string value="\udbba\udf57"/>
+<string value="\udbba\udf58"/>
+<string value="\udbba\udf59"/>
+<string value="\udbba\udf5a"/>
+<string value="\udbba\udf5b"/>
+<string value="\udbba\udf5c"/>
+<string value="\udbba\udf5d"/>
+<string value="\udbba\udf5e"/>
+<string value="\udbba\udf5f"/>
+<string value="\udbba\udf60"/>
+<string value="\udbba\udf61"/>
+<string value="\udbba\udf62"/>
+<string value="\udbba\udf63"/>
+<string value="\udbba\udf64"/>
+<string value="\udbba\udf65"/>
+<string value="\udbba\udf66"/>
+<string value="\udbba\udf67"/>
+<string value="\udbba\udf68"/>
+<string value="\udbba\udf69"/>
+<string value="\udbba\udf6a"/>
+<string value="\udbba\udf6b"/>
+<string value="\udbba\udf6c"/>
+<string value="\udbba\udf6d"/>
+<string value="\udbba\udf6e"/>
+<string value="\udbba\udf6f"/>
+<string value="\udbba\udf70"/>
+<string value="\udbba\udf71"/>
+<string value="\udbba\udf72"/>
+<string value="\udbba\udf73"/>
+<string value="\udbba\udf74"/>
+<string value="\udbba\udf75"/>
+<string value="\udbba\udf76"/>
+<string value="\udbba\udf77"/>
+<string value="\udbba\udf78"/>
+<string value="\udbba\udf79"/>
+<string value="\udbba\udf7a"/>
+<string value="\udbba\udf7b"/>
+<string value="\udbba\udf7c"/>
+<string value="\udbba\udf7d"/>
+<string value="\udbba\udf7e"/>
+<string value="\udbba\udf7f"/>
+<string value="\udbba\udf80"/>
+<string value="\udbba\udf81"/>
+<string value="\udbba\udf82"/>
+<string value="\udbba\udf83"/>
+<string value="\udbba\udf84"/>
+<string value="\udbba\udf85"/>
+<string value="\udbba\udf86"/>
+<string value="\udbba\udf87"/>
+<string value="\udbba\udf88"/>
+<string value="\udbba\udf89"/>
+<string value="\udbba\udf8a"/>
+<string value="\udbba\udf8b"/>
+<string value="\udbba\udf8c"/>
+<string value="\udbba\udf8d"/>
+<string value="\udbba\udf8e"/>
+<string value="\udbba\udf8f"/>
+<string value="\udbba\udf90"/>
+<string value="\udbba\udf91"/>
+<string value="\udbba\udf92"/>
+<string value="\udbba\udf93"/>
+<string value="\udbba\udf94"/>
+<string value="\udbba\udf95"/>
+<string value="\udbba\udf96"/>
+<string value="\udbba\udf97"/>
+<string value="\udbba\udf98"/>
+<string value="\udbba\udf99"/>
+<string value="\udbba\udf9a"/>
+<string value="\udbba\udf9b"/>
+<string value="\udbba\udf9c"/>
+<string value="\udbba\udf9d"/>
+<string value="\udbba\udf9e"/>
+<string value="\udbba\udf9f"/>
+<string value="\udbba\udfa0"/>
+<string value="\udbba\udfa1"/>
+<string value="\udbba\udfa2"/>
+<string value="\udbbb\ude10"/>
+<string value="\udbbb\ude11"/>
+<string value="\udbbb\ude12"/>
+<string value="\udbbb\ude13"/>
+<string value="\udbbb\ude14"/>
+<string value="\udbbb\ude15"/>
+<string value="\udbbb\ude16"/>
+<string value="\udbbb\ude17"/>
+<string value="\udbbb\ude18"/>
+<string value="\udbbb\ude19"/>
+<string value="\udbbb\ude1a"/>
+<string value="\udbbb\ude1b"/>
+<string value="\udbbb\ude1c"/>
+<string value="\udbbb\ude1d"/>
+<string value="\udbbb\ude1e"/>
+<string value="\udbbb\ude1f"/>
+<string value="\udbbb\ude20"/>
+<string value="\udbbb\ude21"/>
+<string value="\udbbb\ude22"/>
+<string value="\udbbb\ude23"/>
+<string value="\udbbb\ude24"/>
+<string value="\udbbb\ude25"/>
+<string value="\udbbb\ude26"/>
+<string value="\udbbb\ude27"/>
+<string value="\udbbb\ude28"/>
+<string value="\udbbb\ude29"/>
+<string value="\udbbb\ude2a"/>
+<string value="\udbbb\ude2b"/>
+<string value="\udbbb\ude2c"/>
+<string value="\udbbb\ude2d"/>
+<string value="\udbbb\ude2e"/>
+<string value="\udbbb\ude2f"/>
+<string value="\udbbb\ude30"/>
+<string value="\udbbb\ude31"/>
+<string value="\udbbb\ude32"/>
+<string value="\udbbb\ude33"/>
+<string value="\udbbb\ude40"/>
+<string value="\udbbb\ude41"/>
+<string value="\udbbb\ude42"/>
+<string value="\udbbb\ude43"/>
+<string value="\udbbb\ude44"/>
+<string value="\udbbb\ude45"/>
+<string value="\udbbb\ude46"/>
+<string value="\udbbb\ude47"/>
+<string value="\udbbb\ude48"/>
+<string value="\udbbb\ude49"/>
+<string value="\udbbb\ude4a"/>
+<string value="\udbbb\ude70"/>
+<string value="\udbbb\ude71"/>
+<string value="\udbbb\ude72"/>
+<string value="\udbbb\ude73"/>
+<string value="\udbbb\ude74"/>
+<string value="\udbbb\ude75"/>
+<string value="\udbbb\ude76"/>
+<string value="\udbbb\ude77"/>
+<string value="\udbbb\ude78"/>
+<string value="\udbbb\ude79"/>
+<string value="\udbbb\ude7a"/>
+<string value="\udbbb\ude7b"/>
+<string value="\udbbb\ude7c"/>
+<string value="\udbbb\ude7d"/>
+<string value="\udbbb\udea0"/>
+</keystring>
diff --git a/res/xml/symbols_japan_emoji_list1.xml b/res/xml/symbols_japan_emoji_list1.xml
new file mode 100644
index 0000000..f7506c5
--- /dev/null
+++ b/res/xml/symbols_japan_emoji_list1.xml
@@ -0,0 +1,285 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--symbols -->
+<keystring>
+<!-- 1. Nature -->
+<!-- Weather -->
+<string value="\udbb8\udc00"/>
+<string value="\udbb8\udc01"/>
+<string value="\udbb8\udc02"/>
+<string value="\udbb8\udc03"/>
+<string value="\udbb8\udc04"/>
+<string value="\udbb8\udc05"/>
+<string value="\udbb8\udc06"/>
+<string value="\udbb8\udc07"/>
+<string value="\udbb8\udc08"/>
+<string value="\udbb8\udc09"/>
+<string value="\udbb8\udc0a"/>
+<string value="\udbb8\udc0b"/>
+<string value="\udbb8\udc0c"/>
+<string value="\udbb8\udc0d"/>
+<string value="\udbb8\udc0e"/>
+<string value="\udbb8\udc0f"/>
+<string value="\udbb8\udc10"/>
+<!-- Moon -->
+<string value="\udbb8\udc11"/>
+<string value="\udbb8\udc12"/>
+<string value="\udbb8\udc13"/>
+<string value="\udbb8\udc14"/>
+<string value="\udbb8\udc15"/>
+<string value="\udbb8\udc16"/>
+<string value="\udbb8\udc17"/>
+<!-- Time -->
+<string value="\udbb8\udc18"/>
+<string value="\udbb8\udc19"/>
+<string value="\udbb8\udc1a"/>
+<string value="\udbb8\udc1b"/>
+<string value="\udbb8\udc1c"/>
+<string value="\udbb8\udc1d"/>
+<string value="\udbb8\udc1e"/>
+<string value="\udbb8\udc1f"/>
+<string value="\udbb8\udc20"/>
+<string value="\udbb8\udc21"/>
+<string value="\udbb8\udc22"/>
+<string value="\udbb8\udc23"/>
+<string value="\udbb8\udc24"/>
+<string value="\udbb8\udc25"/>
+<string value="\udbb8\udc26"/>
+<string value="\udbb8\udc27"/>
+<string value="\udbb8\udc28"/>
+<string value="\udbb8\udc29"/>
+<string value="\udbb8\udc2a"/>
+<!-- Zodiacal Symbols -->
+<string value="\udbb8\udc2b"/>
+<string value="\udbb8\udc2c"/>
+<string value="\udbb8\udc2d"/>
+<string value="\udbb8\udc2e"/>
+<string value="\udbb8\udc2f"/>
+<string value="\udbb8\udc30"/>
+<string value="\udbb8\udc31"/>
+<string value="\udbb8\udc32"/>
+<string value="\udbb8\udc33"/>
+<string value="\udbb8\udc34"/>
+<string value="\udbb8\udc35"/>
+<string value="\udbb8\udc36"/>
+<string value="\udbb8\udc37"/>
+<!-- Places in Nature -->
+<string value="\udbb8\udc38"/>
+<string value="\udbb8\udc39"/>
+<string value="\udbb8\udc3a"/>
+<string value="\udbb8\udc3b"/>
+<!-- Plants -->
+<string value="\udbb8\udc3c"/>
+<string value="\udbb8\udc3d"/>
+<string value="\udbb8\udc3e"/>
+<string value="\udbb8\udc3f"/>
+<string value="\udbb8\udc40"/>
+<string value="\udbb8\udc41"/>
+<string value="\udbb8\udc42"/>
+<string value="\udbb8\udc43"/>
+<string value="\udbb8\udc44"/>
+<string value="\udbb8\udc45"/>
+<string value="\udbb8\udc46"/>
+<string value="\udbb8\udc47"/>
+<string value="\udbb8\udc48"/>
+<string value="\udbb8\udc49"/>
+<string value="\udbb8\udc4a"/>
+<string value="\udbb8\udc4b"/>
+<string value="\udbb8\udc4c"/>
+<string value="\udbb8\udc4d"/>
+<string value="\udbb8\udc4e"/>
+<!-- Fruits -->
+<string value="\udbb8\udc4f"/>
+<string value="\udbb8\udc50"/>
+<string value="\udbb8\udc51"/>
+<string value="\udbb8\udc52"/>
+<string value="\udbb8\udc53"/>
+<string value="\udbb8\udc54"/>
+<string value="\udbb8\udc55"/>
+<string value="\udbb8\udc56"/>
+<string value="\udbb8\udc57"/>
+<string value="\udbb8\udc58"/>
+<string value="\udbb8\udc59"/>
+<string value="\udbb8\udc5a"/>
+<string value="\udbb8\udc5b"/>
+<!-- 2. Human/Living Things -->
+<!-- Facial Parts -->
+<string value="\udbb8\udd90"/>
+<string value="\udbb8\udd91"/>
+<string value="\udbb8\udd92"/>
+<string value="\udbb8\udd93"/>
+<string value="\udbb8\udd94"/>
+<!-- Personal Care -->
+<string value="\udbb8\udd95"/>
+<string value="\udbb8\udd96"/>
+<string value="\udbb8\udd97"/>
+<string value="\udbb8\udd98"/>
+<string value="\udbb8\udd99"/>
+<!-- People / Personalities -->
+<string value="\udbb8\udd9a"/>
+<string value="\udbb8\udd9b"/>
+<string value="\udbb8\udd9c"/>
+<string value="\udbb8\udd9d"/>
+<string value="\udbb8\udd9e"/>
+<string value="\udbb8\udd9f"/>
+<string value="\udbb8\udda0"/>
+<string value="\udbb8\udda1"/>
+<string value="\udbb8\udda2"/>
+<string value="\udbb8\udda3"/>
+<string value="\udbb8\udda4"/>
+<string value="\udbb8\udda5"/>
+<string value="\udbb8\udda6"/>
+<string value="\udbb8\udda7"/>
+<string value="\udbb8\udda8"/>
+<string value="\udbb8\udda9"/>
+<string value="\udbb8\uddaa"/>
+<string value="\udbb8\uddab"/>
+<string value="\udbb8\uddac"/>
+<string value="\udbb8\uddad"/>
+<string value="\udbb8\uddae"/>
+<string value="\udbb8\uddaf"/>
+<string value="\udbb8\uddb0"/>
+<string value="\udbb8\uddb1"/>
+<string value="\udbb8\uddb2"/>
+<string value="\udbb8\uddb3"/>
+<string value="\udbb8\uddb4"/>
+<string value="\udbb8\uddb5"/>
+<string value="\udbb8\uddb6"/>
+<!-- Animals -->
+<string value="\udbb8\uddb7"/>
+<string value="\udbb8\uddb8"/>
+<string value="\udbb8\uddb9"/>
+<string value="\udbb8\uddba"/>
+<string value="\udbb8\uddbb"/>
+<string value="\udbb8\uddbc"/>
+<string value="\udbb8\uddbd"/>
+<string value="\udbb8\uddbe"/>
+<string value="\udbb8\uddbf"/>
+<string value="\udbb8\uddc0"/>
+<string value="\udbb8\uddc1"/>
+<string value="\udbb8\uddc2"/>
+<string value="\udbb8\uddc3"/>
+<string value="\udbb8\uddc4"/>
+<string value="\udbb8\uddc5"/>
+<string value="\udbb8\uddc6"/>
+<string value="\udbb8\uddc7"/>
+<string value="\udbb8\uddc8"/>
+<string value="\udbb8\uddc9"/>
+<string value="\udbb8\uddca"/>
+<string value="\udbb8\uddcb"/>
+<string value="\udbb8\uddcc"/>
+<string value="\udbb8\uddcd"/>
+<string value="\udbb8\uddce"/>
+<string value="\udbb8\uddcf"/>
+<string value="\udbb8\uddd0"/>
+<string value="\udbb8\uddd1"/>
+<string value="\udbb8\uddd2"/>
+<string value="\udbb8\uddd3"/>
+<string value="\udbb8\uddd4"/>
+<string value="\udbb8\uddd5"/>
+<string value="\udbb8\uddd6"/>
+<string value="\udbb8\uddd7"/>
+<string value="\udbb8\uddd8"/>
+<string value="\udbb8\uddd9"/>
+<string value="\udbb8\uddda"/>
+<string value="\udbb8\udddb"/>
+<string value="\udbb8\udddc"/>
+<string value="\udbb8\udddd"/>
+<string value="\udbb8\uddde"/>
+<string value="\udbb8\udddf"/>
+<string value="\udbb8\udde0"/>
+<string value="\udbb8\udde1"/>
+<string value="\udbb8\udde2"/>
+<string value="\udbb8\udde3"/>
+<!-- 3. Faces and Smiley's -->
+<!-- Faces -->
+<string value="\udbb8\udf20"/>
+<string value="\udbb8\udf21"/>
+<string value="\udbb8\udf22"/>
+<string value="\udbb8\udf23"/>
+<string value="\udbb8\udf24"/>
+<string value="\udbb8\udf25"/>
+<string value="\udbb8\udf26"/>
+<string value="\udbb8\udf27"/>
+<string value="\udbb8\udf28"/>
+<string value="\udbb8\udf29"/>
+<string value="\udbb8\udf2a"/>
+<string value="\udbb8\udf2b"/>
+<string value="\udbb8\udf2c"/>
+<string value="\udbb8\udf2d"/>
+<string value="\udbb8\udf2e"/>
+<string value="\udbb8\udf2f"/>
+<string value="\udbb8\udf30"/>
+<string value="\udbb8\udf31"/>
+<string value="\udbb8\udf32"/>
+<string value="\udbb8\udf33"/>
+<string value="\udbb8\udf34"/>
+<string value="\udbb8\udf35"/>
+<string value="\udbb8\udf36"/>
+<string value="\udbb8\udf37"/>
+<string value="\udbb8\udf38"/>
+<string value="\udbb8\udf39"/>
+<string value="\udbb8\udf3a"/>
+<string value="\udbb8\udf3b"/>
+<string value="\udbb8\udf3c"/>
+<string value="\udbb8\udf3d"/>
+<string value="\udbb8\udf3e"/>
+<string value="\udbb8\udf3f"/>
+<string value="\udbb8\udf40"/>
+<string value="\udbb8\udf41"/>
+<string value="\udbb8\udf42"/>
+<string value="\udbb8\udf43"/>
+<string value="\udbb8\udf44"/>
+<string value="\udbb8\udf45"/>
+<string value="\udbb8\udf46"/>
+<string value="\udbb8\udf47"/>
+<!-- More faces (animals, persons, characters) -->
+<string value="\udbb8\udf48"/>
+<string value="\udbb8\udf49"/>
+<string value="\udbb8\udf4a"/>
+<string value="\udbb8\udf4b"/>
+<string value="\udbb8\udf4c"/>
+<string value="\udbb8\udf4d"/>
+<string value="\udbb8\udf4e"/>
+<string value="\udbb8\udf4f"/>
+<string value="\udbb8\udf50"/>
+<string value="\udbb8\udf51"/>
+<string value="\udbb8\udf52"/>
+<string value="\udbb8\udf53"/>
+<string value="\udbb8\udf54"/>
+<string value="\udbb8\udf55"/>
+<string value="\udbb8\udf56"/>
+<string value="\udbb8\udf57"/>
+<string value="\udbb8\udf58"/>
+<string value="\udbb8\udf59"/>
+<string value="\udbb8\udf5a"/>
+<string value="\udbb8\udf5b"/>
+<string value="\udbb8\udf5c"/>
+<string value="\udbb8\udf5d"/>
+<string value="\udbb8\udf5e"/>
+<string value="\udbb8\udf5f"/>
+<string value="\udbb8\udf60"/>
+<string value="\udbb8\udf61"/>
+<string value="\udbb8\udf62"/>
+<string value="\udbb8\udf63"/>
+<string value="\udbb8\udf64"/>
+<string value="\udbb8\udf65"/>
+<string value="\udbb8\udf66"/>
+<string value="\udbb8\udf67"/>
+<string value="\udbb8\udf68"/>
+<string value="\udbb8\udf69"/>
+</keystring>
diff --git a/res/xml/symbols_japan_emoji_list2.xml b/res/xml/symbols_japan_emoji_list2.xml
new file mode 100644
index 0000000..10bdaf9
--- /dev/null
+++ b/res/xml/symbols_japan_emoji_list2.xml
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--symbols -->
+<keystring>
+<!-- 6. Foods -->
+<!-- Prepared Food -->
+<string value="\udbba\udd60"/>
+<string value="\udbba\udd61"/>
+<string value="\udbba\udd62"/>
+<string value="\udbba\udd63"/>
+<string value="\udbba\udd64"/>
+<string value="\udbba\udd65"/>
+<string value="\udbba\udd66"/>
+<string value="\udbba\udd67"/>
+<string value="\udbba\udd68"/>
+<string value="\udbba\udd69"/>
+<string value="\udbba\udd6a"/>
+<string value="\udbba\udd6b"/>
+<string value="\udbba\udd6c"/>
+<string value="\udbba\udd6d"/>
+<string value="\udbba\udd6e"/>
+<string value="\udbba\udd6f"/>
+<string value="\udbba\udd70"/>
+<string value="\udbba\udd71"/>
+<string value="\udbba\udd72"/>
+<string value="\udbba\udd73"/>
+<string value="\udbba\udd74"/>
+<string value="\udbba\udd75"/>
+<string value="\udbba\udd76"/>
+<string value="\udbba\udd77"/>
+<string value="\udbba\udd78"/>
+<string value="\udbba\udd79"/>
+<string value="\udbba\udd7a"/>
+<string value="\udbba\udd7b"/>
+<string value="\udbba\udd7c"/>
+<string value="\udbba\udd7d"/>
+<string value="\udbba\udd7e"/>
+<string value="\udbba\udd7f"/>
+<string value="\udbba\udd80"/>
+<!-- Drink -->
+<string value="\udbba\udd81"/>
+<string value="\udbba\udd82"/>
+<string value="\udbba\udd83"/>
+<string value="\udbba\udd84"/>
+<string value="\udbba\udd85"/>
+<string value="\udbba\udd86"/>
+<string value="\udbba\udd87"/>
+<string value="\udbba\udd88"/>
+<!-- 7. Abstract Concepts -->
+<!-- Arrows -->
+<string value="\udbba\udef0"/>
+<string value="\udbba\udef1"/>
+<string value="\udbba\udef2"/>
+<string value="\udbba\udef3"/>
+<string value="\udbba\udef4"/>
+<string value="\udbba\udef5"/>
+<string value="\udbba\udef6"/>
+<string value="\udbba\udef7"/>
+<string value="\udbba\udef8"/>
+<string value="\udbba\udef9"/>
+<string value="\udbba\udefa"/>
+<string value="\udbba\udefb"/>
+<string value="\udbba\udefc"/>
+<string value="\udbba\udefd"/>
+<string value="\udbba\udefe"/>
+<string value="\udbba\udeff"/>
+<string value="\udbba\udf00"/>
+<string value="\udbba\udf01"/>
+<string value="\udbba\udf02"/>
+<string value="\udbba\udf03"/>
+<!-- Punctuation -->
+<string value="\udbba\udf04"/>
+<string value="\udbba\udf05"/>
+<string value="\udbba\udf06"/>
+<string value="\udbba\udf07"/>
+<string value="\udbba\udf08"/>
+<string value="\udbba\udf09"/>
+<string value="\udbba\udf0a"/>
+<string value="\udbba\udf0b"/>
+<!-- Hearts -->
+<string value="\udbba\udf0c"/>
+<string value="\udbba\udf0d"/>
+<string value="\udbba\udf0e"/>
+<string value="\udbba\udf0f"/>
+<string value="\udbba\udf10"/>
+<string value="\udbba\udf11"/>
+<string value="\udbba\udf12"/>
+<string value="\udbba\udf13"/>
+<string value="\udbba\udf14"/>
+<string value="\udbba\udf15"/>
+<string value="\udbba\udf16"/>
+<string value="\udbba\udf17"/>
+<string value="\udbba\udf18"/>
+<string value="\udbba\udf19"/>
+<!-- Cards -->
+<string value="\udbba\udf1a"/>
+<string value="\udbba\udf1b"/>
+<string value="\udbba\udf1c"/>
+<string value="\udbba\udf1d"/>
+<!-- Letter Signs and other Signs -->
+<string value="\udbba\udf1e"/>
+<string value="\udbba\udf1f"/>
+<string value="\udbba\udf20"/>
+<string value="\udbba\udf21"/>
+<string value="\udbba\udf22"/>
+<string value="\udbba\udf23"/>
+<string value="\udbba\udf24"/>
+<string value="\udbba\udf25"/>
+<string value="\udbba\udf26"/>
+<string value="\udbba\udf27"/>
+<string value="\udbba\udf28"/>
+<string value="\udbba\udf29"/>
+<string value="\udbba\udf2a"/>
+<string value="\udbba\udf2b"/>
+<string value="\udbba\udf2c"/>
+<string value="\udbba\udf2d"/>
+<string value="\udbba\udf2e"/>
+<string value="\udbba\udf2f"/>
+<string value="\udbba\udf30"/>
+<string value="\udbba\udf31"/>
+<string value="\udbba\udf32"/>
+<string value="\udbba\udf33"/>
+<string value="\udbba\udf34"/>
+<string value="\udbba\udf35"/>
+<string value="\udbba\udf36"/>
+<string value="\udbba\udf37"/>
+<string value="\udbba\udf38"/>
+<string value="\udbba\udf39"/>
+<string value="\udbba\udf3a"/>
+<string value="\udbba\udf3b"/>
+<string value="\udbba\udf3c"/>
+<string value="\udbba\udf3d"/>
+<string value="\udbba\udf3e"/>
+<string value="\udbba\udf3f"/>
+<string value="\udbba\udf40"/>
+<string value="\udbba\udf41"/>
+<string value="\udbba\udf42"/>
+<string value="\udbba\udf43"/>
+<string value="\udbba\udf44"/>
+<string value="\udbba\udf45"/>
+<string value="\udbba\udf46"/>
+<string value="\udbba\udf47"/>
+<string value="\udbba\udf48"/>
+<string value="\udbba\udf49"/>
+<string value="\udbba\udf4a"/>
+<string value="\udbba\udf4b"/>
+<string value="\udbba\udf4c"/>
+<string value="\udbba\udf4d"/>
+<string value="\udbba\udf4e"/>
+<string value="\udbba\udf4f"/>
+<string value="\udbba\udf50"/>
+<!-- Arithmetic Operators -->
+<string value="\udbba\udf51"/>
+<string value="\udbba\udf52"/>
+<string value="\udbba\udf53"/>
+<string value="\udbba\udf54"/>
+<!-- Emotion Symbols -->
+<string value="\udbba\udf55"/>
+<string value="\udbba\udf56"/>
+<string value="\udbba\udf57"/>
+<string value="\udbba\udf58"/>
+<string value="\udbba\udf59"/>
+<string value="\udbba\udf5a"/>
+<string value="\udbba\udf5b"/>
+<string value="\udbba\udf5c"/>
+<string value="\udbba\udf5d"/>
+<string value="\udbba\udf5e"/>
+<string value="\udbba\udf5f"/>
+<!-- Shapes / Sparkles -->
+<string value="\udbba\udf60"/>
+<string value="\udbba\udf61"/>
+<string value="\udbba\udf62"/>
+<string value="\udbba\udf63"/>
+<string value="\udbba\udf64"/>
+<string value="\udbba\udf65"/>
+<string value="\udbba\udf66"/>
+<string value="\udbba\udf67"/>
+<string value="\udbba\udf68"/>
+<string value="\udbba\udf69"/>
+<string value="\udbba\udf6a"/>
+<string value="\udbba\udf6b"/>
+<string value="\udbba\udf6c"/>
+<string value="\udbba\udf6d"/>
+<string value="\udbba\udf6e"/>
+<string value="\udbba\udf6f"/>
+<string value="\udbba\udf70"/>
+<string value="\udbba\udf71"/>
+<string value="\udbba\udf72"/>
+<string value="\udbba\udf73"/>
+<string value="\udbba\udf74"/>
+<string value="\udbba\udf75"/>
+<string value="\udbba\udf76"/>
+<string value="\udbba\udf77"/>
+<string value="\udbba\udf78"/>
+<string value="\udbba\udf79"/>
+<!-- School -->
+<string value="\udbba\udf7a"/>
+<string value="\udbba\udf7b"/>
+<string value="\udbba\udf7c"/>
+<string value="\udbba\udf7d"/>
+<string value="\udbba\udf7e"/>
+<string value="\udbba\udf7f"/>
+<string value="\udbba\udf80"/>
+<!-- Internet Specific -->
+<string value="\udbba\udf81"/>
+<string value="\udbba\udf82"/>
+<string value="\udbba\udf83"/>
+<string value="\udbba\udf84"/>
+<string value="\udbba\udf85"/>
+<string value="\udbba\udf86"/>
+<string value="\udbba\udf87"/>
+<string value="\udbba\udf88"/>
+<string value="\udbba\udf89"/>
+<string value="\udbba\udf8a"/>
+<string value="\udbba\udf8b"/>
+<string value="\udbba\udf8c"/>
+<string value="\udbba\udf8d"/>
+<string value="\udbba\udf8e"/>
+<string value="\udbba\udf8f"/>
+<string value="\udbba\udf90"/>
+<string value="\udbba\udf91"/>
+<string value="\udbba\udf92"/>
+<!-- Hand Signals -->
+<string value="\udbba\udf93"/>
+<string value="\udbba\udf94"/>
+<string value="\udbba\udf95"/>
+<string value="\udbba\udf96"/>
+<string value="\udbba\udf97"/>
+<string value="\udbba\udf98"/>
+<string value="\udbba\udf99"/>
+<string value="\udbba\udf9a"/>
+<string value="\udbba\udf9b"/>
+<string value="\udbba\udf9c"/>
+<string value="\udbba\udf9d"/>
+<string value="\udbba\udf9e"/>
+<string value="\udbba\udf9f"/>
+<string value="\udbba\udfa0"/>
+<string value="\udbba\udfa1"/>
+<string value="\udbba\udfa2"/>
+<!-- 8. Business logos/symbols -->
+<!-- DoCoMo specific -->
+<string value="\udbbb\ude10"/>
+<string value="\udbbb\ude11"/>
+<string value="\udbbb\ude12"/>
+<string value="\udbbb\ude13"/>
+<string value="\udbbb\ude14"/>
+<string value="\udbbb\ude15"/>
+<string value="\udbbb\ude16"/>
+<string value="\udbbb\ude17"/>
+<string value="\udbbb\ude18"/>
+<string value="\udbbb\ude19"/>
+<string value="\udbbb\ude1a"/>
+<string value="\udbbb\ude1b"/>
+<string value="\udbbb\ude1c"/>
+<string value="\udbbb\ude1d"/>
+<string value="\udbbb\ude1e"/>
+<string value="\udbbb\ude1f"/>
+<string value="\udbbb\ude20"/>
+<string value="\udbbb\ude21"/>
+<string value="\udbbb\ude22"/>
+<string value="\udbbb\ude23"/>
+<string value="\udbbb\ude24"/>
+<string value="\udbbb\ude25"/>
+<string value="\udbbb\ude26"/>
+<string value="\udbbb\ude27"/>
+<string value="\udbbb\ude28"/>
+<string value="\udbbb\ude29"/>
+<string value="\udbbb\ude2a"/>
+<string value="\udbbb\ude2b"/>
+<string value="\udbbb\ude2c"/>
+<string value="\udbbb\ude2d"/>
+<string value="\udbbb\ude2e"/>
+<string value="\udbbb\ude2f"/>
+<string value="\udbbb\ude30"/>
+<string value="\udbbb\ude31"/>
+<string value="\udbbb\ude32"/>
+<string value="\udbbb\ude33"/>
+<!-- KDDI specific -->
+<string value="\udbbb\ude40"/>
+<string value="\udbbb\ude41"/>
+<string value="\udbbb\ude42"/>
+<string value="\udbbb\ude43"/>
+<string value="\udbbb\ude44"/>
+<string value="\udbbb\ude45"/>
+<string value="\udbbb\ude46"/>
+<string value="\udbbb\ude47"/>
+<string value="\udbbb\ude48"/>
+<string value="\udbbb\ude49"/>
+<string value="\udbbb\ude4a"/>
+<!-- Softbank specific -->
+<string value="\udbbb\ude70"/>
+<string value="\udbbb\ude71"/>
+<string value="\udbbb\ude72"/>
+<string value="\udbbb\ude73"/>
+<string value="\udbbb\ude74"/>
+<string value="\udbbb\ude75"/>
+<string value="\udbbb\ude76"/>
+<string value="\udbbb\ude77"/>
+<string value="\udbbb\ude78"/>
+<string value="\udbbb\ude79"/>
+<string value="\udbbb\ude7a"/>
+<string value="\udbbb\ude7b"/>
+<string value="\udbbb\ude7c"/>
+<string value="\udbbb\ude7d"/>
+<!-- Google specific -->
+<string value="\udbbb\udea0"/>
+</keystring>
diff --git a/res/xml/symbols_japan_emoji_list3.xml b/res/xml/symbols_japan_emoji_list3.xml
new file mode 100644
index 0000000..dbd0668
--- /dev/null
+++ b/res/xml/symbols_japan_emoji_list3.xml
@@ -0,0 +1,317 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--symbols -->
+<keystring>
+<!-- 4. Artifacts -->
+<!-- Buildings / Common Places -->
+<string value="\udbb9\udcb0"/>
+<string value="\udbb9\udcb1"/>
+<string value="\udbb9\udcb2"/>
+<string value="\udbb9\udcb3"/>
+<string value="\udbb9\udcb4"/>
+<string value="\udbb9\udcb5"/>
+<string value="\udbb9\udcb6"/>
+<string value="\udbb9\udcb7"/>
+<string value="\udbb9\udcb8"/>
+<string value="\udbb9\udcb9"/>
+<string value="\udbb9\udcba"/>
+<string value="\udbb9\udcbb"/>
+<string value="\udbb9\udcbc"/>
+<string value="\udbb9\udcbd"/>
+<string value="\udbb9\udcbe"/>
+<string value="\udbb9\udcbf"/>
+<string value="\udbb9\udcc0"/>
+<string value="\udbb9\udcc1"/>
+<string value="\udbb9\udcc2"/>
+<!-- Landmarks /Famous Places -->
+<string value="\udbb9\udcc3"/>
+<string value="\udbb9\udcc4"/>
+<string value="\udbb9\udcc5"/>
+<string value="\udbb9\udcc6"/>
+<string value="\udbb9\udcc7"/>
+<string value="\udbb9\udcc8"/>
+<!-- Tools -->
+<string value="\udbb9\udcc9"/>
+<string value="\udbb9\udcca"/>
+<string value="\udbb9\udccb"/>
+<!-- Clothing / Wearables -->
+<string value="\udbb9\udccc"/>
+<string value="\udbb9\udccd"/>
+<string value="\udbb9\udcce"/>
+<string value="\udbb9\udccf"/>
+<string value="\udbb9\udcd0"/>
+<string value="\udbb9\udcd1"/>
+<string value="\udbb9\udcd2"/>
+<string value="\udbb9\udcd3"/>
+<string value="\udbb9\udcd4"/>
+<string value="\udbb9\udcd5"/>
+<string value="\udbb9\udcd6"/>
+<string value="\udbb9\udcd7"/>
+<string value="\udbb9\udcd8"/>
+<string value="\udbb9\udcd9"/>
+<string value="\udbb9\udcda"/>
+<string value="\udbb9\udcdb"/>
+<!-- Money -->
+<string value="\udbb9\udcdc"/>
+<string value="\udbb9\udcdd"/>
+<string value="\udbb9\udcde"/>
+<string value="\udbb9\udcdf"/>
+<string value="\udbb9\udce0"/>
+<string value="\udbb9\udce1"/>
+<string value="\udbb9\udce2"/>
+<string value="\udbb9\udce3"/>
+<string value="\udbb9\udce4"/>
+<!-- Flags -->
+<string value="\udbb9\udce5"/>
+<string value="\udbb9\udce6"/>
+<string value="\udbb9\udce7"/>
+<string value="\udbb9\udce8"/>
+<string value="\udbb9\udce9"/>
+<string value="\udbb9\udcea"/>
+<string value="\udbb9\udceb"/>
+<string value="\udbb9\udcec"/>
+<string value="\udbb9\udced"/>
+<string value="\udbb9\udcee"/>
+<!-- Miscellaneous Things -->
+<string value="\udbb9\udcef"/>
+<string value="\udbb9\udcf0"/>
+<string value="\udbb9\udcf1"/>
+<string value="\udbb9\udcf2"/>
+<string value="\udbb9\udcf3"/>
+<string value="\udbb9\udcf4"/>
+<string value="\udbb9\udcf5"/>
+<string value="\udbb9\udcf6"/>
+<string value="\udbb9\udcf7"/>
+<string value="\udbb9\udcf8"/>
+<string value="\udbb9\udcf9"/>
+<string value="\udbb9\udcfa"/>
+<string value="\udbb9\udcfb"/>
+<string value="\udbb9\udcfc"/>
+<string value="\udbb9\udcfd"/>
+<string value="\udbb9\udcfe"/>
+<string value="\udbb9\udcff"/>
+<string value="\udbb9\udd00"/>
+<string value="\udbb9\udd01"/>
+<string value="\udbb9\udd02"/>
+<string value="\udbb9\udd03"/>
+<string value="\udbb9\udd04"/>
+<!-- Bath / Bathroom -->
+<string value="\udbb9\udd05"/>
+<string value="\udbb9\udd06"/>
+<string value="\udbb9\udd07"/>
+<string value="\udbb9\udd08"/>
+<!-- Medical -->
+<string value="\udbb9\udd09"/>
+<string value="\udbb9\udd0a"/>
+<string value="\udbb9\udd0b"/>
+<string value="\udbb9\udd0c"/>
+<string value="\udbb9\udd0d"/>
+<string value="\udbb9\udd0e"/>
+<!-- Celebration / Holidays -->
+<string value="\udbb9\udd0f"/>
+<string value="\udbb9\udd10"/>
+<string value="\udbb9\udd11"/>
+<string value="\udbb9\udd12"/>
+<string value="\udbb9\udd13"/>
+<string value="\udbb9\udd14"/>
+<string value="\udbb9\udd15"/>
+<string value="\udbb9\udd16"/>
+<string value="\udbb9\udd17"/>
+<string value="\udbb9\udd18"/>
+<string value="\udbb9\udd19"/>
+<string value="\udbb9\udd1a"/>
+<string value="\udbb9\udd1b"/>
+<string value="\udbb9\udd1c"/>
+<string value="\udbb9\udd1d"/>
+<string value="\udbb9\udd1e"/>
+<string value="\udbb9\udd1f"/>
+<string value="\udbb9\udd20"/>
+<string value="\udbb9\udd21"/>
+<!-- Communication -->
+<string value="\udbb9\udd22"/>
+<string value="\udbb9\udd23"/>
+<string value="\udbb9\udd24"/>
+<string value="\udbb9\udd25"/>
+<string value="\udbb9\udd26"/>
+<string value="\udbb9\udd27"/>
+<string value="\udbb9\udd28"/>
+<string value="\udbb9\udd29"/>
+<string value="\udbb9\udd2a"/>
+<string value="\udbb9\udd2b"/>
+<string value="\udbb9\udd2c"/>
+<string value="\udbb9\udd2d"/>
+<string value="\udbb9\udd2e"/>
+<string value="\udbb9\udd2f"/>
+<string value="\udbb9\udd30"/>
+<string value="\udbb9\udd31"/>
+<string value="\udbb9\udd32"/>
+<string value="\udbb9\udd33"/>
+<string value="\udbb9\udd34"/>
+<string value="\udbb9\udd35"/>
+<!-- Office -->
+<string value="\udbb9\udd36"/>
+<string value="\udbb9\udd37"/>
+<string value="\udbb9\udd38"/>
+<string value="\udbb9\udd39"/>
+<string value="\udbb9\udd3a"/>
+<string value="\udbb9\udd3b"/>
+<string value="\udbb9\udd3c"/>
+<string value="\udbb9\udd3d"/>
+<string value="\udbb9\udd3e"/>
+<string value="\udbb9\udd3f"/>
+<string value="\udbb9\udd40"/>
+<string value="\udbb9\udd41"/>
+<string value="\udbb9\udd42"/>
+<string value="\udbb9\udd43"/>
+<string value="\udbb9\udd44"/>
+<string value="\udbb9\udd45"/>
+<string value="\udbb9\udd46"/>
+<string value="\udbb9\udd47"/>
+<string value="\udbb9\udd48"/>
+<string value="\udbb9\udd49"/>
+<string value="\udbb9\udd4a"/>
+<string value="\udbb9\udd4b"/>
+<string value="\udbb9\udd4c"/>
+<string value="\udbb9\udd4d"/>
+<string value="\udbb9\udd4e"/>
+<string value="\udbb9\udd4f"/>
+<string value="\udbb9\udd50"/>
+<string value="\udbb9\udd51"/>
+<string value="\udbb9\udd52"/>
+<!-- Relic -->
+<string value="\udbb9\udd53"/>
+<!-- 5. Activities / Work / Entertainment -->
+<!-- Sports -->
+<string value="\udbb9\udfd0"/>
+<string value="\udbb9\udfd1"/>
+<string value="\udbb9\udfd2"/>
+<string value="\udbb9\udfd3"/>
+<string value="\udbb9\udfd4"/>
+<string value="\udbb9\udfd5"/>
+<string value="\udbb9\udfd6"/>
+<string value="\udbb9\udfd7"/>
+<string value="\udbb9\udfd8"/>
+<string value="\udbb9\udfd9"/>
+<string value="\udbb9\udfda"/>
+<string value="\udbb9\udfdb"/>
+<string value="\udbb9\udfdc"/>
+<string value="\udbb9\udfdd"/>
+<string value="\udbb9\udfde"/>
+<!-- Transportation -->
+<string value="\udbb9\udfdf"/>
+<string value="\udbb9\udfe0"/>
+<string value="\udbb9\udfe1"/>
+<string value="\udbb9\udfe2"/>
+<string value="\udbb9\udfe3"/>
+<string value="\udbb9\udfe4"/>
+<string value="\udbb9\udfe5"/>
+<string value="\udbb9\udfe6"/>
+<string value="\udbb9\udfe7"/>
+<string value="\udbb9\udfe8"/>
+<string value="\udbb9\udfe9"/>
+<string value="\udbb9\udfea"/>
+<string value="\udbb9\udfeb"/>
+<string value="\udbb9\udfec"/>
+<string value="\udbb9\udfed"/>
+<string value="\udbb9\udfee"/>
+<string value="\udbb9\udfef"/>
+<string value="\udbb9\udff0"/>
+<string value="\udbb9\udff1"/>
+<string value="\udbb9\udff2"/>
+<string value="\udbb9\udff3"/>
+<string value="\udbb9\udff4"/>
+<!-- Driving -->
+<string value="\udbb9\udff5"/>
+<string value="\udbb9\udff6"/>
+<string value="\udbb9\udff7"/>
+<string value="\udbb9\udff8"/>
+<string value="\udbb9\udff9"/>
+<!-- Recreation -->
+<string value="\udbb9\udffa"/>
+<string value="\udbb9\udffb"/>
+<string value="\udbb9\udffc"/>
+<string value="\udbb9\udffd"/>
+<string value="\udbb9\udffe"/>
+<string value="\udbb9\udfff"/>
+<!-- Entertainment -->
+<string value="\udbba\udc00"/>
+<string value="\udbba\udc01"/>
+<string value="\udbba\udc02"/>
+<string value="\udbba\udc03"/>
+<string value="\udbba\udc04"/>
+<string value="\udbba\udc05"/>
+<string value="\udbba\udc06"/>
+<string value="\udbba\udc07"/>
+<string value="\udbba\udc08"/>
+<string value="\udbba\udc09"/>
+<!-- Games -->
+<string value="\udbba\udc0a"/>
+<string value="\udbba\udc0b"/>
+<string value="\udbba\udc0c"/>
+<string value="\udbba\udc0d"/>
+<string value="\udbba\udc0e"/>
+<string value="\udbba\udc0f"/>
+<string value="\udbba\udc10"/>
+<string value="\udbba\udc11"/>
+<string value="\udbba\udc12"/>
+<!-- Music -->
+<string value="\udbba\udc13"/>
+<string value="\udbba\udc14"/>
+<string value="\udbba\udc15"/>
+<string value="\udbba\udc16"/>
+<string value="\udbba\udc17"/>
+<string value="\udbba\udc18"/>
+<string value="\udbba\udc19"/>
+<string value="\udbba\udc1a"/>
+<string value="\udbba\udc1b"/>
+<!-- Media -->
+<string value="\udbba\udc1c"/>
+<string value="\udbba\udc1d"/>
+<string value="\udbba\udc1e"/>
+<string value="\udbba\udc1f"/>
+<string value="\udbba\udc20"/>
+<string value="\udbba\udc21"/>
+<string value="\udbba\udc22"/>
+<!-- Romance -->
+<string value="\udbba\udc23"/>
+<string value="\udbba\udc24"/>
+<string value="\udbba\udc25"/>
+<string value="\udbba\udc26"/>
+<string value="\udbba\udc27"/>
+<string value="\udbba\udc28"/>
+<string value="\udbba\udc29"/>
+<string value="\udbba\udc2a"/>
+<!-- Phone Specific -->
+<string value="\udbba\udc2b"/>
+<string value="\udbba\udc2c"/>
+<string value="\udbba\udc2d"/>
+<string value="\udbba\udc2e"/>
+<string value="\udbba\udc2f"/>
+<string value="\udbba\udc30"/>
+<string value="\udbba\udc31"/>
+<string value="\udbba\udc32"/>
+<string value="\udbba\udc33"/>
+<string value="\udbba\udc34"/>
+<string value="\udbba\udc35"/>
+<string value="\udbba\udc36"/>
+<string value="\udbba\udc37"/>
+<string value="\udbba\udc38"/>
+<string value="\udbba\udc39"/>
+<string value="\udbba\udc3a"/>
+<string value="\udbba\udc3b"/>
+<string value="\udbba\udc3c"/>
+</keystring>
diff --git a/res/xml/symbols_japan_face_list.xml b/res/xml/symbols_japan_face_list.xml
index 371e022..3d5eec4 100644
--- a/res/xml/symbols_japan_face_list.xml
+++ b/res/xml/symbols_japan_face_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/symbols_japan_list.xml b/res/xml/symbols_japan_list.xml
index d25f546..8b3c571 100644
--- a/res/xml/symbols_japan_list.xml
+++ b/res/xml/symbols_japan_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -16,6 +16,40 @@
 -->
 <!--symbols -->
 <keystring>
+  <string value="@string/half_symbol_categories_txt"/>
+  <string value="!"/>
+  <string value="“"/>
+  <string value="\#"/>
+  <string value="$"/>
+  <string value="%"/>
+  <string value="&amp;"/>
+  <string value="'"/>
+  <string value="("/>
+  <string value=")"/>
+  <string value="*"/>
+  <string value="+"/>
+  <string value=","/>
+  <string value="-"/>
+  <string value="."/>
+  <string value="/"/>
+  <string value=":"/>
+  <string value=";"/>
+  <string value="&lt;"/>
+  <string value="="/>
+  <string value=">"/>
+  <string value="\?"/>
+  <string value="\@"/>
+  <string value="["/>
+  <string value="\\"/>
+  <string value="]"/>
+  <string value="^"/>
+  <string value="_"/>
+  <string value="`"/>
+  <string value="{"/>
+  <string value="|"/>
+  <string value="}"/>
+  <string value="~"/>
+  <string value="@string/full_symbol_categories_txt"/>
   <string value="、"/>
   <string value="。"/>
   <string value=","/>
@@ -244,7 +278,4 @@
   <string value="∠"/>
   <string value="∟"/>
   <string value="⊿"/>
-  <string value="∵"/>
-  <string value="∩"/>
-  <string value="∪"/>
 </keystring>
diff --git a/res/xml/symbols_latin12_list.xml b/res/xml/symbols_latin12_list.xml
index e3f6022..62e3bf1 100644
--- a/res/xml/symbols_latin12_list.xml
+++ b/res/xml/symbols_latin12_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/res/xml/symbols_latin1_list.xml b/res/xml/symbols_latin1_list.xml
index 6198124..f5b5edb 100644
--- a/res/xml/symbols_latin1_list.xml
+++ b/res/xml/symbols_latin1_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 -->
 <!--symbols -->
 <keystring>
+  <string value="@string/half_symbol_categories_txt"/>
   <string value="!"/>
   <string value="“"/>
   <string value="\#"/>
diff --git a/res/xml/symbols_latin2_list.xml b/res/xml/symbols_latin2_list.xml
index c8d1045..508df9d 100644
--- a/res/xml/symbols_latin2_list.xml
+++ b/res/xml/symbols_latin2_list.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/BaseInputView.java b/src/jp/co/omronsoft/openwnn/BaseInputView.java
new file mode 100644
index 0000000..36da017
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/BaseInputView.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jp.co.omronsoft.openwnn;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.util.AttributeSet;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+
+/**
+ * The view of the base input.
+ */
+public class BaseInputView extends LinearLayout {
+    /** The dialog that opens with long tap */
+    public AlertDialog mOptionsDialog = null;
+
+    /**
+     * Constructor
+     */
+    public BaseInputView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    /**
+     * Constructor
+     */
+    BaseInputView(Context context) {
+        super(context);
+    }
+
+    /**
+     * Called when the window containing has change its visibility.
+     *
+     * @see android.view.View#onWindowVisibilityChanged(int)
+     */
+    @Override protected void onWindowVisibilityChanged(int visibility) {
+       super.onWindowVisibilityChanged(visibility);
+       if ((visibility != VISIBLE) && (mOptionsDialog != null)) {
+           mOptionsDialog.dismiss();
+       }
+    }
+
+    /**
+     * Show dialog.
+     *
+     * @param builder   the builder of dialog
+     */
+    public void showDialog(AlertDialog.Builder builder) {
+        if (mOptionsDialog != null) {
+            mOptionsDialog.dismiss();
+        }
+
+        mOptionsDialog = builder.create();
+        Window window = mOptionsDialog.getWindow();
+        WindowManager.LayoutParams dialogLayoutParams = window.getAttributes();
+        dialogLayoutParams.token = getWindowToken();
+        dialogLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+        window.setAttributes(dialogLayoutParams);
+        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ 
+        mOptionsDialog.show();
+    }
+
+    /**
+     * Close dialog.
+     */
+    public void closeDialog() {
+       if (mOptionsDialog != null) {
+           mOptionsDialog.dismiss();
+           mOptionsDialog = null;
+       }
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/CandidateFilter.java b/src/jp/co/omronsoft/openwnn/CandidateFilter.java
index 993aef1..32181d2 100644
--- a/src/jp/co/omronsoft/openwnn/CandidateFilter.java
+++ b/src/jp/co/omronsoft/openwnn/CandidateFilter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/CandidateTextView.java b/src/jp/co/omronsoft/openwnn/CandidateTextView.java
new file mode 100644
index 0000000..f177441
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/CandidateTextView.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package jp.co.omronsoft.openwnn;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.text.TextPaint;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/**
+ * The default candidates view manager using {@link TextView}.
+ *
+ * @author Copyright (C) 2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ */
+public class CandidateTextView extends TextView {
+
+    /** Width of fontsize change */
+    private static final int WIDTH_SIZE[] = {0, 50, 100};
+    /** Fontsize corresponding to width */
+    private static final float CUSTOM_FONTSIZE[] = {20.0f, 17.0f, 15.0f};
+    /** Width of fontsize change beginning */
+    private static final int CHANGE_FONTSIZE_WIDTH = 120;
+
+    /** Maximum width of candidate view */
+    private int mMaxWidth;
+    /** Width of fontsize change beginning */
+    private int mChangeFontSize;
+    /** Minimum width of candidate view */
+    private int mCandidateMinimumWidth;
+
+    /** Alert dialog */
+    private Dialog mCandidateDialog = null;
+
+   /**
+    * Constructor
+    * @param context    context
+    */
+    public CandidateTextView(Context context) {
+        super(context);
+        setSoundEffectsEnabled(false);
+    }
+
+   /**
+    * Constructor
+    * @param context    context
+    * @param candidateMinimumHeight Minimum height of candidate view
+    * @param candidateMinimumWidth  Minimum width of candidate view
+    * @param maxWidth  Maximum width of candidate view
+    */
+    public CandidateTextView(Context context, int candidateMinimumHeight, int candidateMinimumWidth, int maxWidth) {
+        super(context);
+        setSoundEffectsEnabled(false);
+        setTextColor(getResources().getColor(R.color.candidate_text_1line));
+        setBackgroundResource(R.drawable.cand_back_1line);
+        setGravity(Gravity.CENTER);
+        setSingleLine();
+        setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+                                                           ViewGroup.LayoutParams.MATCH_PARENT,
+                                                           1.0f));
+        setMinHeight(candidateMinimumHeight);
+        setMinimumWidth(candidateMinimumWidth);
+        mCandidateMinimumWidth = candidateMinimumWidth;
+        mMaxWidth = maxWidth;
+        mChangeFontSize = maxWidth - CHANGE_FONTSIZE_WIDTH;
+    }
+
+   /**
+    * Textview is set to the best content for the display of candidate.
+    * @param WnnWord    candidate
+    * @param wordCount  candidate id
+    * @param OnClickListener Operation when clicking
+    * @param OnClickListener Operation when longclicking
+    * @return Set completion textview
+    */
+    public CandidateTextView setCandidateTextView(WnnWord word, int wordCount,
+                                                        OnClickListener candidateOnClick,
+                                                        OnLongClickListener candidateOnLongClick) {
+        setTextSize(CUSTOM_FONTSIZE[0]);
+        setText(word.candidate);
+        setId(wordCount);
+        setVisibility(View.VISIBLE);
+        setPressed(false);
+        setWidth(0);
+        setEllipsize(null);
+        setOnClickListener(candidateOnClick);
+        setOnLongClickListener(candidateOnLongClick);
+        setCustomCandidate(word);
+        return this;
+    }
+
+   /**
+    * If the text view is set to the best width for the display,
+    * and it is necessary, the character is shortened.
+    * @param WnnWord candidate word
+    * @return int    textview width
+    */
+    public int setCustomCandidate(WnnWord word) {
+        TextPaint paint = getPaint();
+        int width = (int)paint.measureText(word.candidate, 0, word.candidate.length());
+        width += getPaddingLeft() + getPaddingRight();
+
+        if (width > mCandidateMinimumWidth) {
+            int i;
+            for (i = 0; i < WIDTH_SIZE.length; i++) {
+                if (width > mChangeFontSize + WIDTH_SIZE[i]) {
+                    setTextSize(CUSTOM_FONTSIZE[i]);
+                }
+            }
+
+            width = (int)paint.measureText(word.candidate, 0, word.candidate.length());
+            width += getPaddingLeft() + getPaddingRight();
+
+            if (width >= mMaxWidth) {
+                setWidth(mMaxWidth);
+                width = mMaxWidth;
+                setEllipsize(TextUtils.TruncateAt.START);
+            } else {
+                setWidth(width);
+            }
+        } else {
+            setWidth(mCandidateMinimumWidth);
+            width = mCandidateMinimumWidth;
+        }
+        return width;
+    }
+
+    /** @see View#setBackgroundDrawable */
+    @Override public void setBackgroundDrawable(Drawable d) {
+        super.setBackgroundDrawable(d);
+        setPadding(20, 0, 20, 0);
+    }
+
+    /**
+     * Display Dialog.
+     *
+     * @param builder  The Dialog builder,
+     */
+    public void displayCandidateDialog(Dialog builder) {
+        if (mCandidateDialog != null) {
+            mCandidateDialog.dismiss();
+            mCandidateDialog = null;
+        }
+        mCandidateDialog = builder;
+        Window window = mCandidateDialog.getWindow();
+        WindowManager.LayoutParams lp = window.getAttributes();
+        lp.token = getWindowToken();
+        lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+        window.setAttributes(lp);
+        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+        mCandidateDialog.show();
+    }
+
+    /** @see android.view.View#onWindowVisibilityChanged */
+    @Override protected void onWindowVisibilityChanged(int visibility) {
+       super.onWindowVisibilityChanged(visibility);
+       if ((visibility != VISIBLE) && (mCandidateDialog != null)) {
+           mCandidateDialog.dismiss();
+       }
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/CandidatesViewManager.java b/src/jp/co/omronsoft/openwnn/CandidatesViewManager.java
index 01dee1e..be2b9e6 100644
--- a/src/jp/co/omronsoft/openwnn/CandidatesViewManager.java
+++ b/src/jp/co/omronsoft/openwnn/CandidatesViewManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,15 +16,26 @@
 
 package jp.co.omronsoft.openwnn;
 
-import android.view.View;
+import android.app.Dialog;
+import android.content.res.Resources;
 import android.content.SharedPreferences;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.HorizontalScrollView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.util.TypedValue;
+
+import java.util.ArrayList;
 
 /**
  * The interface of candidates view manager used by {@link OpenWnn}.
  *
- * @author Copyright (C) 2008, 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2008-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
-public interface CandidatesViewManager {
+public abstract class CandidatesViewManager {
     /** Size of candidates view (normal) */
     public static final int VIEW_TYPE_NORMAL = 0;
     /** Size of candidates view (full) */
@@ -53,6 +64,15 @@
      */
     public static final int ATTRIBUTE_AUTO_GENERATED  = 4;
 
+    /** The view of the LongPressDialog */
+    protected View mViewLongPressDialog = null;
+
+    /** Whether candidates long click enable */
+    protected Dialog mDialog = null;
+
+    /** The word pressed */
+    protected WnnWord mWord;
+
     /**
      * Initialize the candidates view.
      *
@@ -62,28 +82,32 @@
      *
      * @return The candidates view created in the initialize process; {@code null} if cannot create a candidates view.
      */
-    public View initView(OpenWnn parent, int width, int height);
+    public abstract View initView(OpenWnn parent, int width, int height);
 
     /**
      * Get the candidates view being used currently.
      *
      * @return The candidates view; {@code null} if no candidates view is used currently.
      */
-    public View getCurrentView();
+    public abstract View getCurrentView();
 
     /**
      * Set the candidates view type.
      *
-     * @param type  The candidate view type
+     * @param type  The candidate view type,
+     * from {@link CandidatesViewManager#VIEW_TYPE_NORMAL} to
+     * {@link CandidatesViewManager#VIEW_TYPE_CLOSE}
      */
-    public void setViewType(int type);
+    public abstract void setViewType(int type);
 
     /**
      * Get the candidates view type.
      *
-     * @return      The view type
+     * @return      The view type,
+     * from {@link CandidatesViewManager#VIEW_TYPE_NORMAL} to
+     * {@link CandidatesViewManager#VIEW_TYPE_CLOSE}
      */
-    public int getViewType();
+    public abstract int getViewType();
 
     /**
      * Display candidates.
@@ -92,17 +116,77 @@
      *
      * @see jp.co.omronsoft.openwnn.WnnEngine#getNextCandidate
      */
-    public void displayCandidates(WnnEngine converter);
+    public abstract void displayCandidates(WnnEngine converter);
 
     /**
      * Clear and hide the candidates view.
      */
-    public void clearCandidates();
+    public abstract void clearCandidates();
 
     /**
-     * Reflect the preferences in the candidates view.
+     * Replace the preferences in the candidates view.
      *
      * @param pref    The preferences
      */
-    public void setPreferences(SharedPreferences pref);
+    public abstract void setPreferences(SharedPreferences pref);
+
+    /**
+     * KeyEvent action for soft key board.
+     *
+     * @param key    Key event
+     */
+    public abstract void processMoveKeyEvent(int key);
+
+    /**
+     * Get candidate is focused now.
+     *
+     * @return the Candidate is focused of a flag.
+     */
+    public abstract boolean isFocusCandidate();
+
+    /**
+     * Select candidate that has focus.
+     */
+    public abstract void selectFocusCandidate();
+
+    /**
+     * MSG_SET_CANDIDATES removeMessages.
+     */
+    public abstract void setCandidateMsgRemove();
+
+    /**
+     * Display Dialog.
+     *
+     * @param view  View,
+     * @param word  Display word,
+     */
+    protected void displayDialog(View view, final WnnWord word) {
+        if ((view instanceof CandidateTextView) && (null != mViewLongPressDialog)) {
+            closeDialog();
+            mDialog = new Dialog(view.getContext(), R.style.Dialog);
+
+            TextView text = (TextView)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_text);
+            text.setText(word.candidate);
+
+            mDialog.setContentView(mViewLongPressDialog);
+            ((CandidateTextView) view).displayCandidateDialog(mDialog);
+        }
+    }
+
+    /**
+     * Close Dialog.
+     *
+     */
+    public void closeDialog() {
+        if (null != mDialog) {
+            mDialog.dismiss();
+            mDialog = null;
+            if (null != mViewLongPressDialog) {
+                ViewGroup parent = (ViewGroup)mViewLongPressDialog.getParent();
+                if (null != parent) {
+                    parent.removeView(mViewLongPressDialog);
+                }
+            }
+        }
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/ComposingText.java b/src/jp/co/omronsoft/openwnn/ComposingText.java
index 328efb5..dddab2c 100644
--- a/src/jp/co/omronsoft/openwnn/ComposingText.java
+++ b/src/jp/co/omronsoft/openwnn/ComposingText.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/DefaultSoftKeyboard.java b/src/jp/co/omronsoft/openwnn/DefaultSoftKeyboard.java
index edb308c..096460b 100644
--- a/src/jp/co/omronsoft/openwnn/DefaultSoftKeyboard.java
+++ b/src/jp/co/omronsoft/openwnn/DefaultSoftKeyboard.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,12 @@
 
 package jp.co.omronsoft.openwnn;
 
+import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
 import android.widget.TextView;
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.KeyboardView;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
 import android.content.res.*;
@@ -31,10 +31,14 @@
 
 import android.util.Log;
 
+import jp.co.omronsoft.openwnn.Keyboard;
+import jp.co.omronsoft.openwnn.KeyboardView;
+import jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener;
+
 /**
  * The default software keyboard class.
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public class DefaultSoftKeyboard implements InputViewManager, KeyboardView.OnKeyboardActionListener {
     /*
@@ -104,7 +108,16 @@
     public static final int KEYCODE_JP12_HAN_ALPHA  = -229;
     /** Japanese 12-key keyboard [MODE TOOGLE CHANGE] */
     public static final int KEYCODE_JP12_TOGGLE_MODE = -230;
-    
+
+    /** Key code for symbol keyboard alt key */
+    public static final int KEYCODE_4KEY_MODE        = -300;
+    /** Key code for symbol keyboard up key */
+    public static final int KEYCODE_4KEY_UP          = -301;
+    /** Key code for symbol keyboard down key */
+    public static final int KEYCODE_4KEY_DOWN        = -302;
+    /** Key code for symbol keyboard del key */
+    public static final int KEYCODE_4KEY_CLEAR       = -303;
+
     /* for Qwerty keyboard */
     /** Qwerty keyboard [DEL] */
     public static final int KEYCODE_QWERTY_BACKSPACE = -100;
@@ -146,7 +159,7 @@
     protected KeyboardView mKeyboardView;
     
     /** View objects (main side) */
-    protected ViewGroup mMainView;
+    protected BaseInputView mMainView;
     /** View objects (sub side) */
     protected ViewGroup mSubView;
     
@@ -262,6 +275,15 @@
     /** Whether the H/W keyboard is hidden. */
     protected boolean mHardKeyboardHidden = true;
 
+    /** Whether the H/W 12key keyboard. */
+    protected boolean mEnableHardware12Keyboard = false;
+
+    /** Symbol keyboard */
+    protected Keyboard mSymbolKeyboard;
+
+    /** Symbol keyboard state */
+    protected boolean mIsSymbolKeyboard = false;
+
     /**
      * Status of the composing text
      * <br>
@@ -278,6 +300,60 @@
     /** Key toggle cycle table currently using */
     protected String[] mCurrentCycleTable;
 
+    /** Event listener for symbol keyboard */
+    private OnKeyboardActionListener mSymbolOnKeyboardAction = new OnKeyboardActionListener() {
+        public void onKey(int primaryCode, int[] keyCodes) {
+            switch (primaryCode) {
+            case KEYCODE_4KEY_MODE:
+                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_KEY,
+                                              new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)));
+                break;
+
+            case KEYCODE_4KEY_UP:
+                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP));
+                break;
+
+            case KEYCODE_4KEY_DOWN:
+                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN));
+                break;
+
+            case KEYCODE_4KEY_CLEAR:
+                InputConnection connection = mWnn.getCurrentInputConnection();
+                if (connection != null) {
+                    connection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
+                }
+                return;
+
+            default:
+                break;
+            }
+        }
+        public void onPress(int primaryCode) {
+            playSoundAndVibration();
+        }
+        public void onText(CharSequence text) { }
+        public void swipeLeft() { }
+        public void swipeRight() { }
+        public void swipeUp() { }
+        public void swipeDown() { }
+        public void onRelease(int primaryCode) { }
+        public boolean onLongPress(Keyboard.Key key) {
+            switch (key.codes[0]) {
+            case KEYCODE_4KEY_UP:
+                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_UP));
+                return true;
+
+            case KEYCODE_4KEY_DOWN:
+                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_DOWN));
+                return true;
+
+            default:
+                break;
+            }
+            return false;
+        }
+    };
+
     /**
      * Constructor
      */
@@ -527,6 +603,9 @@
          */
         createKeyboards(parent);
 
+        /* create symbol keyboard */
+        mSymbolKeyboard = new Keyboard(parent, R.xml.keyboard_4key);
+
         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(parent);
         String skin = pref.getString("keyboard_skin",
                                      mWnn.getResources().getString(R.string.keyboard_skin_id_default));
@@ -536,14 +615,17 @@
         mKeyboardView.setOnKeyboardActionListener(this);
         mCurrentKeyboard = null;
 
-        mMainView = (ViewGroup) parent.getLayoutInflater().inflate(R.layout.keyboard_default_main, null);
+        mMainView = (BaseInputView) parent.getLayoutInflater().inflate(R.layout.keyboard_default_main, null);
         mSubView = (ViewGroup) parent.getLayoutInflater().inflate(R.layout.keyboard_default_sub, null);
-        if (mDisplayMode == LANDSCAPE || !mHardKeyboardHidden) { 
-            mMainView.addView(mSubView);
+
+        if (!mHardKeyboardHidden) {
+            if (!mEnableHardware12Keyboard) {
+                mMainView.addView(mSubView);
+            }
         } else if (mKeyboardView != null) {
             mMainView.addView(mKeyboardView);
         }
-        
+
         return mMainView;
     }
     
@@ -624,9 +706,6 @@
     
     /** @see jp.co.omronsoft.openwnn.InputViewManager#getCurrentView */
     public View getCurrentView() {
-        if (mCurrentKeyboard == null) {
-            return null;
-        }
         return mMainView;
     }
 
@@ -682,7 +761,12 @@
         }
 
         /* pop-up preview */
-        mKeyboardView.setPreviewEnabled(pref.getBoolean("popup_preview", true));
+        if (OpenWnn.isXLarge()) {
+            mKeyboardView.setPreviewEnabled(false);
+        } else {
+            mKeyboardView.setPreviewEnabled(pref.getBoolean("popup_preview", true));
+            mKeyboardView.clearWindowInfo();
+        }
 
     }
 
@@ -694,39 +778,63 @@
         mDisableKeyInput = true;
     }
 
+    /** @see jp.co.omronsoft.openwnn.InputViewManager#showInputView */
+    public void showInputView() {
+        if (mKeyboardView != null) {
+            mKeyboardView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    /** @see jp.co.omronsoft.openwnn.InputViewManager#hideInputView */
+    public void hideInputView() {
+        mKeyboardView.setVisibility(View.GONE);
+    }
+
     /***********************************************************************
      * onKeyboardActionListener
      ***********************************************************************/
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onKey */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#onKey */
     public void onKey(int primaryCode, int[] keyCodes) { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeRight */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#swipeRight */
     public void swipeRight() { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeLeft */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#swipeLeft */
     public void swipeLeft() { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeDown */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#swipeDown */
     public void swipeDown() { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeUp */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#swipeUp */
     public void swipeUp() { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onRelease */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#onRelease */
     public void onRelease(int x) { }
 
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onPress */
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#onPress */
     public void onPress(int x) {
+        playSoundAndVibration();
+    }
+
+    /** @see android.jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#onLongPress */
+    public boolean onLongPress(Keyboard.Key key) {
+        return false;
+    }
+
+    /**
+     * Play sound & vibration.
+     */
+    private void playSoundAndVibration() {
         /* key click sound & vibration */
         if (mVibrator != null) {
-            try { mVibrator.vibrate(30); } catch (Exception ex) { }
+            try { mVibrator.vibrate(5); } catch (Exception ex) { }
         }
         if (mSound != null) {
             try { mSound.seekTo(0); mSound.start(); } catch (Exception ex) { }
         }
     }
-    
-    /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onText */
+
+    /** @see jp.co.omronsoft.openwnn.KeyboardView.OnKeyboardActionListener#onText */
     public void onText(CharSequence text) {}
 
     /**
@@ -757,6 +865,15 @@
     }
 
     /**
+     * Set the H/W keyboard's type.
+     *
+     * @param type12Key {@code true} if 12Key.
+     */
+    public void setHardware12Keyboard(boolean type12Key) {
+        mEnableHardware12Keyboard = type12Key;
+    }
+
+    /**
      * Get current keyboard view.
      */
     public View getKeyboardView() {
@@ -772,4 +889,25 @@
         mCurrentKeyboard = null;
         changeKeyboard(keyboard);
     }
+
+    /**
+     * Set the normal keyboard.
+     */
+    public void setNormalKeyboard() {
+        if (mCurrentKeyboard == null) {
+            return;
+        }
+        mKeyboardView.setKeyboard(mCurrentKeyboard);
+        mKeyboardView.setOnKeyboardActionListener(this);
+        mIsSymbolKeyboard = false;
+    }
+
+    /**
+     * Set the symbol keyboard.
+     */
+    public void setSymbolKeyboard() {
+        mKeyboardView.setKeyboard(mSymbolKeyboard);
+        mKeyboardView.setOnKeyboardActionListener(mSymbolOnKeyboardAction);
+        mIsSymbolKeyboard = true;
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/EN/ClearUserDictionaryDialogPreferenceEN.java b/src/jp/co/omronsoft/openwnn/EN/ClearUserDictionaryDialogPreferenceEN.java
index 10fb86c..aef2c1c 100644
--- a/src/jp/co/omronsoft/openwnn/EN/ClearUserDictionaryDialogPreferenceEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/ClearUserDictionaryDialogPreferenceEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/EN/DefaultSoftKeyboardEN.java b/src/jp/co/omronsoft/openwnn/EN/DefaultSoftKeyboardEN.java
index 4cdcc9a..33df09f 100644
--- a/src/jp/co/omronsoft/openwnn/EN/DefaultSoftKeyboardEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/DefaultSoftKeyboardEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
 
 import jp.co.omronsoft.openwnn.*;
 import android.content.SharedPreferences;
-import android.inputmethodservice.Keyboard;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
 
+import jp.co.omronsoft.openwnn.Keyboard;
+
 import android.util.Log;
 
 /**
diff --git a/src/jp/co/omronsoft/openwnn/EN/OpenWnnEngineEN.java b/src/jp/co/omronsoft/openwnn/EN/OpenWnnEngineEN.java
index 4a71690..7efeb7d 100644
--- a/src/jp/co/omronsoft/openwnn/EN/OpenWnnEngineEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/OpenWnnEngineEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/EN/TutorialEN.java b/src/jp/co/omronsoft/openwnn/EN/TutorialEN.java
index cb2f1d8..61dc1b0 100644
--- a/src/jp/co/omronsoft/openwnn/EN/TutorialEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/TutorialEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsEditEN.java b/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsEditEN.java
index d052f7f..8e3a6d3 100644
--- a/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsEditEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsEditEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsListEN.java b/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsListEN.java
index 483b25a..f032d64 100644
--- a/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsListEN.java
+++ b/src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsListEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
 package jp.co.omronsoft.openwnn.EN;
 
 import jp.co.omronsoft.openwnn.*;
+import android.os.Bundle;
 import android.view.View;
 import android.view.Window;
 import java.util.Comparator;
@@ -31,18 +32,18 @@
      * Constructor
      */
     public UserDictionaryToolsListEN() {
-		if (OpenWnnEN.getInstance() == null) {
-			new OpenWnnEN(this);
-		}
+        if (OpenWnnEN.getInstance() == null) {
+            new OpenWnnEN(this);
+        }
         mListViewName = "jp.co.omronsoft.openwnn.EN.UserDictionaryToolsListEN";
         mEditViewName = "jp.co.omronsoft.openwnn.EN.UserDictionaryToolsEditEN";
         mPackageName  = "jp.co.omronsoft.openwnn";
     }
 
-    /** @see jp.co.omronsoft.openwnn.UserDictionaryToolsList#headerCreate */
-    @Override protected void headerCreate() {
-      getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
-      R.layout.user_dictionary_tools_list_header);
+    /** @see jp.co.omronsoft.iwnnime.ml.UserDictionaryToolsList#onCreate */
+    @Override protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTitle(R.string.user_dictionary_list_words_en);
     }
 
     /** @see jp.co.omronsoft.openwnn.UserDictionaryToolsList#createUserDictionaryToolsEdit */
diff --git a/src/jp/co/omronsoft/openwnn/InputViewManager.java b/src/jp/co/omronsoft/openwnn/InputViewManager.java
index f6e15ec..235721a 100644
--- a/src/jp/co/omronsoft/openwnn/InputViewManager.java
+++ b/src/jp/co/omronsoft/openwnn/InputViewManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
 /**
  * The interface of input view manager used by OpenWnn.
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public interface InputViewManager {
     /**
@@ -63,4 +63,15 @@
      * Close the input view.
      */
     public void closing();
+ 
+    /**
+     * Show the input view.
+     */
+    public void showInputView();
+
+    /**
+     * Hide the input view.
+     */
+    public void hideInputView();
+
 }
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/ClearLearnDictionaryDialogPreferenceJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/ClearLearnDictionaryDialogPreferenceJAJP.java
index ff6c27e..7df0a4d 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/ClearLearnDictionaryDialogPreferenceJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/ClearLearnDictionaryDialogPreferenceJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/ClearUserDictionaryDialogPreferenceJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/ClearUserDictionaryDialogPreferenceJAJP.java
index 6e132d2..70aa469 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/ClearUserDictionaryDialogPreferenceJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/ClearUserDictionaryDialogPreferenceJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
index 8079d2f..e3e6cc4 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,14 +16,21 @@
 
 package jp.co.omronsoft.openwnn.JAJP;
 
+import android.app.AlertDialog;
 import jp.co.omronsoft.openwnn.*;
+import android.content.DialogInterface;
+import android.content.res.Resources;
 import android.view.KeyEvent;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
-import android.inputmethodservice.Keyboard;
 import android.util.Log;
 import android.view.View;
 import android.content.SharedPreferences;
+
+import jp.co.omronsoft.openwnn.Keyboard;
+import jp.co.omronsoft.openwnn.BaseInputView;
+import jp.co.omronsoft.openwnn.R;
+
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.List;
@@ -308,7 +315,11 @@
     /** Default constructor */
     public DefaultSoftKeyboardJAJP() {
         mCurrentLanguage     = LANG_JA;
-        mCurrentKeyboardType = KEYBOARD_12KEY;
+        if (OpenWnn.isXLarge()) {
+            mCurrentKeyboardType = KEYBOARD_QWERTY;
+        } else {
+            mCurrentKeyboardType = KEYBOARD_12KEY;
+        }
         mShiftOn             = KEYBOARD_SHIFT_OFF;
         mCurrentKeyMode      = KEYMODE_JA_FULL_HIRAGANA;
     }
@@ -334,6 +345,9 @@
                 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
                                               OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY));
             }
+        } else if (mEnableHardware12Keyboard) {
+            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                          OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_12KEY));
         } else {
             mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
                                           OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY));
@@ -511,7 +525,7 @@
             break;
 
         case KEYCODE_JP12_REVERSE:
-            if (!mNoInput) {
+            if (!mNoInput && !mEnableHardware12Keyboard) {
                 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.TOGGLE_REVERSE_CHAR, mCurrentCycleTable));
             }
             break;
@@ -684,7 +698,13 @@
     /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#setPreferences */
     @Override public void setPreferences(SharedPreferences pref, EditorInfo editor) {
         mPrefEditor = pref.edit();
-        boolean isQwerty = pref.getBoolean("opt_enable_qwerty", false);
+        boolean isQwerty;
+        if (OpenWnn.isXLarge()) {
+            isQwerty = pref.getBoolean("opt_enable_qwerty", true);
+        } else {
+            isQwerty = pref.getBoolean("opt_enable_qwerty", false);
+        }
+
         if (isQwerty && (mCurrentKeyboardType == KEYBOARD_12KEY)) {
             changeKeyboardType(KEYBOARD_QWERTY);
         }
@@ -729,6 +749,8 @@
         case EditorInfo.TYPE_CLASS_PHONE:
             if (mHardKeyboardHidden) {
                 mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_PHONE};
+            } else if (mEnableHardware12Keyboard) {
+                mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_NUMBER};
             } else {
                 mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_ALPHABET};
             }
@@ -836,65 +858,83 @@
      */
     private void createKeyboardsPortrait(OpenWnn parent) {
         Keyboard[][] keyList;
-        /* qwerty shift_off (portrait) */
-        keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana);
-        keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+        if (OpenWnn.isXLarge()) {
+            /* qwerty shift_off (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
 
-        /* qwerty shift_on (portrait) */
-        keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana_shift);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana_shift);
-        keyList[KEYMODE_JA_HALF_PHONE][0] =
-            mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
+            /* qwerty shift_on (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
+            keyList[KEYMODE_JA_HALF_PHONE][0] =
+                mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
+        } else {
+            /* qwerty shift_off (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+
+            /* qwerty shift_on (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana_shift);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana_shift);
+            keyList[KEYMODE_JA_HALF_PHONE][0] =
+                mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
 
 
-        /* 12-keys shift_off (portrait) */
-        keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_12keyjp);
-        keyList[KEYMODE_JA_FULL_HIRAGANA][1] = new Keyboard(parent, R.xml.keyboard_12keyjp_input);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet);
-        keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_full_num);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana);
-        keyList[KEYMODE_JA_FULL_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana_input);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet);
-        keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_half_num);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana);
-        keyList[KEYMODE_JA_HALF_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana_input);
-        keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+            /* 12-keys shift_off (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_12keyjp);
+            keyList[KEYMODE_JA_FULL_HIRAGANA][1] = new Keyboard(parent, R.xml.keyboard_12keyjp_input);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet);
+            keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_full_num);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana);
+            keyList[KEYMODE_JA_FULL_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana_input);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet);
+            keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_half_num);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana);
+            keyList[KEYMODE_JA_HALF_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana_input);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
 
-        /* 12-keys shift_on (portrait) */
-        keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
-        keyList[KEYMODE_JA_FULL_HIRAGANA]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA];
-        keyList[KEYMODE_JA_FULL_ALPHABET]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
-        keyList[KEYMODE_JA_FULL_NUMBER]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
-        keyList[KEYMODE_JA_FULL_KATAKANA]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_KATAKANA];
-        keyList[KEYMODE_JA_HALF_ALPHABET]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
-        keyList[KEYMODE_JA_HALF_NUMBER]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
-        keyList[KEYMODE_JA_HALF_KATAKANA]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA];
-        keyList[KEYMODE_JA_HALF_PHONE]
-            = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
-
+            /* 12-keys shift_on (portrait) */
+            keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA];
+            keyList[KEYMODE_JA_FULL_ALPHABET]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
+            keyList[KEYMODE_JA_FULL_NUMBER]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
+            keyList[KEYMODE_JA_FULL_KATAKANA]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_KATAKANA];
+            keyList[KEYMODE_JA_HALF_ALPHABET]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
+            keyList[KEYMODE_JA_HALF_NUMBER]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
+            keyList[KEYMODE_JA_HALF_KATAKANA]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA];
+            keyList[KEYMODE_JA_HALF_PHONE]
+                = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
+        }
     }
 
     /**
@@ -903,71 +943,84 @@
      * @param parent  The context
      */
     private void createKeyboardsLandscape(OpenWnn parent) {
-    	/*
         Keyboard[][] keyList;
-        */
-        /* qwerty shift_off (landscape) */
-        /*
-        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_landscape);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_landscape);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_landscape);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana_landscape);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_landscape);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_landscape);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana_landscape);
-        keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone_landscape);
-        */
-        /* qwerty shift_on (landscape) */
-        /*
-        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift_landscape);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift_landscape);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift_landscape);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana_shift_landscape);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift_landscape);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift_landscape);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana_shift_landscape);
-        keyList[KEYMODE_JA_HALF_PHONE][0] =
-            mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
-        */
-        /* 12-keys shift_off (landscape) */
-        /*
-        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
-        keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_12keyjp_landscape);
-        keyList[KEYMODE_JA_FULL_HIRAGANA][1] = new Keyboard(parent, R.xml.keyboard_12keyjp_input_landscape);
-        keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_landscape);
-        keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input_landscape);
-        keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_full_num_landscape);
-        keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana_landscape);
-        keyList[KEYMODE_JA_FULL_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana_input_landscape);
-        keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_landscape);
-        keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input_landscape);
-        keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_half_num_landscape);
-        keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana_landscape);
-        keyList[KEYMODE_JA_HALF_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana_input_landscape);
-        keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone_landscape);
-        */
-        /* 12-keys shift_on (landscape) */
-        /*
-        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
-        keyList[KEYMODE_JA_FULL_HIRAGANA]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA];
-        keyList[KEYMODE_JA_FULL_ALPHABET]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
-        keyList[KEYMODE_JA_FULL_NUMBER]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
-        keyList[KEYMODE_JA_FULL_KATAKANA]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_KATAKANA];
-        keyList[KEYMODE_JA_HALF_ALPHABET]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
-        keyList[KEYMODE_JA_HALF_NUMBER]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
-        keyList[KEYMODE_JA_HALF_KATAKANA]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA];
-        keyList[KEYMODE_JA_HALF_PHONE]
-            = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
-        */
+        if (OpenWnn.isXLarge()) {
+            /* qwerty shift_off (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+
+            /* qwerty shift_on (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
+            keyList[KEYMODE_JA_HALF_PHONE][0] =
+                mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
+        } else {
+            /* qwerty shift_off (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+
+            /* qwerty shift_on (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_katakana_shift);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_katakana_shift);
+            keyList[KEYMODE_JA_HALF_PHONE][0] =
+                mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
+
+
+            /* 12-keys shift_off (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
+            keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_12keyjp);
+            keyList[KEYMODE_JA_FULL_HIRAGANA][1] = new Keyboard(parent, R.xml.keyboard_12keyjp_input);
+            keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet);
+            keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input);
+            keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_full_num);
+            keyList[KEYMODE_JA_FULL_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana);
+            keyList[KEYMODE_JA_FULL_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_full_katakana_input);
+            keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet);
+            keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input);
+            keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_12key_half_num);
+            keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana);
+            keyList[KEYMODE_JA_HALF_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_half_katakana_input);
+            keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
+
+            /* 12-keys shift_on (landscape) */
+            keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
+            keyList[KEYMODE_JA_FULL_HIRAGANA]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA];
+            keyList[KEYMODE_JA_FULL_ALPHABET]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
+            keyList[KEYMODE_JA_FULL_NUMBER]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
+            keyList[KEYMODE_JA_FULL_KATAKANA]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_KATAKANA];
+            keyList[KEYMODE_JA_HALF_ALPHABET]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
+            keyList[KEYMODE_JA_HALF_NUMBER]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
+            keyList[KEYMODE_JA_HALF_KATAKANA]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA];
+            keyList[KEYMODE_JA_HALF_PHONE]
+                = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
+         }
     }
 
     /**
@@ -1140,13 +1193,19 @@
     @Override public void setHardKeyboardHidden(boolean hidden) {
         if (mWnn != null) {
             if (!hidden) {
-                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
-                                              OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY));
+                if (mEnableHardware12Keyboard) {
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                                  OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_12KEY));
+                } else {
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                                  OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY));
+                }
             }
 
             if (mHardKeyboardHidden != hidden) {
                 if ((mLimitedKeyMode != null)
-                    || ((mCurrentKeyMode != KEYMODE_JA_FULL_HIRAGANA)
+                    || (!mEnableHardware12Keyboard
+                        && (mCurrentKeyMode != KEYMODE_JA_FULL_HIRAGANA)
                         && (mCurrentKeyMode != KEYMODE_JA_HALF_ALPHABET))) {
 
                     mLastInputType = EditorInfo.TYPE_NULL;
@@ -1159,6 +1218,22 @@
         super.setHardKeyboardHidden(hidden);
     }
 
+    /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#setHardware12Keyboard */
+    @Override public void setHardware12Keyboard(boolean type12Key) {
+        if (mWnn != null) {
+            if (mEnableHardware12Keyboard != type12Key) {
+                if (type12Key) {
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                                  OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_12KEY));
+                } else {
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                                  OpenWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY));
+                }
+            }
+        }
+        super.setHardware12Keyboard(type12Key);
+    }
+
     /**
      * Change the key-mode to the allowed one which is restricted
      *  by the text input field or the type of the keyboard.
@@ -1170,7 +1245,7 @@
         int[] limits = mLimitedKeyMode;
 
         if (!mHardKeyboardHidden) { /* for hardware keyboard */
-            if ((targetMode != KEYMODE_JA_FULL_HIRAGANA)
+            if (!mEnableHardware12Keyboard && (targetMode != KEYMODE_JA_FULL_HIRAGANA)
                 && (targetMode != KEYMODE_JA_HALF_ALPHABET)) {
 
                 Locale locale = Locale.getDefault();
@@ -1219,4 +1294,98 @@
 
         return targetMode;
     }
+
+    /**
+     * Shows input mode choosing dialog.
+     *
+     * @return boolean
+     */
+    public boolean showInputModeSwitchDialog() {
+        BaseInputView baseInputView = (BaseInputView)getCurrentView();
+        AlertDialog.Builder builder = new AlertDialog.Builder(baseInputView.getContext());
+        builder.setCancelable(true);
+        builder.setNegativeButton(R.string.dialog_button_cancel, null);
+ 
+        Resources r = baseInputView.getResources();
+        CharSequence itemFullHirakana = r.getString(R.string.ti_input_mode_full_hirakana_title_txt);
+        CharSequence itemFullKatakana = r.getString(R.string.ti_input_mode_full_katakana_title_txt);
+        CharSequence itemHalfKatakana = r.getString(R.string.ti_input_mode_half_katakana_title_txt);
+        CharSequence itemFullAlphabet = r.getString(R.string.ti_input_mode_full_alphabet_title_txt);
+        CharSequence itemHalfAlphabet = r.getString(R.string.ti_input_mode_half_alphabet_title_txt);
+        CharSequence itemFullNumber = r.getString(R.string.ti_input_mode_full_number_title_txt);
+        CharSequence itemHalfNumber = r.getString(R.string.ti_input_mode_half_number_title_txt);
+        final CharSequence[] itemTitles;
+        final int[] itemValues;
+        if (OpenWnn.isXLarge()) {
+            itemTitles = new CharSequence[] {itemFullHirakana, itemHalfAlphabet,
+                                                itemFullNumber, itemHalfNumber};
+            itemValues = new int[] {KEYMODE_JA_FULL_HIRAGANA, KEYMODE_JA_HALF_ALPHABET,
+                                        KEYMODE_JA_FULL_NUMBER, KEYMODE_JA_HALF_NUMBER};
+        } else {
+            itemTitles = new CharSequence[] {itemFullHirakana, itemFullKatakana, itemHalfKatakana,
+                                               itemFullAlphabet, itemHalfAlphabet, itemFullNumber,
+                                               itemHalfNumber};
+            itemValues = new int[] {KEYMODE_JA_FULL_HIRAGANA, KEYMODE_JA_FULL_KATAKANA, KEYMODE_JA_HALF_KATAKANA,
+                    KEYMODE_JA_FULL_ALPHABET, KEYMODE_JA_HALF_ALPHABET, KEYMODE_JA_FULL_NUMBER, KEYMODE_JA_HALF_NUMBER};
+        }
+
+        builder.setSingleChoiceItems(itemTitles, findIndexOfValue(itemValues,
+                mCurrentKeyMode), new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface inputModeSwitchDialog, int position) {
+                switch(position){
+                    case 0:
+                        changeKeyMode(itemValues[0]);
+                        break;
+ 
+                    case 1:
+                        changeKeyMode(itemValues[1]);
+                        break;
+ 
+                    case 2:
+                        changeKeyMode(itemValues[2]);
+                        break;
+ 
+                    case 3:
+                        changeKeyMode(itemValues[3]);
+                        break;
+ 
+                    case 4:
+                        changeKeyMode(itemValues[4]);
+                        break;
+ 
+                    case 5:
+                        changeKeyMode(itemValues[5]);
+                        break;
+ 
+                    case 6:
+                        changeKeyMode(itemValues[6]);
+                        break;
+ 
+                    default:
+                        break;
+                }
+                inputModeSwitchDialog.dismiss();
+            }
+        });
+ 
+        builder.setTitle(r.getString(R.string.ti_long_press_dialog_input_mode_txt));
+        baseInputView.showDialog(builder);
+        return true;
+    }
+
+    /**
+     * Finds the index of a value in a int[].
+     *
+     * @param value   the int[] to search in,
+     * @param mode    the value need to find index,
+     * @return the index of the value.
+     */
+    private int findIndexOfValue(int[] value, int mode) {
+        for (int i = 0; i < value.length; i++) {
+            if (value[i] == mode) {
+                return i;
+            }
+        }
+        return -1;
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/KanaConverter.java b/src/jp/co/omronsoft/openwnn/JAJP/KanaConverter.java
index 05d1199..a6378bb 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/KanaConverter.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/KanaConverter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/KeyboardListPreferenceJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/KeyboardListPreferenceJAJP.java
index 2c60599..3c93e0a 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/KeyboardListPreferenceJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/KeyboardListPreferenceJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnClauseConverterJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnClauseConverterJAJP.java
index 7114e52..fb0145f 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnClauseConverterJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnClauseConverterJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -539,4 +539,4 @@
     private WnnClause defaultClause(String input) {
         return (new WnnClause(input, input, mPosDefault, (CLAUSE_COST - 1) * input.length()));
     }
-}
+}
\ No newline at end of file
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnEngineJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnEngineJAJP.java
index 1181202..900a4ea 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnEngineJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/OpenWnnEngineJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
 /**
  * The OpenWnn engine class for Japanese IME.
  * 
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public class OpenWnnEngineJAJP implements WnnEngine {
     /** Current dictionary type */
@@ -78,7 +78,10 @@
     public static final int MAX_OUTPUT_LENGTH = 50;
     /** Limitation of predicted candidates */
     public static final int PREDICT_LIMIT = 100;
-   
+
+    /** Limitation of candidates one-line */
+    public static final int LIMIT_OF_CANDIDATES_1LINE = 500;
+
     /** OpenWnn dictionary */
     private WnnDictionary mDictionaryJP;
 
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/Romkan.java b/src/jp/co/omronsoft/openwnn/JAJP/Romkan.java
index 797b81e..398b589 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/Romkan.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/Romkan.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/RomkanFullKatakana.java b/src/jp/co/omronsoft/openwnn/JAJP/RomkanFullKatakana.java
index 37fd6ed..d070686 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/RomkanFullKatakana.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/RomkanFullKatakana.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/RomkanHalfKatakana.java b/src/jp/co/omronsoft/openwnn/JAJP/RomkanHalfKatakana.java
index b119fe8..867caf2 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/RomkanHalfKatakana.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/RomkanHalfKatakana.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/TutorialJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/TutorialJAJP.java
index edf5ddd..d94f019 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/TutorialJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/TutorialJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsEditJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsEditJAJP.java
index 8966038..45d81cd 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsEditJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsEditJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsListJAJP.java b/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsListJAJP.java
index 87d1e4d..a5c1c63 100644
--- a/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsListJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsListJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
 package jp.co.omronsoft.openwnn.JAJP;
 
 import jp.co.omronsoft.openwnn.*;
+import android.os.Bundle;
 import android.view.View;
 import android.view.Window;
 import java.util.Comparator;
@@ -36,10 +37,10 @@
         mPackageName  = "jp.co.omronsoft.openwnn";
     }
 
-    /** @see jp.co.omronsoft.openwnn.UserDictionaryToolsList#headerCreate */
-    @Override protected void headerCreate() {
-      getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
-    		  R.layout.user_dictionary_tools_list_header_ja);
+    /** @see jp.co.omronsoft.iwnnime.ml.UserDictionaryToolsList#onCreate */
+    @Override protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTitle(R.string.user_dictionary_list_words_ja);
     }
 
     /** @see jp.co.omronsoft.openwnn.UserDictionaryToolsList#createUserDictionaryToolsEdit */
diff --git a/src/jp/co/omronsoft/openwnn/KeyAction.java b/src/jp/co/omronsoft/openwnn/KeyAction.java
new file mode 100644
index 0000000..b956670
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/KeyAction.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package jp.co.omronsoft.openwnn;
+
+public class KeyAction {
+    /** KeyDownAction*/
+    boolean mConsumeDownEvent;
+    /** KeyCode*/
+    int  mKeyCode;
+}
diff --git a/src/jp/co/omronsoft/openwnn/Keyboard.java b/src/jp/co/omronsoft/openwnn/Keyboard.java
new file mode 100644
index 0000000..1f5f648
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/Keyboard.java
@@ -0,0 +1,861 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * This file is porting from Android framework.
+ *   frameworks/base/core/java/android/inputmethodservice/Keyboard.java
+ *
+ * package android.inputmethodservice;
+ */
+package jp.co.omronsoft.openwnn;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.TypedValue;
+import android.util.Xml;
+import android.util.DisplayMetrics;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+/**
+ * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
+ * consists of rows of keys.
+ * <p>The layout file for a keyboard contains XML that looks like the following snippet:</p>
+ * <pre>
+ * &lt;Keyboard
+ *         android:keyWidth="%10p"
+ *         android:keyHeight="50px"
+ *         android:horizontalGap="2px"
+ *         android:verticalGap="2px" &gt;
+ *     &lt;Row android:keyWidth="32px" &gt;
+ *         &lt;Key android:keyLabel="A" /&gt;
+ *         ...
+ *     &lt;/Row&gt;
+ *     ...
+ * &lt;/Keyboard&gt;
+ * </pre>
+ */
+public class Keyboard {
+
+    static final String TAG = "Keyboard";
+
+    private static final String TAG_KEYBOARD = "Keyboard";
+    private static final String TAG_ROW = "Row";
+    private static final String TAG_KEY = "Key";
+
+    /** Edge of left */
+    public static final int EDGE_LEFT = 0x01;
+
+    /** Edge of right */
+    public static final int EDGE_RIGHT = 0x02;
+
+    /** Edge of top */
+    public static final int EDGE_TOP = 0x04;
+
+    /** Edge of bottom */
+    public static final int EDGE_BOTTOM = 0x08;
+
+    /** Keycode of SHIFT */
+    public static final int KEYCODE_SHIFT = -1;
+
+    /** Keycode of MODE_CHANGE */
+    public static final int KEYCODE_MODE_CHANGE = -2;
+
+    /** Keycode of CANCEL */
+    public static final int KEYCODE_CANCEL = -3;
+
+    /** Keycode of DONE */
+    public static final int KEYCODE_DONE = -4;
+
+    /** Keycode of DELETE */
+    public static final int KEYCODE_DELETE = -5;
+
+    /** Keycode of ALT */
+    public static final int KEYCODE_ALT = -6;
+ 
+    /** Keyboard label **/
+    private CharSequence mLabel;
+
+    /** Horizontal gap default for all rows */
+    private int mDefaultHorizontalGap;
+ 
+    /** Default key width */
+    private int mDefaultWidth;
+
+    /** Default key height */
+    private int mDefaultHeight;
+
+    /** Default gap between rows */
+    private int mDefaultVerticalGap;
+
+    /** Is the keyboard in the shifted state */
+    private boolean mShifted;
+ 
+    /** Key instance for the shift key, if present */
+    private Key mShiftKey;
+
+    /** Key index for the shift key, if present */
+    private int mShiftKeyIndex = -1;
+ 
+    /** Current key width, while loading the keyboard */
+    private int mKeyWidth;
+ 
+    /** Current key height, while loading the keyboard */
+    private int mKeyHeight;
+ 
+    /** Total height of the keyboard, including the padding and keys */
+    private int mTotalHeight;
+ 
+    /** 
+     * Total width of the keyboard, including left side gaps and keys, but not any gaps on the
+     * right side.
+     */
+    private int mTotalWidth;
+
+    /** List of keys in this keyboard */
+    private List<Key> mKeys;
+
+    /** List of modifier keys such as Shift & Alt, if any */
+    private List<Key> mModifierKeys;
+
+    /** Width of the screen available to fit the keyboard */
+    private int mDisplayWidth;
+
+    /** Height of the screen */
+    private int mDisplayHeight;
+
+    /** Keyboard mode, or zero, if none.  */
+    private int mKeyboardMode;
+
+ 
+    private static final int GRID_WIDTH = 10;
+    private static final int GRID_HEIGHT = 5;
+    private static final int GRID_SIZE = GRID_WIDTH * GRID_HEIGHT;
+    private int mCellWidth;
+    private int mCellHeight;
+    private int[][] mGridNeighbors;
+    private int mProximityThreshold;
+    /** Number of key widths from current touch point to search for nearest keys. */
+    private static float SEARCH_DISTANCE = 1.8f;
+
+    /**
+     * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
+     * Some of the key size defaults can be overridden per row from what the {@link Keyboard}
+     * defines.
+     */
+    public static class Row {
+        /** Default width of a key in this row. */
+        public int defaultWidth;
+        /** Default height of a key in this row. */
+        public int defaultHeight;
+        /** Default horizontal gap between keys in this row. */
+        public int defaultHorizontalGap;
+        /** Vertical gap following this row. */
+        public int verticalGap;
+        /**
+         * Edge flags for this row of keys. Possible values that can be assigned are
+         * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
+         */
+        public int rowEdgeFlags;
+ 
+        /** The keyboard mode for this row */
+        public int mode;
+ 
+        private Keyboard parent;
+
+        /** Constructor */
+        public Row(Keyboard parent) {
+            this.parent = parent;
+        }
+ 
+        /** Constructor */
+        public Row(Resources res, Keyboard parent, XmlResourceParser parser) {
+            this.parent = parent;
+            TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
+                    android.R.styleable.Keyboard);
+            defaultWidth = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_keyWidth,
+                    parent.mDisplayWidth, parent.mDefaultWidth);
+            defaultHeight = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_keyHeight,
+                    parent.mDisplayHeight, parent.mDefaultHeight);
+            defaultHorizontalGap = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_horizontalGap,
+                    parent.mDisplayWidth, parent.mDefaultHorizontalGap);
+            verticalGap = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_verticalGap,
+                    parent.mDisplayHeight, parent.mDefaultVerticalGap);
+            a.recycle();
+            a = res.obtainAttributes(Xml.asAttributeSet(parser),
+                    android.R.styleable.Keyboard_Row);
+            rowEdgeFlags = a.getInt(android.R.styleable.Keyboard_Row_rowEdgeFlags, 0);
+            mode = a.getResourceId(android.R.styleable.Keyboard_Row_keyboardMode,
+                    0);
+        }
+    }
+
+    /**
+     * Class for describing the position and characteristics of a single key in the keyboard.
+     */
+    public static class Key {
+        /**
+         * All the key codes (unicode or custom code) that this key could generate, zero'th
+         * being the most important.
+         */
+        public int[] codes;
+ 
+        /** Label to display */
+        public CharSequence label;
+ 
+        /** Icon to display instead of a label. Icon takes precedence over a label */
+        public Drawable icon;
+        /** Preview version of the icon, for the preview popup */
+        public Drawable iconPreview;
+        /** Width of the key, not including the gap */
+        public int width;
+        /** Height of the key, not including the gap */
+        public int height;
+        /** The horizontal gap before this key */
+        public int gap;
+        /** Whether this key is sticky, i.e., a toggle key */
+        public boolean sticky;
+        /** X coordinate of the key in the keyboard layout */
+        public int x;
+        /** Y coordinate of the key in the keyboard layout */
+        public int y;
+        /** The current pressed state of this key */
+        public boolean pressed;
+        /** If this is a sticky key, is it on? */
+        public boolean on;
+        /** Text to output when pressed. This can be multiple characters, like ".com" */
+        public CharSequence text;
+        /** Popup characters */
+        public CharSequence popupCharacters;
+ 
+        /**
+         * Flags that specify the anchoring to edges of the keyboard for detecting touch events
+         * that are just out of the boundary of the key. This is a bit mask of
+         * {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT}, {@link Keyboard#EDGE_TOP} and
+         * {@link Keyboard#EDGE_BOTTOM}.
+         */
+        public int edgeFlags;
+        /** Whether this is a modifier key, such as Shift or Alt */
+        public boolean modifier;
+        /** The keyboard that this key belongs to */
+        private Keyboard keyboard;
+        /**
+         * If this key pops up a mini keyboard, this is the resource id for the XML layout for that
+         * keyboard.
+         */
+        public int popupResId;
+        /** Whether this key repeats itself when held down */
+        public boolean repeatable;
+        /** Whether this key is 2nd key */
+        public boolean isSecondKey;
+
+        private final static int[] KEY_STATE_NORMAL_ON = {
+            android.R.attr.state_checkable,
+            android.R.attr.state_checked
+        };
+        
+        private final static int[] KEY_STATE_PRESSED_ON = {
+            android.R.attr.state_pressed,
+            android.R.attr.state_checkable,
+            android.R.attr.state_checked
+        };
+ 
+        private final static int[] KEY_STATE_NORMAL_OFF = { 
+            android.R.attr.state_checkable 
+        };
+
+        private final static int[] KEY_STATE_PRESSED_OFF = { 
+            android.R.attr.state_pressed, 
+            android.R.attr.state_checkable 
+        };
+ 
+        private final static int[] KEY_STATE_NORMAL = {
+        };
+ 
+        private final static int[] KEY_STATE_PRESSED = {
+            android.R.attr.state_pressed
+        };
+
+        /** Create an empty key with no attributes. */
+        public Key(Row parent) {
+            keyboard = parent.parent;
+            height = parent.defaultHeight;
+            width = parent.defaultWidth;
+            gap = parent.defaultHorizontalGap;
+            edgeFlags = parent.rowEdgeFlags;
+        }
+ 
+        /** Create a key with the given top-left coordinate and extract its attributes from
+         * the XML parser.
+         * @param res resources associated with the caller's context
+         * @param parent the row that this key belongs to. The row must already be attached to
+         * a {@link Keyboard}.
+         * @param x the x coordinate of the top-left
+         * @param y the y coordinate of the top-left
+         * @param parser the XML parser containing the attributes for this key
+         */
+        public Key(Resources res, Row parent, int x, int y, XmlResourceParser parser) {
+            this(parent);
+
+            this.x = x;
+            this.y = y;
+ 
+            TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), 
+                    android.R.styleable.Keyboard);
+
+            width = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_keyWidth,
+                    keyboard.mDisplayWidth, parent.defaultWidth);
+            height = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_keyHeight,
+                    keyboard.mDisplayHeight, parent.defaultHeight);
+            gap = getDimensionOrFraction(a,
+                    android.R.styleable.Keyboard_horizontalGap,
+                    keyboard.mDisplayWidth, parent.defaultHorizontalGap);
+            a.recycle();
+            a = res.obtainAttributes(Xml.asAttributeSet(parser),
+                    android.R.styleable.Keyboard_Key);
+            this.x += gap;
+            TypedValue codesValue = new TypedValue();
+            a.getValue(android.R.styleable.Keyboard_Key_codes,
+                    codesValue);
+            if (codesValue.type == TypedValue.TYPE_INT_DEC
+                    || codesValue.type == TypedValue.TYPE_INT_HEX) {
+                codes = new int[] { codesValue.data };
+            } else if (codesValue.type == TypedValue.TYPE_STRING) {
+                codes = parseCSV(codesValue.string.toString());
+            }
+ 
+            iconPreview = a.getDrawable(android.R.styleable.Keyboard_Key_iconPreview);
+            if (iconPreview != null) {
+                iconPreview.setBounds(0, 0, iconPreview.getIntrinsicWidth(),
+                        iconPreview.getIntrinsicHeight());
+            }
+            popupCharacters = a.getText(
+                    android.R.styleable.Keyboard_Key_popupCharacters);
+            popupResId = a.getResourceId(
+                    android.R.styleable.Keyboard_Key_popupKeyboard, 0);
+            repeatable = a.getBoolean(
+                    android.R.styleable.Keyboard_Key_isRepeatable, false);
+            modifier = a.getBoolean(
+                    android.R.styleable.Keyboard_Key_isModifier, false);
+            sticky = a.getBoolean(
+                    android.R.styleable.Keyboard_Key_isSticky, false);
+            edgeFlags = a.getInt(android.R.styleable.Keyboard_Key_keyEdgeFlags, 0);
+            edgeFlags |= parent.rowEdgeFlags;
+
+            icon = a.getDrawable(
+                    android.R.styleable.Keyboard_Key_keyIcon);
+            if (icon != null) {
+                icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+            }
+            label = a.getText(android.R.styleable.Keyboard_Key_keyLabel);
+            text = a.getText(android.R.styleable.Keyboard_Key_keyOutputText);
+ 
+            if (codes == null && !TextUtils.isEmpty(label)) {
+                codes = new int[] { label.charAt(0) };
+            }
+            a.recycle();
+            a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.WnnKeyboard_Key);
+            isSecondKey = a.getBoolean(R.styleable.WnnKeyboard_Key_isSecondKey, false);
+            a.recycle();
+        }
+ 
+        /**
+         * Informs the key that it has been pressed, in case it needs to change its appearance or
+         * state.
+         * @see #onReleased(boolean)
+         */
+        public void onPressed() {
+            pressed = !pressed;
+        }
+ 
+        /**
+         * Changes the pressed state of the key. If it is a sticky key, it will also change the
+         * toggled state of the key if the finger was release inside.
+         * @param inside whether the finger was released inside the key
+         * @see #onPressed()
+         */
+        public void onReleased(boolean inside) {
+            pressed = !pressed;
+            if (sticky) {
+                on = !on;
+            }
+        }
+
+        int[] parseCSV(String value) {
+            int count = 0;
+            int lastIndex = 0;
+            if (value.length() > 0) {
+                count++;
+                while ((lastIndex = value.indexOf(",", lastIndex + 1)) > 0) {
+                    count++;
+                }
+            }
+            int[] values = new int[count];
+            count = 0;
+            StringTokenizer st = new StringTokenizer(value, ",");
+            while (st.hasMoreTokens()) {
+                try {
+                    values[count++] = Integer.parseInt(st.nextToken());
+                } catch (NumberFormatException nfe) {
+                    Log.e(TAG, "Error parsing keycodes " + value);
+                }
+            }
+            return values;
+        }
+
+        /**
+         * Detects if a point falls inside this key.
+         * @param x the x-coordinate of the point
+         * @param y the y-coordinate of the point
+         * @return whether or not the point falls inside the key. If the key is attached to an edge,
+         * it will assume that all points between the key and the edge are considered to be inside
+         * the key.
+         */
+        public boolean isInside(int x, int y) {
+            boolean leftEdge = (edgeFlags & EDGE_LEFT) > 0;
+            boolean rightEdge = (edgeFlags & EDGE_RIGHT) > 0;
+            boolean topEdge = (edgeFlags & EDGE_TOP) > 0;
+            boolean bottomEdge = (edgeFlags & EDGE_BOTTOM) > 0;
+            if ((x >= this.x || (leftEdge && x <= this.x + this.width))
+                    && (x < this.x + this.width || (rightEdge && x >= this.x))
+                    && (y >= this.y || (topEdge && y <= this.y + this.height))
+                    && (y < this.y + this.height || (bottomEdge && y >= this.y))) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        /**
+         * Detects if a area falls inside this key.
+         * @param x the x-coordinate of the area
+         * @param y the y-coordinate of the area
+         * @param w the width of the area
+         * @param h the height of the area
+         * @return whether or not the area falls inside the key.
+         */
+        public boolean isInside(int x, int y, int w, int h) {
+            if ((this.x <= (x + w)) && (x <= (this.x + this.width))
+                    && (this.y <= (y + h)) && (y <= (this.y + this.height))) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        /**
+         * Returns the square of the distance between the center of the key and the given point.
+         * @param x the x-coordinate of the point
+         * @param y the y-coordinate of the point
+         * @return the square of the distance of the point from the center of the key
+         */
+        public int squaredDistanceFrom(int x, int y) {
+            int xDist = this.x + width / 2 - x;
+            int yDist = this.y + height / 2 - y;
+            return xDist * xDist + yDist * yDist;
+        }
+
+        /**
+         * Returns the drawable state for the key, based on the current state and type of the key.
+         * @return the drawable state of the key.
+         * @see android.graphics.drawable.StateListDrawable#setState(int[])
+         */
+        public int[] getCurrentDrawableState() {
+            int[] states = KEY_STATE_NORMAL;
+
+            if (on) {
+                if (pressed) {
+                    states = KEY_STATE_PRESSED_ON;
+                } else {
+                    states = KEY_STATE_NORMAL_ON;
+                }
+            } else {
+                if (sticky) {
+                    if (pressed) {
+                        states = KEY_STATE_PRESSED_OFF;
+                    } else {
+                        states = KEY_STATE_NORMAL_OFF;
+                    }
+                } else {
+                    if (pressed) {
+                        states = KEY_STATE_PRESSED;
+                    }
+                }
+            }
+            return states;
+        }
+    }
+
+    /**
+     * Creates a keyboard from the given xml key layout file.
+     * @param context the application or service context
+     * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
+     */
+    public Keyboard(Context context, int xmlLayoutResId) {
+        this(context, xmlLayoutResId, 0);
+    }
+
+    /**
+     * Creates a keyboard from the given xml key layout file. Weeds out rows
+     * that have a keyboard mode defined but don't match the specified mode.
+     * @param context the application or service context
+     * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
+     * @param modeId keyboard mode identifier
+     */
+    public Keyboard(Context context, int xmlLayoutResId, int modeId) {
+        DisplayMetrics dm = context.getResources().getDisplayMetrics();
+        mDisplayWidth = dm.widthPixels;
+        mDisplayHeight = dm.heightPixels;
+
+        mDefaultHorizontalGap = 0;
+        mDefaultWidth = mDisplayWidth / 10;
+        mDefaultVerticalGap = 0;
+        mDefaultHeight = mDefaultWidth;
+        mKeys = new ArrayList<Key>();
+        mModifierKeys = new ArrayList<Key>();
+        mKeyboardMode = modeId;
+        loadKeyboard(context, context.getResources().getXml(xmlLayoutResId));
+    }
+
+    /**
+     * <p>Creates a blank keyboard from the given resource file and populates it with the specified
+     * characters in left-to-right, top-to-bottom fashion, using the specified number of columns.
+     * </p>
+     * <p>If the specified number of columns is -1, then the keyboard will fit as many keys as
+     * possible in each row.</p>
+     * @param context the application or service context
+     * @param layoutTemplateResId the layout template file, containing no keys.
+     * @param characters the list of characters to display on the keyboard. One key will be created
+     * for each character.
+     * @param columns the number of columns of keys to display. If this number is greater than the
+     * number of keys that can fit in a row, it will be ignored. If this number is -1, the
+     * keyboard will fit as many keys as possible in each row.
+     */
+    public Keyboard(Context context, int layoutTemplateResId,
+            CharSequence characters, int columns, int horizontalPadding) {
+        this(context, layoutTemplateResId);
+        int x = 0;
+        int y = 0;
+        int column = 0;
+        mTotalWidth = 0;
+ 
+        Row row = new Row(this);
+        row.defaultHeight = mDefaultHeight;
+        row.defaultWidth = mDefaultWidth;
+        row.defaultHorizontalGap = mDefaultHorizontalGap;
+        row.verticalGap = mDefaultVerticalGap;
+        row.rowEdgeFlags = EDGE_TOP | EDGE_BOTTOM;
+        final int maxColumns = columns == -1 ? Integer.MAX_VALUE : columns;
+        for (int i = 0; i < characters.length(); i++) {
+            char c = characters.charAt(i);
+            if (column >= maxColumns
+                    || x + mDefaultWidth + horizontalPadding > mDisplayWidth) {
+                x = 0;
+                y += mDefaultVerticalGap + mDefaultHeight;
+                column = 0;
+            }
+            final Key key = new Key(row);
+            key.x = x;
+            key.y = y;
+            key.label = String.valueOf(c);
+            key.codes = new int[] { c };
+            column++;
+            x += key.width + key.gap;
+            mKeys.add(key);
+            if (x > mTotalWidth) {
+                mTotalWidth = x;
+            }
+        }
+        mTotalHeight = y + mDefaultHeight;
+    }
+    
+    /**
+     * Get the list of keys in this keyboard.
+     *
+     * @return The list of keys.
+     */
+    public List<Key> getKeys() {
+        return mKeys;
+    }
+ 
+    /**
+     * Get the list of modifier keys such as Shift & Alt, if any.
+     *
+     * @return The list of modifier keys.
+     */
+    public List<Key> getModifierKeys() {
+        return mModifierKeys;
+    }
+ 
+    protected int getHorizontalGap() {
+        return mDefaultHorizontalGap;
+    }
+
+    protected void setHorizontalGap(int gap) {
+        mDefaultHorizontalGap = gap;
+    }
+
+    protected int getVerticalGap() {
+        return mDefaultVerticalGap;
+    }
+
+    protected void setVerticalGap(int gap) {
+        mDefaultVerticalGap = gap;
+    }
+
+    protected int getKeyHeight() {
+        return mDefaultHeight;
+    }
+
+    protected void setKeyHeight(int height) {
+        mDefaultHeight = height;
+    }
+
+    protected int getKeyWidth() {
+        return mDefaultWidth;
+    }
+ 
+    protected void setKeyWidth(int width) {
+        mDefaultWidth = width;
+    }
+
+    /**
+     * Returns the total height of the keyboard
+     * @return the total height of the keyboard
+     */
+    public int getHeight() {
+        return mTotalHeight;
+    }
+    
+    /**
+     * Returns the total minimum width of the keyboard
+     * @return the total minimum width of the keyboard
+     */
+    public int getMinWidth() {
+        return mTotalWidth;
+    }
+
+    /**
+     * Sets the keyboard to be shifted.
+     *
+     * @param shiftState  the keyboard shift state.
+     * @return {@code true} if shift state changed.
+     */
+    public boolean setShifted(boolean shiftState) {
+        if (mShiftKey != null) {
+            mShiftKey.on = shiftState;
+        }
+        if (mShifted != shiftState) {
+            mShifted = shiftState;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns whether keyboard is shift state or not.
+     *
+     * @return  {@code true} if keyboard is shift state; otherwise, {@code false}.
+     */
+    public boolean isShifted() {
+        return mShifted;
+    }
+
+    /**
+     * Returns the shift key index.
+     *
+     * @return  the shift key index.
+     */
+    public int getShiftKeyIndex() {
+        return mShiftKeyIndex;
+    }
+
+    private void computeNearestNeighbors() {
+        mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH;
+        mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT;
+        mGridNeighbors = new int[GRID_SIZE][];
+        int[] indices = new int[mKeys.size()];
+        final int gridWidth = GRID_WIDTH * mCellWidth;
+        final int gridHeight = GRID_HEIGHT * mCellHeight;
+        for (int x = 0; x < gridWidth; x += mCellWidth) {
+            for (int y = 0; y < gridHeight; y += mCellHeight) {
+                int count = 0;
+                for (int i = 0; i < mKeys.size(); i++) {
+                    final Key key = mKeys.get(i);
+                    if (key.squaredDistanceFrom(x, y) < mProximityThreshold ||
+                            key.squaredDistanceFrom(x + mCellWidth - 1, y) < mProximityThreshold ||
+                            key.squaredDistanceFrom(x + mCellWidth - 1, y + mCellHeight - 1) 
+                                < mProximityThreshold ||
+                            key.squaredDistanceFrom(x, y + mCellHeight - 1) < mProximityThreshold ||
+                            key.isInside(x, y, mCellWidth, mCellHeight)) {
+                        indices[count++] = i;
+                    }
+                }
+                int [] cell = new int[count];
+                System.arraycopy(indices, 0, cell, 0, count);
+                mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell;
+            }
+        }
+    }
+ 
+    /**
+     * Returns the indices of the keys that are closest to the given point.
+     * @param x the x-coordinate of the point
+     * @param y the y-coordinate of the point
+     * @return the array of integer indices for the nearest keys to the given point. If the given
+     * point is out of range, then an array of size zero is returned.
+     */
+    public int[] getNearestKeys(int x, int y) {
+        if (mGridNeighbors == null) computeNearestNeighbors();
+        if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) {
+            int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth);
+            if (index < GRID_SIZE) {
+                return mGridNeighbors[index];
+            }
+        }
+        return new int[0];
+    }
+
+    protected Row createRowFromXml(Resources res, XmlResourceParser parser) {
+        return new Row(res, this, parser);
+    }
+ 
+    protected Key createKeyFromXml(Resources res, Row parent, int x, int y,
+            XmlResourceParser parser) {
+        return new Key(res, parent, x, y, parser);
+    }
+
+    private void loadKeyboard(Context context, XmlResourceParser parser) {
+        boolean inKey = false;
+        boolean inRow = false;
+        boolean leftMostKey = false;
+        int row = 0;
+        int x = 0;
+        int y = 0;
+        Key key = null;
+        Row currentRow = null;
+        Resources res = context.getResources();
+        boolean skipRow = false;
+ 
+        try {
+            int event;
+            while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
+                if (event == XmlResourceParser.START_TAG) {
+                    String tag = parser.getName();
+                    if (TAG_ROW.equals(tag)) {
+                        inRow = true;
+                        x = 0;
+                        currentRow = createRowFromXml(res, parser);
+                        skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode;
+                        if (skipRow) {
+                            skipToEndOfRow(parser);
+                            inRow = false;
+                        }
+                   } else if (TAG_KEY.equals(tag)) {
+                        inKey = true;
+                        key = createKeyFromXml(res, currentRow, x, y, parser);
+                        mKeys.add(key);
+                        if (key.codes[0] == KEYCODE_SHIFT) {
+                            mShiftKey = key;
+                            mShiftKeyIndex = mKeys.size()-1;
+                            mModifierKeys.add(key);
+                        } else if (key.codes[0] == KEYCODE_ALT) {
+                            mModifierKeys.add(key);
+                        }
+                    } else if (TAG_KEYBOARD.equals(tag)) {
+                        parseKeyboardAttributes(res, parser);
+                    }
+                } else if (event == XmlResourceParser.END_TAG) {
+                    if (inKey) {
+                        inKey = false;
+                        x += key.gap + key.width;
+                        if (x > mTotalWidth) {
+                            mTotalWidth = x;
+                        }
+                    } else if (inRow) {
+                        inRow = false;
+                        y += currentRow.verticalGap;
+                        y += currentRow.defaultHeight;
+                        row++;
+                    } else {
+                    }
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Parse error:" + e);
+            e.printStackTrace();
+        }
+        mTotalHeight = y - mDefaultVerticalGap;
+    }
+
+    private void skipToEndOfRow(XmlResourceParser parser)
+            throws XmlPullParserException, IOException {
+        int event;
+        while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
+            if (event == XmlResourceParser.END_TAG
+                    && parser.getName().equals(TAG_ROW)) {
+                break;
+            }
+        }
+    }
+ 
+    private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) {
+        TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
+                android.R.styleable.Keyboard);
+
+        mDefaultWidth = getDimensionOrFraction(a,
+                android.R.styleable.Keyboard_keyWidth,
+                mDisplayWidth, mDisplayWidth / 10);
+        mDefaultHeight = getDimensionOrFraction(a,
+                android.R.styleable.Keyboard_keyHeight,
+                mDisplayHeight, 75);
+        mDefaultHorizontalGap = getDimensionOrFraction(a,
+                android.R.styleable.Keyboard_horizontalGap,
+                mDisplayWidth, 0);
+        mDefaultVerticalGap = getDimensionOrFraction(a,
+                android.R.styleable.Keyboard_verticalGap,
+                mDisplayHeight, 0);
+        mProximityThreshold = (int) (mDefaultWidth * SEARCH_DISTANCE);
+        mProximityThreshold = mProximityThreshold * mProximityThreshold;
+        a.recycle();
+    }
+
+    static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
+        TypedValue value = a.peekValue(index);
+        if (value == null) return defValue;
+        if (value.type == TypedValue.TYPE_DIMENSION) {
+            return a.getDimensionPixelOffset(index, defValue);
+        } else if (value.type == TypedValue.TYPE_FRACTION) {
+            return Math.round(a.getFraction(index, base, base, defValue));
+        }
+        return defValue;
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/KeyboardView.java b/src/jp/co/omronsoft/openwnn/KeyboardView.java
new file mode 100644
index 0000000..ebacaea
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/KeyboardView.java
@@ -0,0 +1,1517 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* This file is porting from Android framework.
+ *   frameworks/base/core/java/android/inputmethodservice/KeyboardView.java
+ *
+ *package android.inputmethodservice;
+ */
+
+package jp.co.omronsoft.openwnn;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.graphics.Paint.Align;
+import android.graphics.Region.Op;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.GestureDetector;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import jp.co.omronsoft.openwnn.Keyboard;
+import jp.co.omronsoft.openwnn.Keyboard.Key;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and
+ * detecting key presses and touch movements.
+ */
+public class KeyboardView extends View implements View.OnClickListener {
+
+    /**
+     * Listener for virtual keyboard events.
+     */
+    public interface OnKeyboardActionListener {
+ 
+        /**
+         * Called when the user presses a key. This is sent before the {@link #onKey} is called.
+         * For keys that repeat, this is only called once.
+         * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid
+         * key, the value will be zero.
+         */
+        void onPress(int primaryCode);
+ 
+        /**
+         * Called when the user releases a key. This is sent after the {@link #onKey} is called.
+         * For keys that repeat, this is only called once.
+         * @param primaryCode the code of the key that was released
+         */
+        void onRelease(int primaryCode);
+
+        /**
+         * Send a key press to the listener.
+         * @param primaryCode this is the key that was pressed
+         * @param keyCodes the codes for all the possible alternative keys
+         * with the primary code being the first. If the primary key code is
+         * a single character such as an alphabet or number or symbol, the alternatives
+         * will include other characters that may be on the same key or adjacent keys.
+         * These codes are useful to correct for accidental presses of a key adjacent to
+         * the intended key.
+         */
+        void onKey(int primaryCode, int[] keyCodes);
+
+        /**
+         * Sends a sequence of characters to the listener.
+         * @param text the sequence of characters to be displayed.
+         */
+        void onText(CharSequence text);
+
+        /**
+         * Called when the user quickly moves the finger from right to left.
+         */
+        void swipeLeft();
+
+        /**
+         * Called when the user quickly moves the finger from left to right.
+         */
+        void swipeRight();
+
+        /**
+         * Called when the user quickly moves the finger from up to down.
+         */
+        void swipeDown();
+
+        /**
+         * Called when the user quickly moves the finger from down to up.
+         */
+        void swipeUp();
+
+        /**
+         * Called when the user long presses a key.
+         * @param popupKey the key that was long pressed
+         * @return true if the long press is handled, false otherwise.
+         */
+        boolean onLongPress(Keyboard.Key key);
+    }
+
+    private static final int NOT_A_KEY = -1;
+    private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE };
+    private static final int[] LONG_PRESSABLE_STATE_SET = {
+        android.R.attr.state_long_pressable
+    };
+
+    private Keyboard mKeyboard;
+    private int mCurrentKeyIndex = NOT_A_KEY;
+    private int mLabelTextSize;
+    private int mKeyTextSize;
+    private int mKeyTextColor;
+    private int mKeyTextColor2nd;
+    private float mShadowRadius;
+    private int mShadowColor;
+    private float mBackgroundDimAmount;
+ 
+    private TextView mPreviewText;
+    private PopupWindow mPreviewPopup;
+    private int mPreviewTextSizeLarge;
+    private int mPreviewOffset;
+    private int mPreviewHeight;
+    private int[] mOffsetInWindow;
+
+    private PopupWindow mPopupKeyboard;
+    private View mMiniKeyboardContainer;
+    private KeyboardView mMiniKeyboard;
+    private boolean mMiniKeyboardOnScreen;
+    private View mPopupParent;
+    private int mMiniKeyboardOffsetX;
+    private int mMiniKeyboardOffsetY;
+    private Map<Key,View> mMiniKeyboardCache;
+    private int[] mWindowOffset;
+    private Key[] mKeys;
+
+    /** Listener for {@link OnKeyboardActionListener}. */
+    private OnKeyboardActionListener mKeyboardActionListener;
+
+    private static final int MSG_SHOW_PREVIEW = 1;
+    private static final int MSG_REMOVE_PREVIEW = 2;
+    private static final int MSG_REPEAT = 3;
+    private static final int MSG_LONGPRESS = 4;
+
+    private static final int DELAY_BEFORE_PREVIEW = 0;
+    private static final int DELAY_AFTER_PREVIEW = 70;
+    private static final int DEBOUNCE_TIME = 70;
+
+    private int mVerticalCorrection;
+    private int mProximityThreshold;
+
+    private boolean mPreviewCentered = false;
+    private boolean mShowPreview = true;
+    private boolean mShowTouchPoints = true;
+    private int mPopupPreviewX;
+    private int mPopupPreviewY;
+    private int mWindowY;
+
+    private int mLastX;
+    private int mLastY;
+    private int mStartX;
+    private int mStartY;
+
+    private boolean mProximityCorrectOn;
+
+    private Paint mPaint;
+    private Rect mPadding;
+ 
+    private long mDownTime;
+    private long mLastMoveTime;
+    private int mLastKey;
+    private int mLastCodeX;
+    private int mLastCodeY;
+    private int mCurrentKey = NOT_A_KEY;
+    private int mDownKey = NOT_A_KEY;
+    private long mLastKeyTime;
+    private long mCurrentKeyTime;
+    private int[] mKeyIndices = new int[12];
+    private GestureDetector mGestureDetector;
+    private int mPopupX;
+    private int mPopupY;
+    private int mRepeatKeyIndex = NOT_A_KEY;
+    private int mPopupLayout;
+    private boolean mAbortKey;
+    private Key mInvalidatedKey;
+    private Rect mClipRegion = new Rect(0, 0, 0, 0);
+    private boolean mPossiblePoly;
+    private SwipeTracker mSwipeTracker = new SwipeTracker();
+    private int mSwipeThreshold;
+    private boolean mDisambiguateSwipe;
+
+    private int mOldPointerCount = 1;
+    private float mOldPointerX;
+    private float mOldPointerY;
+
+    private Drawable mKeyBackground;
+    private Drawable mKeyBackground2nd;
+
+    private static final int REPEAT_INTERVAL = 50;
+    private static final int REPEAT_START_DELAY = 400;
+    private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
+
+    private static int MAX_NEARBY_KEYS = 12;
+    private int[] mDistances = new int[MAX_NEARBY_KEYS];
+
+    private int mLastSentIndex;
+    private int mTapCount;
+    private long mLastTapTime;
+    private boolean mInMultiTap;
+    private static final int MULTITAP_INTERVAL = 800;
+    private StringBuilder mPreviewLabel = new StringBuilder(1);
+
+    /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/
+    private boolean mDrawPending;
+    /** The dirty region in the keyboard bitmap */
+    private Rect mDirtyRect = new Rect();
+    /** The keyboard bitmap for faster updates */
+    private Bitmap mBuffer;
+    /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */
+    private boolean mKeyboardChanged;
+    /** The canvas for the above mutable keyboard bitmap */
+    private Canvas mCanvas;
+ 
+    Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_SHOW_PREVIEW:
+                    showKey(msg.arg1);
+                    break;
+                case MSG_REMOVE_PREVIEW:
+                    mPreviewText.setVisibility(INVISIBLE);
+                    break;
+                case MSG_REPEAT:
+                    if (repeatKey()) {
+                        Message repeat = Message.obtain(this, MSG_REPEAT);
+                        sendMessageDelayed(repeat, REPEAT_INTERVAL);
+                    }
+                    break;
+                case MSG_LONGPRESS:
+                    openPopupIfRequired((MotionEvent) msg.obj);
+                    break;
+            }
+        }
+    };
+
+    /** Constructor */
+    public KeyboardView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    /** Constructor */
+    public KeyboardView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        TypedArray a =
+            context.obtainStyledAttributes(
+                attrs, android.R.styleable.KeyboardView, defStyle, R.style.WnnKeyboardView);
+
+        LayoutInflater inflate =
+                (LayoutInflater) context
+                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        int previewLayout = 0;
+        int keyTextSize = 0;
+
+        int n = a.getIndexCount();
+ 
+        for (int i = 0; i < n; i++) {
+            int attr = a.getIndex(i);
+
+            switch (attr) {
+            case android.R.styleable.KeyboardView_keyBackground:
+                mKeyBackground = a.getDrawable(attr);
+                break;
+            case android.R.styleable.KeyboardView_verticalCorrection:
+                mVerticalCorrection = a.getDimensionPixelOffset(attr, 0);
+                break;
+            case android.R.styleable.KeyboardView_keyPreviewLayout:
+                previewLayout = a.getResourceId(attr, 0);
+                break;
+            case android.R.styleable.KeyboardView_keyPreviewOffset:
+                mPreviewOffset = a.getDimensionPixelOffset(attr, 0);
+                break;
+            case android.R.styleable.KeyboardView_keyPreviewHeight:
+                mPreviewHeight = a.getDimensionPixelSize(attr, 80);
+                break;
+            case android.R.styleable.KeyboardView_keyTextSize:
+                mKeyTextSize = a.getDimensionPixelSize(attr, 18);
+                break;
+            case android.R.styleable.KeyboardView_keyTextColor:
+                mKeyTextColor = a.getColor(attr, 0xFF000000);
+                break;
+            case android.R.styleable.KeyboardView_labelTextSize:
+                mLabelTextSize = a.getDimensionPixelSize(attr, 14);
+                break;
+            case android.R.styleable.KeyboardView_popupLayout:
+                mPopupLayout = a.getResourceId(attr, 0);
+                break;
+            case android.R.styleable.KeyboardView_shadowColor:
+                mShadowColor = a.getColor(attr, 0);
+                break;
+            case android.R.styleable.KeyboardView_shadowRadius:
+                mShadowRadius = a.getFloat(attr, 0f);
+                break;
+            }
+        }
+
+        a.recycle();
+        a = context.obtainStyledAttributes(attrs, R.styleable.WnnKeyboardView, 0, 0);
+        mKeyBackground2nd = a.getDrawable(R.styleable.WnnKeyboardView_keyBackground2nd);
+        mKeyTextColor2nd = a.getColor(R.styleable.WnnKeyboardView_keyTextColor2nd, 0xFF000000);
+ 
+        a.recycle();
+        a = mContext.obtainStyledAttributes(
+                android.R.styleable.Theme);
+        mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
+
+        mPreviewPopup = new PopupWindow(context);
+        if (previewLayout != 0) {
+            mPreviewText = (TextView) inflate.inflate(previewLayout, null);
+            mPreviewTextSizeLarge = (int) mPreviewText.getTextSize();
+            mPreviewPopup.setContentView(mPreviewText);
+            mPreviewPopup.setBackgroundDrawable(null);
+        } else {
+            mShowPreview = false;
+        }
+ 
+        mPreviewPopup.setTouchable(false);
+ 
+        mPopupKeyboard = new PopupWindow(context);
+        mPopupKeyboard.setBackgroundDrawable(null);
+
+        mPopupParent = this;
+        
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setTextSize(keyTextSize);
+        mPaint.setTextAlign(Align.CENTER);
+        mPaint.setAlpha(255);
+
+        mPadding = new Rect(0, 0, 0, 0);
+        mMiniKeyboardCache = new HashMap<Key,View>();
+        mKeyBackground.getPadding(mPadding);
+
+        mSwipeThreshold = (int) (500 * getResources().getDisplayMetrics().density);
+
+        mDisambiguateSwipe = true;
+
+        resetMultiTap();
+        initGestureDetector();
+    }
+
+    private void initGestureDetector() {
+        mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
+            @Override
+            public boolean onFling(MotionEvent me1, MotionEvent me2,
+                    float velocityX, float velocityY) {
+                if (mPossiblePoly) return false;
+                final float absX = Math.abs(velocityX);
+                final float absY = Math.abs(velocityY);
+                float deltaX = me2.getX() - me1.getX();
+                float deltaY = me2.getY() - me1.getY();
+                int travelX = getWidth() / 2;
+                int travelY = getHeight() / 2;
+                mSwipeTracker.computeCurrentVelocity(1000);
+                final float endingVelocityX = mSwipeTracker.getXVelocity();
+                final float endingVelocityY = mSwipeTracker.getYVelocity();
+                boolean sendDownKey = false;
+                if (velocityX > mSwipeThreshold && absY < absX && deltaX > travelX) {
+                    if (mDisambiguateSwipe && endingVelocityX < velocityX / 4) {
+                        sendDownKey = true;
+                    } else {
+                        swipeRight();
+                        return true;
+                    }
+                } else if (velocityX < -mSwipeThreshold && absY < absX && deltaX < -travelX) {
+                    if (mDisambiguateSwipe && endingVelocityX > velocityX / 4) {
+                        sendDownKey = true;
+                    } else {
+                        swipeLeft();
+                        return true;
+                    }
+                } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) {
+                    if (mDisambiguateSwipe && endingVelocityY > velocityY / 4) {
+                        sendDownKey = true;
+                    } else {
+                        swipeUp();
+                        return true;
+                    }
+                } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) {
+                    if (mDisambiguateSwipe && endingVelocityY < velocityY / 4) {
+                        sendDownKey = true;
+                    } else {
+                        swipeDown();
+                        return true;
+                    }
+                }
+
+                if (sendDownKey) {
+                    detectAndSendKey(mDownKey, mStartX, mStartY, me1.getEventTime());
+                }
+                return false;
+            }
+        });
+
+        mGestureDetector.setIsLongpressEnabled(false);
+    }
+
+    /**
+     * Set the {@link OnKeyboardActionListener} object.
+     * @param listener  The OnKeyboardActionListener to set.
+     */
+    public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
+        mKeyboardActionListener = listener;
+    }
+
+    /**
+     * Returns the {@link OnKeyboardActionListener} object.
+     * @return the listener attached to this keyboard
+     */
+    protected OnKeyboardActionListener getOnKeyboardActionListener() {
+        return mKeyboardActionListener;
+    }
+
+    /**
+     * Attaches a keyboard to this view. The keyboard can be switched at any time and the
+     * view will re-layout itself to accommodate the keyboard.
+     * @see Keyboard
+     * @see #getKeyboard()
+     * @param keyboard the keyboard to display in this view
+     */
+    public void setKeyboard(Keyboard keyboard) {
+        if (!keyboard.equals(mKeyboard)) {
+            clearWindowInfo();
+        }
+        int oldRepeatKeyCode = NOT_A_KEY;
+        if (mKeyboard != null) {
+            showPreview(NOT_A_KEY);
+            if ((mRepeatKeyIndex != NOT_A_KEY) && (mRepeatKeyIndex < mKeys.length)) {
+                oldRepeatKeyCode = mKeys[mRepeatKeyIndex].codes[0];
+            }
+        }
+        removeMessages();
+        mKeyboard = keyboard;
+        List<Key> keys = mKeyboard.getKeys();
+        mKeys = keys.toArray(new Key[keys.size()]);
+        requestLayout();
+        mKeyboardChanged = true;
+        invalidateAllKeys();
+        computeProximityThreshold(keyboard);
+        mMiniKeyboardCache.clear();
+        boolean abort = true;
+        if (oldRepeatKeyCode != NOT_A_KEY) {
+            int keyIndex = getKeyIndices(mStartX, mStartY, null);
+            if ((keyIndex != NOT_A_KEY)
+                && (keyIndex < mKeys.length)
+                && (oldRepeatKeyCode == mKeys[keyIndex].codes[0])) {
+                abort = false;
+                mRepeatKeyIndex = keyIndex;
+            }
+        }
+        if (abort) {
+            mHandler.removeMessages(MSG_REPEAT);
+        }
+        mAbortKey = abort;
+    }
+
+    /**
+     * Returns the current keyboard being displayed by this view.
+     * @return the currently attached keyboard
+     * @see #setKeyboard(Keyboard)
+     */
+    public Keyboard getKeyboard() {
+        return mKeyboard;
+    }
+ 
+    /**
+     * Sets the state of the shift key of the keyboard, if any.
+     * @param shifted whether or not to enable the state of the shift key
+     * @return true if the shift key state changed, false if there was no change
+     * @see KeyboardView#isShifted()
+     */
+    public boolean setShifted(boolean shifted) {
+        if (mKeyboard != null) {
+            if (mKeyboard.setShifted(shifted)) {
+                invalidateAllKeys();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the state of the shift key of the keyboard, if any.
+     * @return true if the shift is in a pressed state, false otherwise. If there is
+     * no shift key on the keyboard or there is no keyboard attached, it returns false.
+     * @see KeyboardView#setShifted(boolean)
+     */
+    public boolean isShifted() {
+        if (mKeyboard != null) {
+            return mKeyboard.isShifted();
+        }
+        return false;
+    }
+
+    /**
+     * Enables or disables the key feedback popup. This is a popup that shows a magnified
+     * version of the depressed key. By default the preview is enabled.
+     * @param previewEnabled whether or not to enable the key feedback popup
+     * @see #isPreviewEnabled()
+     */
+    public void setPreviewEnabled(boolean previewEnabled) {
+        mShowPreview = previewEnabled;
+    }
+
+    /**
+     * Returns the enabled state of the key feedback popup.
+     * @return whether or not the key feedback popup is enabled
+     * @see #setPreviewEnabled(boolean)
+     */
+    public boolean isPreviewEnabled() {
+        return mShowPreview;
+    }
+
+    /**
+     * Returns the root parent has the enabled state of the key feedback popup.
+     * @return whether or not the key feedback popup is enabled
+     * @see #setPreviewEnabled(boolean)
+     */
+    public boolean isParentPreviewEnabled() {
+        if ((mPopupParent != null) && (mPopupParent != this)
+                && (mPopupParent instanceof KeyboardView)) {
+            return ((KeyboardView)mPopupParent).isParentPreviewEnabled();
+        } else {
+            return mShowPreview;
+        }
+    }
+
+    public void setVerticalCorrection(int verticalOffset) {
+ 
+    }
+
+    /**
+     * Set View on the PopupParent.
+     * @param v  The View to set.
+     */
+    public void setPopupParent(View v) {
+        mPopupParent = v;
+    }
+
+    /**
+     * Set parameters on the KeyboardOffset.
+     * @param x  The value of KeyboardOffset.
+     * @param y  The value of KeyboardOffset.
+     */
+    public void setPopupOffset(int x, int y) {
+        mMiniKeyboardOffsetX = x;
+        mMiniKeyboardOffsetY = y;
+        if (mPreviewPopup.isShowing()) {
+            mPreviewPopup.dismiss();
+        }
+    }
+
+    /**
+     * When enabled, calls to {@link OnKeyboardActionListener#onKey} will include key
+     * codes for adjacent keys.  When disabled, only the primary key code will be
+     * reported.
+     * @param enabled whether or not the proximity correction is enabled
+     */
+    public void setProximityCorrectionEnabled(boolean enabled) {
+        mProximityCorrectOn = enabled;
+    }
+
+    /**
+     * Returns true if proximity correction is enabled.
+     */
+    public boolean isProximityCorrectionEnabled() {
+        return mProximityCorrectOn;
+    }
+
+    /**
+     * Popup keyboard close button clicked.
+     * @hide
+     */
+    public void onClick(View v) {
+        dismissPopupKeyboard();
+    }
+
+    private CharSequence adjustCase(CharSequence label) {
+        if (mKeyboard.isShifted() && label != null && label.length() < 3
+                && Character.isLowerCase(label.charAt(0))) {
+            label = label.toString().toUpperCase();
+        }
+        return label;
+    }
+
+    @Override
+    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (mKeyboard == null) {
+            setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom);
+        } else {
+            int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight;
+            if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) {
+                width = MeasureSpec.getSize(widthMeasureSpec);
+            }
+            setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom);
+        }
+    }
+
+    /**
+     * Compute the average distance between adjacent keys (horizontally and vertically)
+     * and square it to get the proximity threshold. We use a square here and in computing
+     * the touch distance from a key's center to avoid taking a square root.
+     * @param keyboard
+     */
+    private void computeProximityThreshold(Keyboard keyboard) {
+        if (keyboard == null) return;
+        final Key[] keys = mKeys;
+        if (keys == null) return;
+        int length = keys.length;
+        int dimensionSum = 0;
+        for (int i = 0; i < length; i++) {
+            Key key = keys[i];
+            dimensionSum += Math.min(key.width, key.height) + key.gap;
+        }
+        if (dimensionSum < 0 || length == 0) return;
+        mProximityThreshold = (int) (dimensionSum * 1.4f / length);
+        mProximityThreshold *= mProximityThreshold;
+    }
+
+    @Override
+    public void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        mBuffer = null;
+    }
+
+    @Override
+    public void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        if (mDrawPending || mBuffer == null || mKeyboardChanged) {
+            onBufferDraw();
+        }
+        canvas.drawBitmap(mBuffer, 0, 0, null);
+    }
+
+    private void onBufferDraw() {
+        boolean isBufferNull = (mBuffer == null);
+        if (isBufferNull || mKeyboardChanged) {
+            if (isBufferNull || mKeyboardChanged &&
+                    (mBuffer.getWidth() != getWidth() || mBuffer.getHeight() != getHeight())) {
+                final int width = Math.max(1, getWidth());
+                final int height = Math.max(1, getHeight());
+                mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+                mCanvas = new Canvas(mBuffer);
+            }
+            invalidateAllKeys();
+            mKeyboardChanged = false;
+        }
+        final Canvas canvas = mCanvas;
+        canvas.clipRect(mDirtyRect, Op.REPLACE);
+
+        if (mKeyboard == null) return;
+ 
+        final Paint paint = mPaint;
+        final Rect clipRegion = mClipRegion;
+        final Rect padding = mPadding;
+        final int kbdPaddingLeft = mPaddingLeft;
+        final int kbdPaddingTop = mPaddingTop;
+        final Key[] keys = mKeys;
+        final Key invalidKey = mInvalidatedKey;
+
+        paint.setColor(mKeyTextColor);
+        boolean drawSingleKey = false;
+        if (invalidKey != null && canvas.getClipBounds(clipRegion)) {
+          if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left &&
+                  invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top &&
+                  invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right &&
+                  invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) {
+              drawSingleKey = true;
+          }
+        }
+        canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
+        final int keyCount = keys.length;
+        for (int i = 0; i < keyCount; i++) {
+            final Key key = keys[i];
+            if (drawSingleKey && invalidKey != key) {
+                continue;
+            }
+
+            paint.setColor(key.isSecondKey ? mKeyTextColor2nd : mKeyTextColor);
+            Drawable keyBackground = key.isSecondKey ? mKeyBackground2nd : mKeyBackground;
+            int[] drawableState = key.getCurrentDrawableState();
+            keyBackground.setState(drawableState);
+
+            String label = key.label == null? null : adjustCase(key.label).toString();
+
+            final Rect bounds = keyBackground.getBounds();
+            if (key.width != bounds.right ||
+                    key.height != bounds.bottom) {
+                keyBackground.setBounds(0, 0, key.width, key.height);
+            }
+            canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop);
+            keyBackground.draw(canvas);
+ 
+            if (label != null) {
+                if (OpenWnn.isXLarge()) {
+                    if (label.length() > 1 && key.codes.length < 2) {
+                        paint.setTextSize(mLabelTextSize);
+                        paint.setTypeface(Typeface.DEFAULT);
+                    } else {
+                        paint.setTextSize(mKeyTextSize);
+                        paint.setTypeface(Typeface.DEFAULT_BOLD);
+                    }
+                } else {
+                    if (label.length() > 1 && key.codes.length < 2) {
+                        paint.setTextSize(mLabelTextSize);
+                        paint.setTypeface(Typeface.DEFAULT_BOLD);
+                    } else {
+                        paint.setTextSize(mKeyTextSize);
+                        paint.setTypeface(Typeface.DEFAULT_BOLD);
+                    }
+                }
+                paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
+                if (OpenWnn.isXLarge()) {
+                    canvas.drawText(label,
+                        (key.width - padding.left + 7 - padding.right) / 2
+                                + padding.left,
+                        (key.height - padding.top + 7 - padding.bottom) / 2
+                                + (paint.getTextSize() - paint.descent()) / 2 + padding.top,
+                        paint);
+                } else {
+                    canvas.drawText(label,
+                        (key.width - padding.left - padding.right) / 2
+                                + padding.left,
+                        (key.height - padding.top - padding.bottom) / 2
+                                + (paint.getTextSize() - paint.descent()) / 2 + padding.top,
+                        paint);
+                }
+                paint.setShadowLayer(0, 0, 0, 0);
+            } else if (key.icon != null) {
+                int drawableX;
+                int drawableY;
+                if (OpenWnn.isXLarge()) {
+                    drawableX = (key.width - padding.left + 12 - padding.right
+                                    - key.icon.getIntrinsicWidth()) / 2 + padding.left;
+                    drawableY = (key.height - padding.top + 9 - padding.bottom
+                            - key.icon.getIntrinsicHeight()) / 2 + padding.top;
+                } else {
+                    drawableX = (key.width - padding.left - padding.right 
+                                    - key.icon.getIntrinsicWidth()) / 2 + padding.left;
+                    drawableY = (key.height - padding.top - padding.bottom 
+                            - key.icon.getIntrinsicHeight()) / 2 + padding.top;
+                }
+                canvas.translate(drawableX, drawableY);
+                key.icon.setBounds(0, 0,
+                        key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight());
+                key.icon.draw(canvas);
+                canvas.translate(-drawableX, -drawableY);
+            }
+            canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
+        }
+        mInvalidatedKey = null;
+        if (mMiniKeyboardOnScreen) {
+            paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24);
+            canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
+        }
+
+        mDrawPending = false;
+        mDirtyRect.setEmpty();
+    }
+
+    private int getKeyIndices(int x, int y, int[] allKeys) {
+        final Key[] keys = mKeys;
+        int primaryIndex = NOT_A_KEY;
+        int closestKey = NOT_A_KEY;
+        int closestKeyDist = mProximityThreshold + 1;
+        java.util.Arrays.fill(mDistances, Integer.MAX_VALUE);
+        int [] nearestKeyIndices = mKeyboard.getNearestKeys(x, y);
+        final int keyCount = nearestKeyIndices.length;
+        for (int i = 0; i < keyCount; i++) {
+            final Key key = keys[nearestKeyIndices[i]];
+            int dist = 0;
+            boolean isInside = key.isInside(x,y);
+            if (isInside) {
+                primaryIndex = nearestKeyIndices[i];
+            }
+
+            if (((mProximityCorrectOn
+                    && (dist = key.squaredDistanceFrom(x, y)) < mProximityThreshold)
+                    || isInside)
+                    && key.codes[0] > 32) {
+                final int nCodes = key.codes.length;
+                if (dist < closestKeyDist) {
+                    closestKeyDist = dist;
+                    closestKey = nearestKeyIndices[i];
+                }
+
+                if (allKeys == null) continue;
+ 
+                for (int j = 0; j < mDistances.length; j++) {
+                    if (mDistances[j] > dist) {
+                        System.arraycopy(mDistances, j, mDistances, j + nCodes,
+                                mDistances.length - j - nCodes);
+                        System.arraycopy(allKeys, j, allKeys, j + nCodes,
+                                allKeys.length - j - nCodes);
+                        for (int c = 0; c < nCodes; c++) {
+                            allKeys[j + c] = key.codes[c];
+                            mDistances[j + c] = dist;
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+        if (primaryIndex == NOT_A_KEY) {
+            primaryIndex = closestKey;
+        }
+        return primaryIndex;
+    }
+
+    private void detectAndSendKey(int index, int x, int y, long eventTime) {
+        if (index != NOT_A_KEY && index < mKeys.length) {
+            final Key key = mKeys[index];
+            if (key.text != null) {
+                mKeyboardActionListener.onText(key.text);
+                mKeyboardActionListener.onRelease(NOT_A_KEY);
+            } else {
+                int code = key.codes[0];
+                int[] codes = new int[MAX_NEARBY_KEYS];
+                Arrays.fill(codes, NOT_A_KEY);
+                getKeyIndices(x, y, codes);
+                if (mInMultiTap) {
+                    if (mTapCount != -1) {
+                        mKeyboardActionListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE);
+                    } else {
+                        mTapCount = 0;
+                    }
+                    code = key.codes[mTapCount];
+                }
+                mKeyboardActionListener.onKey(code, codes);
+                mKeyboardActionListener.onRelease(code);
+            }
+            mLastSentIndex = index;
+            mLastTapTime = eventTime;
+        }
+    }
+
+    /**
+     * Handle multi-tap keys by producing the key label for the current multi-tap state.
+     */
+    private CharSequence getPreviewText(Key key) {
+        if (mInMultiTap) {
+            mPreviewLabel.setLength(0);
+            mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]);
+            return adjustCase(mPreviewLabel);
+        } else {
+            return adjustCase(key.label);
+        }
+    }
+
+    private void showPreview(int keyIndex) {
+        int oldKeyIndex = mCurrentKeyIndex;
+        final PopupWindow previewPopup = mPreviewPopup;
+ 
+        mCurrentKeyIndex = keyIndex;
+        final Key[] keys = mKeys;
+        if (oldKeyIndex != mCurrentKeyIndex) {
+            if (oldKeyIndex != NOT_A_KEY && keys.length > oldKeyIndex) {
+                keys[oldKeyIndex].onReleased(mCurrentKeyIndex == NOT_A_KEY);
+                invalidateKey(oldKeyIndex);
+            }
+            if (mCurrentKeyIndex != NOT_A_KEY && keys.length > mCurrentKeyIndex) {
+                keys[mCurrentKeyIndex].onPressed();
+                invalidateKey(mCurrentKeyIndex);
+            }
+        }
+        if (oldKeyIndex != mCurrentKeyIndex && mShowPreview && isParentPreviewEnabled()) {
+            mHandler.removeMessages(MSG_SHOW_PREVIEW);
+            if (previewPopup.isShowing()) {
+                if (keyIndex == NOT_A_KEY) {
+                    mHandler.sendMessageDelayed(mHandler
+                            .obtainMessage(MSG_REMOVE_PREVIEW),
+                            DELAY_AFTER_PREVIEW);
+                }
+            }
+            if (keyIndex != NOT_A_KEY) {
+                if (previewPopup.isShowing() && mPreviewText.getVisibility() == VISIBLE) {
+                    showKey(keyIndex);
+                } else {
+                    mHandler.sendMessageDelayed(
+                            mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0),
+                            DELAY_BEFORE_PREVIEW);
+                }
+            }
+        }
+    }
+ 
+    private void showKey(final int keyIndex) {
+        final PopupWindow previewPopup = mPreviewPopup;
+        final Key[] keys = mKeys;
+        if (keyIndex < 0 || keyIndex >= mKeys.length) return;
+        Key key = keys[keyIndex];
+
+        mPreviewText.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.keyboard_key_feedback));
+
+        if (key.icon != null) {
+            mPreviewText.setCompoundDrawables(null, null, null,
+                    key.iconPreview != null ? key.iconPreview : key.icon);
+            mPreviewText.setText(null);
+            mPreviewText.setPadding(5, 0, 5, 20);
+        } else {
+            mPreviewText.setCompoundDrawables(null, null, null, null);
+            mPreviewText.setText(getPreviewText(key));
+            if (key.label.length() > 1 && key.codes.length < 2) {
+                mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize);
+                mPreviewText.setTypeface(Typeface.DEFAULT_BOLD);
+            } else {
+                mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge);
+                mPreviewText.setTypeface(Typeface.DEFAULT);
+            }
+            mPreviewText.setPadding(0, 0, 0, 10);
+        }
+        mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+        int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width
+                + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight());
+        final int popupHeight = mPreviewHeight;
+        LayoutParams lp = mPreviewText.getLayoutParams();
+        if (lp != null) {
+            lp.width = popupWidth;
+            lp.height = popupHeight;
+        }
+        if (!mPreviewCentered) {
+            mPopupPreviewX = key.x - (Math.abs(popupWidth - key.width) / 2 );
+            mPopupPreviewY = key.y - popupHeight + mPreviewOffset;
+        } else {
+            mPopupPreviewX = 160 - mPreviewText.getMeasuredWidth() / 2;
+            mPopupPreviewY = - mPreviewText.getMeasuredHeight();
+        }
+        mPopupPreviewY = mPopupPreviewY + 20;
+        mHandler.removeMessages(MSG_REMOVE_PREVIEW);
+        if (mOffsetInWindow == null) {
+            mOffsetInWindow = new int[2];
+            getLocationInWindow(mOffsetInWindow);
+            mOffsetInWindow[0] += mMiniKeyboardOffsetX;
+            mOffsetInWindow[1] += mMiniKeyboardOffsetY;
+            int[] mWindowLocation = new int[2];
+            getLocationOnScreen(mWindowLocation);
+            mWindowY = mWindowLocation[1];
+        }
+        mPreviewText.getBackground().setState(
+                key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET);
+        mPopupPreviewX += mOffsetInWindow[0];
+        mPopupPreviewY += mOffsetInWindow[1];
+
+        if (mPopupPreviewY + mWindowY < 0) {
+            if (key.x + key.width <= getWidth() / 2) {
+                mPopupPreviewX += (int) (key.width * 2.5);
+            } else {
+                mPopupPreviewX -= (int) (key.width * 2.5);
+            }
+            mPopupPreviewY += popupHeight;
+        }
+
+        if (previewPopup.isShowing()) {
+            previewPopup.update(mPopupPreviewX, mPopupPreviewY,
+                    popupWidth, popupHeight);
+        } else {
+            previewPopup.setWidth(popupWidth);
+            previewPopup.setHeight(popupHeight);
+            previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY,
+                    mPopupPreviewX, mPopupPreviewY);
+        }
+        mPreviewText.setVisibility(VISIBLE);
+    }
+
+    /**
+     * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is not sufficient
+     * because the keyboard renders the keys to an off-screen buffer and an invalidate() only
+     * draws the cached buffer.
+     * @see #invalidateKey(int)
+     */
+    public void invalidateAllKeys() {
+        mDirtyRect.union(0, 0, getWidth(), getHeight());
+        mDrawPending = true;
+        invalidate();
+    }
+
+    /**
+     * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only
+     * one key is changing it's content. Any changes that affect the position or size of the key
+     * may not be honored.
+     * @param keyIndex the index of the key in the attached {@link Keyboard}.
+     * @see #invalidateAllKeys
+     */
+    public void invalidateKey(int keyIndex) {
+        if (mKeys == null) return;
+        if (keyIndex < 0 || keyIndex >= mKeys.length) {
+            return;
+        }
+        final Key key = mKeys[keyIndex];
+        mInvalidatedKey = key;
+        mDirtyRect.union(key.x + mPaddingLeft, key.y + mPaddingTop,
+                key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop);
+        onBufferDraw();
+        invalidate(key.x + mPaddingLeft, key.y + mPaddingTop,
+                key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop);
+    }
+
+    private boolean openPopupIfRequired(MotionEvent me) {
+        if (mPopupLayout == 0) {
+            return false;
+        }
+        if (mCurrentKey < 0 || mCurrentKey >= mKeys.length) {
+            return false;
+        }
+
+        Key popupKey = mKeys[mCurrentKey];
+        boolean result = onLongPress(popupKey);
+        if (result) {
+            mAbortKey = true;
+            showPreview(NOT_A_KEY);
+        }
+        return result;
+    }
+
+    /**
+     * Called when a key is long pressed. By default this will open any popup keyboard associated
+     * with this key through the attributes popupLayout and popupCharacters.
+     * @param popupKey the key that was long pressed
+     * @return true if the long press is handled, false otherwise. Subclasses should call the
+     * method on the base class if the subclass doesn't wish to handle the call.
+     */
+    protected boolean onLongPress(Key popupKey) {
+        if (mKeyboardActionListener.onLongPress(popupKey)) {
+            return true;
+        }
+        int popupKeyboardId = popupKey.popupResId;
+        if (popupKeyboardId != 0) {
+            mMiniKeyboardContainer = mMiniKeyboardCache.get(popupKey);
+            if (mMiniKeyboardContainer == null) {
+                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
+                        Context.LAYOUT_INFLATER_SERVICE);
+                mMiniKeyboardContainer = inflater.inflate(mPopupLayout, null);
+                mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById(R.id.keyboardView);
+                View closeButton = mMiniKeyboardContainer.findViewById(R.id.closeButton);
+                if (closeButton != null) closeButton.setOnClickListener(this);
+                mMiniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() {
+                    public void onKey(int primaryCode, int[] keyCodes) {
+                        mKeyboardActionListener.onKey(primaryCode, keyCodes);
+                        dismissPopupKeyboard();
+                    }
+ 
+                    public void onText(CharSequence text) {
+                        mKeyboardActionListener.onText(text);
+                        dismissPopupKeyboard();
+                    }
+ 
+                    public void swipeLeft() { }
+                    public void swipeRight() { }
+                    public void swipeUp() { }
+                    public void swipeDown() { }
+                    public void onPress(int primaryCode) {
+                        mKeyboardActionListener.onPress(primaryCode);
+                    }
+                    public void onRelease(int primaryCode) {
+                        mKeyboardActionListener.onRelease(primaryCode);
+                    }
+                    public boolean onLongPress(Keyboard.Key key) {
+                        return false;
+                    }
+                });
+                Keyboard keyboard;
+                if (popupKey.popupCharacters != null) {
+                    keyboard = new Keyboard(getContext(), popupKeyboardId, 
+                            popupKey.popupCharacters, -1, getPaddingLeft() + getPaddingRight());
+                } else {
+                    keyboard = new Keyboard(getContext(), popupKeyboardId);
+                }
+                mMiniKeyboard.setKeyboard(keyboard);
+                mMiniKeyboard.setPopupParent(this);
+                mMiniKeyboardContainer.measure(
+                        MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
+                        MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
+ 
+                mMiniKeyboardCache.put(popupKey, mMiniKeyboardContainer);
+            } else {
+                mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById(R.id.keyboardView);
+            }
+            if (mWindowOffset == null) {
+                mWindowOffset = new int[2];
+                getLocationInWindow(mWindowOffset);
+            }
+            mPopupX = popupKey.x + mPaddingLeft;
+            mPopupY = popupKey.y + mPaddingTop;
+            mPopupX = mPopupX + popupKey.width - mMiniKeyboardContainer.getMeasuredWidth();
+            mPopupY = mPopupY - mMiniKeyboardContainer.getMeasuredHeight();
+            final int x = mPopupX + mMiniKeyboardContainer.getPaddingRight() + mWindowOffset[0];
+            final int y = mPopupY + mMiniKeyboardContainer.getPaddingBottom() + mWindowOffset[1];
+            mMiniKeyboard.setPopupOffset(x < 0 ? 0 : x, y);
+            mMiniKeyboard.setShifted(isShifted());
+            mPopupKeyboard.setContentView(mMiniKeyboardContainer);
+            mPopupKeyboard.setWidth(mMiniKeyboardContainer.getMeasuredWidth());
+            mPopupKeyboard.setHeight(mMiniKeyboardContainer.getMeasuredHeight());
+            mPopupKeyboard.showAtLocation(this, Gravity.NO_GRAVITY, x, y);
+            mMiniKeyboardOnScreen = true;
+            invalidateAllKeys();
+            return true;
+        }
+        return false;
+    }
+
+    private long mOldEventTime;
+    private boolean mUsedVelocity;
+
+    @Override
+    public boolean onTouchEvent(MotionEvent me) {
+        final int pointerCount = me.getPointerCount();
+        final int action = me.getAction();
+        boolean result = false;
+        final long now = me.getEventTime();
+        final boolean isPointerCountOne = (pointerCount == 1);
+
+        if (pointerCount != mOldPointerCount) {
+            if (isPointerCountOne) {
+                MotionEvent down = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN,
+                        me.getX(), me.getY(), me.getMetaState());
+                result = onModifiedTouchEvent(down, false);
+                down.recycle();
+                if (action == MotionEvent.ACTION_UP) {
+                    result = onModifiedTouchEvent(me, true);
+                }
+            } else {
+                MotionEvent up = MotionEvent.obtain(now, now, MotionEvent.ACTION_UP,
+                        mOldPointerX, mOldPointerY, me.getMetaState());
+                result = onModifiedTouchEvent(up, true);
+                up.recycle();
+            }
+        } else {
+            if (isPointerCountOne) {
+                result = onModifiedTouchEvent(me, false);
+                mOldPointerX = me.getX();
+                mOldPointerY = me.getY();
+            } else {
+                result = true;
+            }
+        }
+        mOldPointerCount = pointerCount;
+
+        return result;
+    }
+
+    private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) {
+        int touchX = (int) me.getX() - mPaddingLeft;
+        int touchY = (int) me.getY() + mVerticalCorrection - mPaddingTop;
+        final int action = me.getAction();
+        final long eventTime = me.getEventTime();
+        mOldEventTime = eventTime;
+        int keyIndex = getKeyIndices(touchX, touchY, null);
+        mPossiblePoly = possiblePoly;
+
+        if (action == MotionEvent.ACTION_DOWN) mSwipeTracker.clear();
+        mSwipeTracker.addMovement(me);
+
+        if (mAbortKey
+                && action != MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_CANCEL) {
+            return true;
+        }
+
+        if (mGestureDetector.onTouchEvent(me)) {
+            showPreview(NOT_A_KEY);
+            mHandler.removeMessages(MSG_REPEAT);
+            mHandler.removeMessages(MSG_LONGPRESS);
+            return true;
+        }
+ 
+        if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) {
+            return true;
+        }
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                mAbortKey = false;
+                mStartX = touchX;
+                mStartY = touchY;
+                mLastCodeX = touchX;
+                mLastCodeY = touchY;
+                mLastKeyTime = 0;
+                mCurrentKeyTime = 0;
+                mLastKey = NOT_A_KEY;
+                mCurrentKey = keyIndex;
+                mDownKey = keyIndex;
+                mDownTime = me.getEventTime();
+                mLastMoveTime = mDownTime;
+                checkMultiTap(eventTime, keyIndex);
+                mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? 
+                        mKeys[keyIndex].codes[0] : 0);
+                if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) {
+                    mRepeatKeyIndex = mCurrentKey;
+                    Message msg = mHandler.obtainMessage(MSG_REPEAT);
+                    mHandler.sendMessageDelayed(msg, REPEAT_START_DELAY);
+                    repeatKey();
+                    if (mAbortKey) {
+                        mRepeatKeyIndex = NOT_A_KEY;
+                        break;
+                    }
+                }
+                if (mCurrentKey != NOT_A_KEY) {
+                    Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me);
+                    mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT);
+                }
+                showPreview(keyIndex);
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                boolean continueLongPress = false;
+                if (keyIndex != NOT_A_KEY) {
+                    if (mCurrentKey == NOT_A_KEY) {
+                        mCurrentKey = keyIndex;
+                        mCurrentKeyTime = eventTime - mDownTime;
+                    } else {
+                        if (keyIndex == mCurrentKey) {
+                            mCurrentKeyTime += eventTime - mLastMoveTime;
+                            continueLongPress = true;
+                        } else if (mRepeatKeyIndex == NOT_A_KEY) {
+                            resetMultiTap();
+                            mLastKey = mCurrentKey;
+                            mLastCodeX = mLastX;
+                            mLastCodeY = mLastY;
+                            mLastKeyTime =
+                                    mCurrentKeyTime + eventTime - mLastMoveTime;
+                            mCurrentKey = keyIndex;
+                            mCurrentKeyTime = 0;
+                        }
+                    }
+                }
+                if (!continueLongPress) {
+                    mHandler.removeMessages(MSG_LONGPRESS);
+                    if (keyIndex != NOT_A_KEY) {
+                        Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me);
+                        mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT);
+                    }
+                }
+                showPreview(mCurrentKey);
+                mLastMoveTime = eventTime;
+                break;
+
+            case MotionEvent.ACTION_UP:
+                removeMessages();
+                if (keyIndex == mCurrentKey) {
+                    mCurrentKeyTime += eventTime - mLastMoveTime;
+                } else {
+                    resetMultiTap();
+                    mLastKey = mCurrentKey;
+                    mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime;
+                    mCurrentKey = keyIndex;
+                    mCurrentKeyTime = 0;
+                }
+                if (mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME
+                        && mLastKey != NOT_A_KEY) {
+                    mCurrentKey = mLastKey;
+                    touchX = mLastCodeX;
+                    touchY = mLastCodeY;
+                }
+                showPreview(NOT_A_KEY);
+                Arrays.fill(mKeyIndices, NOT_A_KEY);
+                if (mRepeatKeyIndex == NOT_A_KEY && !mMiniKeyboardOnScreen && !mAbortKey) {
+                    detectAndSendKey(mCurrentKey, touchX, touchY, eventTime);
+                }
+                invalidateKey(keyIndex);
+                mRepeatKeyIndex = NOT_A_KEY;
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                removeMessages();
+                dismissPopupKeyboard();
+                mAbortKey = true;
+                showPreview(NOT_A_KEY);
+                invalidateKey(mCurrentKey);
+                break;
+        }
+        mLastX = touchX;
+        mLastY = touchY;
+        return true;
+    }
+
+    private boolean repeatKey() {
+        Key key = mKeys[mRepeatKeyIndex];
+        detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime);
+        return true;
+    }
+
+    protected void swipeRight() {
+        mKeyboardActionListener.swipeRight();
+    }
+
+    protected void swipeLeft() {
+        mKeyboardActionListener.swipeLeft();
+    }
+
+    protected void swipeUp() {
+        mKeyboardActionListener.swipeUp();
+    }
+
+    protected void swipeDown() {
+        mKeyboardActionListener.swipeDown();
+    }
+
+    public void closing() {
+        if (mPreviewPopup.isShowing()) {
+            mPreviewPopup.dismiss();
+        }
+        removeMessages();
+ 
+        dismissPopupKeyboard();
+        mBuffer = null;
+        mCanvas = null;
+        mMiniKeyboardCache.clear();
+    }
+
+    private void removeMessages() {
+        mHandler.removeMessages(MSG_REPEAT);
+        mHandler.removeMessages(MSG_LONGPRESS);
+        mHandler.removeMessages(MSG_SHOW_PREVIEW);
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        closing();
+    }
+
+    private void dismissPopupKeyboard() {
+        if (mPopupKeyboard.isShowing()) {
+            mPopupKeyboard.dismiss();
+            mMiniKeyboardOnScreen = false;
+            invalidateAllKeys();
+        }
+    }
+
+    public boolean handleBack() {
+        if (mPopupKeyboard.isShowing()) {
+            dismissPopupKeyboard();
+            return true;
+        }
+        return false;
+    }
+
+    private void resetMultiTap() {
+        mLastSentIndex = NOT_A_KEY;
+        mTapCount = 0;
+        mLastTapTime = -1;
+        mInMultiTap = false;
+    }
+ 
+    private void checkMultiTap(long eventTime, int keyIndex) {
+        if (keyIndex == NOT_A_KEY) return;
+        Key key = mKeys[keyIndex];
+        if (key.codes.length > 1) {
+            mInMultiTap = true;
+            if (eventTime < mLastTapTime + MULTITAP_INTERVAL
+                    && keyIndex == mLastSentIndex) {
+                mTapCount = (mTapCount + 1) % key.codes.length;
+                return;
+            } else {
+                mTapCount = -1;
+                return;
+            }
+        }
+        if (eventTime > mLastTapTime + MULTITAP_INTERVAL || keyIndex != mLastSentIndex) {
+            resetMultiTap();
+        }
+    }
+
+    private static class SwipeTracker {
+
+        static final int NUM_PAST = 4;
+        static final int LONGEST_PAST_TIME = 200;
+
+        final float mPastX[] = new float[NUM_PAST];
+        final float mPastY[] = new float[NUM_PAST];
+        final long mPastTime[] = new long[NUM_PAST];
+
+        float mYVelocity;
+        float mXVelocity;
+
+        public void clear() {
+            mPastTime[0] = 0;
+        }
+
+        public void addMovement(MotionEvent ev) {
+            long time = ev.getEventTime();
+            final int N = ev.getHistorySize();
+            for (int i=0; i<N; i++) {
+                addPoint(ev.getHistoricalX(i), ev.getHistoricalY(i),
+                        ev.getHistoricalEventTime(i));
+            }
+            addPoint(ev.getX(), ev.getY(), time);
+        }
+
+        private void addPoint(float x, float y, long time) {
+            int drop = -1;
+            int i;
+            final long[] pastTime = mPastTime;
+            for (i=0; i<NUM_PAST; i++) {
+                if (pastTime[i] == 0) {
+                    break;
+                } else if (pastTime[i] < time-LONGEST_PAST_TIME) {
+                    drop = i;
+                }
+            }
+            if (i == NUM_PAST && drop < 0) {
+                drop = 0;
+            }
+            if (drop == i) drop--;
+            final float[] pastX = mPastX;
+            final float[] pastY = mPastY;
+            if (drop >= 0) {
+                final int start = drop+1;
+                final int count = NUM_PAST-drop-1;
+                System.arraycopy(pastX, start, pastX, 0, count);
+                System.arraycopy(pastY, start, pastY, 0, count);
+                System.arraycopy(pastTime, start, pastTime, 0, count);
+                i -= (drop+1);
+            }
+            pastX[i] = x;
+            pastY[i] = y;
+            pastTime[i] = time;
+            i++;
+            if (i < NUM_PAST) {
+                pastTime[i] = 0;
+            }
+        }
+
+        public void computeCurrentVelocity(int units) {
+            computeCurrentVelocity(units, Float.MAX_VALUE);
+        }
+
+        public void computeCurrentVelocity(int units, float maxVelocity) {
+            final float[] pastX = mPastX;
+            final float[] pastY = mPastY;
+            final long[] pastTime = mPastTime;
+
+            final float oldestX = pastX[0];
+            final float oldestY = pastY[0];
+            final long oldestTime = pastTime[0];
+            float accumX = 0;
+            float accumY = 0;
+            int N=0;
+            while (N < NUM_PAST) {
+                if (pastTime[N] == 0) {
+                    break;
+                }
+                N++;
+            }
+
+            for (int i=1; i < N; i++) {
+                final int dur = (int)(pastTime[i] - oldestTime);
+                if (dur == 0) continue;
+                float dist = pastX[i] - oldestX;
+                float vel = (dist/dur) * units;
+                if (accumX == 0) accumX = vel;
+                else accumX = (accumX + vel) * .5f;
+
+                dist = pastY[i] - oldestY;
+                vel = (dist/dur) * units;
+                if (accumY == 0) accumY = vel;
+                else accumY = (accumY + vel) * .5f;
+            }
+            mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity)
+                    : Math.min(accumX, maxVelocity);
+            mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity)
+                    : Math.min(accumY, maxVelocity);
+        }
+
+        public float getXVelocity() {
+            return mXVelocity;
+        }
+
+        public float getYVelocity() {
+            return mYVelocity;
+        }
+    }
+
+    /**
+     * Clear window info.
+     */
+    public void clearWindowInfo() {
+        mOffsetInWindow = null;
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/LetterConverter.java b/src/jp/co/omronsoft/openwnn/LetterConverter.java
index adb6226..15f0bfb 100644
--- a/src/jp/co/omronsoft/openwnn/LetterConverter.java
+++ b/src/jp/co/omronsoft/openwnn/LetterConverter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnn.java b/src/jp/co/omronsoft/openwnn/OpenWnn.java
index fdc643b..12ca226 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnn.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnn.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 
 package jp.co.omronsoft.openwnn;
 
+import jp.co.omronsoft.openwnn.JAJP.*;
 import android.inputmethodservice.InputMethodService;
 import android.view.WindowManager;
 import android.content.Context;
@@ -32,10 +33,15 @@
 import android.graphics.*;
 import android.graphics.drawable.*;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.co.omronsoft.openwnn.KeyAction;
+
 /**
  * The OpenWnn IME's base class.
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public class OpenWnn extends InputMethodService {
 
@@ -59,6 +65,21 @@
     /** Flag for checking if the previous down key event is consumed by OpenWnn  */
     private boolean mConsumeDownEvent;
 
+    /** for isXLarge */
+    private static boolean mIsXLarge = false;
+
+    /** TextCandidatesViewManager */
+    protected TextCandidatesViewManager mTextCandidatesViewManager = null;
+
+    /** TextCandidates1LineViewManager */
+    protected TextCandidates1LineViewManager mTextCandidates1LineViewManager = null;
+
+    /** The instance of current IME */
+    private static OpenWnn mCurrentIme;
+
+    /** KeyAction list */
+    private List<KeyAction> KeyActionList = new ArrayList<KeyAction>();
+
     /**
      * Constructor
      */
@@ -71,10 +92,22 @@
      **********************************************************************/
     /** @see android.inputmethodservice.InputMethodService#onCreate */
     @Override public void onCreate() {
+        updateXLargeMode();
         super.onCreate();
 
         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
 
+        mCurrentIme = this;
+
+
+        mTextCandidatesViewManager = new TextCandidatesViewManager(-1);
+        if (isXLarge()) {
+            mTextCandidates1LineViewManager =
+                new TextCandidates1LineViewManager(OpenWnnEngineJAJP.LIMIT_OF_CANDIDATES_1LINE);
+            mCandidatesViewManager = mTextCandidates1LineViewManager;
+        } else {
+            mCandidatesViewManager = mTextCandidatesViewManager;
+        }
 
         if (mConverter != null) { mConverter.init(); }
         if (mComposingText != null) { mComposingText.clear(); }
@@ -84,6 +117,14 @@
     @Override public View onCreateCandidatesView() {
         if (mCandidatesViewManager != null) {
             WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
+            if (isXLarge()) {
+                mCandidatesViewManager = mTextCandidates1LineViewManager;
+                mTextCandidatesViewManager.initView(this,
+                                                        wm.getDefaultDisplay().getWidth(),
+                                                        wm.getDefaultDisplay().getHeight());
+            } else {
+                mCandidatesViewManager = mTextCandidatesViewManager;
+            }
             View view = mCandidatesViewManager.initView(this,
                                                         wm.getDefaultDisplay().getWidth(),
                                                         wm.getDefaultDisplay().getHeight());
@@ -112,13 +153,28 @@
     /** @see android.inputmethodservice.InputMethodService#onDestroy */
     @Override public void onDestroy() {
         super.onDestroy();
-
+        mCurrentIme = null;
         close();
     }
 
     /** @see android.inputmethodservice.InputMethodService#onKeyDown */
     @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
         mConsumeDownEvent = onEvent(new OpenWnnEvent(event));
+
+        KeyAction Keycodeinfo = new KeyAction();
+        Keycodeinfo.mConsumeDownEvent = mConsumeDownEvent;
+        Keycodeinfo.mKeyCode = keyCode;
+
+        int cnt = KeyActionList.size();
+        if (cnt != 0) {
+            for (int i = 0; i < cnt; i++) {
+                if (KeyActionList.get(i).mKeyCode == keyCode) {
+                    KeyActionList.remove(i);
+                    break;
+                }
+            }
+        }
+        KeyActionList.add(Keycodeinfo);
         if (!mConsumeDownEvent) {
             return super.onKeyDown(keyCode, event);
         }
@@ -128,13 +184,38 @@
     /** @see android.inputmethodservice.InputMethodService#onKeyUp */
     @Override public boolean onKeyUp(int keyCode, KeyEvent event) {
         boolean ret = mConsumeDownEvent;
+        int cnt = KeyActionList.size();
+        for (int i = 0; i < cnt; i++) {
+            KeyAction Keycodeinfo = KeyActionList.get(i);
+            if (Keycodeinfo.mKeyCode == keyCode) {
+                ret = Keycodeinfo.mConsumeDownEvent;
+                KeyActionList.remove(i);
+                break;
+            }
+        }
         if (!ret) {
             ret = super.onKeyUp(keyCode, event);
         }else{
-            onEvent(new OpenWnnEvent(event));
+            ret = onEvent(new OpenWnnEvent(event));
         }
         return ret;
     }
+
+    /**
+     * Called when the key long press event occurred.
+     *
+     * @see android.inputmethodservice.InputMethodService#onKeyLongPress
+     */
+    @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) {
+        if (mCurrentIme == null) {
+            Log.e("iWnn", "OpenWnn::onKeyLongPress()  Unprocessing onCreate() ");
+            return super.onKeyLongPress(keyCode, event);
+        }
+
+        OpenWnnEvent wnnEvent = new OpenWnnEvent(event);
+        wnnEvent.code = OpenWnnEvent.KEYLONGPRESS;
+        return onEvent(wnnEvent);
+    }
         
     /** @see android.inputmethodservice.InputMethodService#onStartInput */
     @Override public void onStartInput(EditorInfo attribute, boolean restarting) {
@@ -247,4 +328,99 @@
     protected void close() {
         if (mConverter != null) { mConverter.close(); }
     }
+
+    /**
+     * Whether the x large mode.
+     *
+     * @return      {@code true} if x large; {@code false} if not x large.
+     */
+    public static boolean isXLarge() {
+        return mIsXLarge;
+    }
+
+    /**
+     * Update the x large mode.
+     */
+    public void updateXLargeMode() {
+        mIsXLarge = ((getResources().getConfiguration().screenLayout &
+                      Configuration.SCREENLAYOUT_SIZE_MASK)
+                      == Configuration.SCREENLAYOUT_SIZE_XLARGE);
+    }
+
+    /**
+     * Get the instance of current IME.
+     *
+     * @return the instance of current IME, See {@link jp.co.omronsoft.openwnn.OpenWnn}
+     */
+    public static OpenWnn getCurrentIme() {
+        return mCurrentIme;
+    }
+
+    /**
+     * Check through key code in IME.
+     *
+     * @param keyCode  check key code.
+     * @return {@code true} if through key code; {@code false} otherwise.
+     */
+    protected boolean isThroughKeyCode(int keyCode) {
+        boolean result;
+        switch (keyCode) {
+        case KeyEvent.KEYCODE_CALL:
+        case KeyEvent.KEYCODE_VOLUME_DOWN:
+        case KeyEvent.KEYCODE_VOLUME_UP:
+        case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+        case KeyEvent.KEYCODE_MEDIA_NEXT:
+        case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+        case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+        case KeyEvent.KEYCODE_MEDIA_REWIND:
+        case KeyEvent.KEYCODE_MEDIA_STOP:
+        case KeyEvent.KEYCODE_MUTE:
+        case KeyEvent.KEYCODE_HEADSETHOOK:
+        case KeyEvent.KEYCODE_VOLUME_MUTE:
+        case KeyEvent.KEYCODE_MEDIA_CLOSE:
+        case KeyEvent.KEYCODE_MEDIA_EJECT:
+        case KeyEvent.KEYCODE_MEDIA_PAUSE:
+        case KeyEvent.KEYCODE_MEDIA_PLAY:
+        case KeyEvent.KEYCODE_MEDIA_RECORD:
+        case KeyEvent.KEYCODE_MANNER_MODE:
+            result = true;
+            break;
+
+        default:
+            result = false;
+            break;
+
+        }
+        return result;
+    }
+
+    /**
+     * Check ten-key code.
+     *
+     * @param keyCode  check key code.
+     * @return {@code true} if ten-key code; {@code false} not ten-key code.
+     */
+    protected boolean isTenKeyCode(int keyCode) {
+        boolean result = false;
+        switch (keyCode) {
+        case KeyEvent.KEYCODE_NUMPAD_0:
+        case KeyEvent.KEYCODE_NUMPAD_1:
+        case KeyEvent.KEYCODE_NUMPAD_2:
+        case KeyEvent.KEYCODE_NUMPAD_3:
+        case KeyEvent.KEYCODE_NUMPAD_4:
+        case KeyEvent.KEYCODE_NUMPAD_5:
+        case KeyEvent.KEYCODE_NUMPAD_6:
+        case KeyEvent.KEYCODE_NUMPAD_7:
+        case KeyEvent.KEYCODE_NUMPAD_8:
+        case KeyEvent.KEYCODE_NUMPAD_9:
+        case KeyEvent.KEYCODE_NUMPAD_DOT:
+            result = true;
+            break;
+
+        default:
+            break;
+
+        }
+        return result;
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnControlPanelJAJP.java b/src/jp/co/omronsoft/openwnn/OpenWnnControlPanelJAJP.java
index 9a4c205..9fe9263 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnControlPanelJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnControlPanelJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImpl.java b/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImpl.java
index e5b7fe0..4b8ac2c 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImpl.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -137,6 +137,8 @@
     protected SQLiteDatabase mDbDic = null;
     /** The search cursor of the writable dictionary */
     protected SQLiteCursor mDbCursor = null;
+    /** The writable dictionary object Access helper */
+    protected OpenWnnSQLiteOpenHelper mDbOpenHelper = null;
     /** The number of queried items */
     protected int mCountCursor = 0;
     /** The type of the search cursor object */
@@ -322,6 +324,7 @@
             /* The SQLiteDataBase object must close() before releasing. */
             mDbDic.close();
             mDbDic = null;
+            mDbOpenHelper = null;
         }
     }
     /**
@@ -351,7 +354,8 @@
     public void setInUseState( boolean flag ) {
         if( flag ) {
             if( mDbDic == null ) {
-                mDbDic = SQLiteDatabase.openOrCreateDatabase( mDicFilePath, null );
+                mDbOpenHelper = new OpenWnnSQLiteOpenHelper(OpenWnn.getCurrentIme(), mDicFilePath);
+                mDbDic = mDbOpenHelper.getWritableDatabase();
             }
         } else {
             freeDatabase();
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImplJni.java b/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImplJni.java
index 34d533f..4d49a8b 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImplJni.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImplJni.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnEN.java b/src/jp/co/omronsoft/openwnn/OpenWnnEN.java
index 6bcce4f..0b9ae15 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnEN.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnEN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -167,7 +167,13 @@
         mComposingText = new ComposingText();
         mCandidatesViewManager = new TextCandidatesViewManager(-1);
         mInputViewManager = new DefaultSoftKeyboardEN();
-        mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+
+        if (OpenWnn.getCurrentIme() != null) {
+            if (mConverterEN == null) {
+                mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+            }
+        }
+
         mConverter = mConverterEN;
         mSymbolList = null;
 
@@ -281,6 +287,10 @@
         super.onCreate();
         mWordSeparators = getResources().getString(R.string.en_word_separators);
 
+        if (mConverterEN == null) {
+            mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+        }
+
         if (mSymbolList == null) {
             mSymbolList = new SymbolList(this, SymbolList.LANG_EN);
         }
@@ -327,10 +337,15 @@
         fitInputType(pref, attribute);
 
         ((DefaultSoftKeyboard) mInputViewManager).resetCurrentKeyboard();
+
+        if (OpenWnn.isXLarge()) {
+            mTextCandidatesViewManager.setPreferences(pref);
+        }
     }
 
     /** @see jp.co.omronsoft.openwnn.OpenWnn#hideWindow */
     @Override public void hideWindow() {
+        ((BaseInputView)((DefaultSoftKeyboard) mInputViewManager).getCurrentView()).closeDialog();
         mComposingText.clear();
         mInputViewManager.onUpdateState(this);
         mHandler.removeMessages(MSG_START_TUTORIAL);
@@ -521,7 +536,7 @@
             ret = processKeyEvent(ev.keyEvent);
             if (!ret) {
             	int code = keyEvent.getKeyCode();
-            	if (code == KeyEvent.KEYCODE_ENTER) {
+            	if (code == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER) {
                     sendKeyChar('\n');
             	} else {
                     mInputConnection.sendKeyEvent(keyEvent);
@@ -705,6 +720,7 @@
                 return true;
 
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
             case KeyEvent.KEYCODE_DPAD_CENTER:
                 commitText(1);
                 mComposingText.clear();
@@ -715,7 +731,7 @@
                 return true;
 
             default:
-                break;
+                return !isThroughKeyCode(key);
             }
         } else {
             /* if there is no composing string. */
@@ -732,6 +748,7 @@
                 switch (key) {
                 case KeyEvent.KEYCODE_DPAD_CENTER:
                 case KeyEvent.KEYCODE_ENTER:
+                case KeyEvent.KEYCODE_NUMPAD_ENTER:
                     if (mEnableAutoHideKeyboard) {
                         mInputViewManager.closing();
                         requestHideSelf(0);
@@ -823,9 +840,9 @@
                     mDisplayText.setSpan(SPAN_REMAIN_BGCOLOR_HL, cursor, disp.length(),
                             Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                     mDisplayText.setSpan(SPAN_TEXTCOLOR, 0, disp.length(),
-                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
                 }
-
+ 
                 disp.setSpan(SPAN_UNDERLINE, 0, disp.length(),
                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             }
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnEvent.java b/src/jp/co/omronsoft/openwnn/OpenWnnEvent.java
index 06260e1..030fa57 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnEvent.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
 /**
  * The definition class of event message used by OpenWnn framework.
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public class OpenWnnEvent {
     /** Offset value for private events */
@@ -127,6 +127,11 @@
     public static final int CHANGE_MODE  = 0xF000000F;
 
     /**
+     * Key long press event.
+     */
+    public static final int KEYLONGPRESS = 0xF0000024;
+
+    /**
      * The definition class of engine's mode.
      */
     public static final class Mode {
@@ -224,6 +229,36 @@
      */
     public static final int TOUCH_OTHER_KEY = 0xF0000020;
 
+    /**
+     * Start focus candidate.
+     */
+    public static final int FOCUS_CANDIDATE_START = 0xF0002000;
+
+    /**
+     * End focus candidate.
+     */
+    public static final int FOCUS_CANDIDATE_END = 0xF0002001;
+
+    /**
+     * Scroll up for symbol keyboard.
+     */
+    public static final int CANDIDATE_VIEW_SCROLL_UP = 0xF0001000;
+
+    /**
+     * Scroll down for symbol keyboard.
+     */
+    public static final int CANDIDATE_VIEW_SCROLL_DOWN = 0xF0001001;
+
+    /**
+     * Scroll full up for symbol keyboard.
+     */
+    public static final int CANDIDATE_VIEW_SCROLL_FULL_UP = 0xF0001002;
+
+    /**
+     * Scroll full down for symbol keyboard.
+     */
+    public static final int CANDIDATE_VIEW_SCROLL_FULL_DOWN = 0xF0001003;
+
     /** Event code */
     public int code = UNDEFINED;
     /** Detail mode of the event */
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnJAJP.java b/src/jp/co/omronsoft/openwnn/OpenWnnJAJP.java
index 880fd11..cbcc074 100644
--- a/src/jp/co/omronsoft/openwnn/OpenWnnJAJP.java
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnJAJP.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 import jp.co.omronsoft.openwnn.JAJP.*;
 import android.content.SharedPreferences;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Handler;
 import android.os.Message;
@@ -34,18 +35,23 @@
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.KeyCharacterMap;
 import android.text.method.MetaKeyKeyListener;
 
+import jp.co.omronsoft.openwnn.BaseInputView;
+import jp.co.omronsoft.openwnn.OpenWnnControlPanelJAJP;
+
+import java.util.HashMap;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
 /**
  * The OpenWnn Japanese IME class
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
 public class OpenWnnJAJP extends OpenWnn {
     /**
@@ -70,7 +76,9 @@
      * Mode of the convert engine (Symbol list).
      * Use with {@code OpenWnn.CHANGE_MODE} event.
      */
-    public static final int ENGINE_MODE_SYMBOL = 104;
+    public static final int ENGINE_MODE_SYMBOL_NONE     = 1040;
+    public static final int ENGINE_MODE_SYMBOL          = 1041;
+    public static final int ENGINE_MODE_SYMBOL_KAO_MOJI = 1042;
 
     /**
      * Mode of the convert engine (Keyboard type is QWERTY).
@@ -143,6 +151,24 @@
     /** Delay time(msec.) to start prediction after key input when the candidates view is shown. */
     private static final int PREDICTION_DELAY_MS_SHOWING_CANDIDATE = 200;
 
+    /** H/W 12Keyboard keycode replace table */
+    private static final HashMap<Integer, Integer> HW12KEYBOARD_KEYCODE_REPLACE_TABLE
+            = new HashMap<Integer, Integer>() {{
+          put(KeyEvent.KEYCODE_0, DefaultSoftKeyboard.KEYCODE_JP12_0);
+          put(KeyEvent.KEYCODE_1, DefaultSoftKeyboard.KEYCODE_JP12_1);
+          put(KeyEvent.KEYCODE_2, DefaultSoftKeyboard.KEYCODE_JP12_2);
+          put(KeyEvent.KEYCODE_3, DefaultSoftKeyboard.KEYCODE_JP12_3);
+          put(KeyEvent.KEYCODE_4, DefaultSoftKeyboard.KEYCODE_JP12_4);
+          put(KeyEvent.KEYCODE_5, DefaultSoftKeyboard.KEYCODE_JP12_5);
+          put(KeyEvent.KEYCODE_6, DefaultSoftKeyboard.KEYCODE_JP12_6);
+          put(KeyEvent.KEYCODE_7, DefaultSoftKeyboard.KEYCODE_JP12_7);
+          put(KeyEvent.KEYCODE_8, DefaultSoftKeyboard.KEYCODE_JP12_8);
+          put(KeyEvent.KEYCODE_9, DefaultSoftKeyboard.KEYCODE_JP12_9);
+          put(KeyEvent.KEYCODE_POUND, DefaultSoftKeyboard.KEYCODE_JP12_SHARP);
+          put(KeyEvent.KEYCODE_STAR, DefaultSoftKeyboard.KEYCODE_JP12_ASTER);
+          put(KeyEvent.KEYCODE_CALL, DefaultSoftKeyboard.KEYCODE_JP12_REVERSE);
+    }};
+
 
     /** Convert engine's state */
     private class EngineState {
@@ -284,11 +310,11 @@
 
     /** Symbol lists to display when the symbol key is pressed */
     private static final String[] SYMBOL_LISTS = {
-        SymbolList.SYMBOL_JAPANESE_FACE, SymbolList.SYMBOL_JAPANESE, SymbolList.SYMBOL_ENGLISH
+        SymbolList.SYMBOL_JAPANESE, SymbolList.SYMBOL_JAPANESE_FACE
     };
 
     /** Current symbol list */
-    private int mCurrentSymbol = 0;
+    private int mCurrentSymbol = -1;
 
     /** Romaji-to-Kana converter (HIRAGANA) */
     private Romkan mPreConverterHiragana;
@@ -395,6 +421,9 @@
     /** Whether text selection has started */
     private boolean mHasStartedTextSelection = true;
 
+    /** Whether the H/W 12keyboard is active or not. */
+    private boolean mEnableHardware12Keyboard = false;
+
     /** {@code Handler} for drawing candidates/displaying tutorial */
     Handler mHandler = new Handler() {
             @Override
@@ -438,8 +467,16 @@
         mComposingText = new ComposingText();
         mCandidatesViewManager = new TextCandidatesViewManager(-1);
         mInputViewManager  = new DefaultSoftKeyboardJAJP();
-        mConverter = mConverterJAJP = new OpenWnnEngineJAJP("/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic");
-        mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+
+        if (OpenWnn.getCurrentIme() != null) {
+            if (mConverter == null || mConverterJAJP == null) {
+                mConverter = mConverterJAJP = new OpenWnnEngineJAJP("/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic");
+            }
+            if (mConverterEN == null) {
+                mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+            }
+        }
+
         mPreConverter = mPreConverterHiragana = new Romkan();
         mPreConverterFullKatakana = new RomkanFullKatakana();
         mPreConverterHalfKatakana = new RomkanHalfKatakana();
@@ -463,8 +500,16 @@
 
     /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreate */
     @Override public void onCreate() {
+        updateXLargeMode();
         super.onCreate();
 
+        if (mConverter == null || mConverterJAJP == null) {
+            mConverter = mConverterJAJP = new OpenWnnEngineJAJP("/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic");
+        }
+        if (mConverterEN == null) {
+            mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
+        }
+
         String delimiter = Pattern.quote(getResources().getString(R.string.en_word_separators));
         mEnglishAutoCommitDelimiter = Pattern.compile(".*[" + delimiter + "]$");
         if (mConverterSymbolEngineBack == null) {
@@ -476,14 +521,20 @@
     @Override public View onCreateInputView() {
         int hiddenState = getResources().getConfiguration().hardKeyboardHidden;
         boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES);
+        boolean type12Key
+                = (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_12KEY);
         ((DefaultSoftKeyboardJAJP) mInputViewManager).setHardKeyboardHidden(hidden);
+        ((DefaultSoftKeyboard) mInputViewManager).setHardware12Keyboard(type12Key);
+        mTextCandidatesViewManager.setHardKeyboardHidden(hidden);
         mEnableTutorial = hidden;
+        mEnableHardware12Keyboard = type12Key;
         return super.onCreateInputView();
     }
 
     /** @see jp.co.omronsoft.openwnn.OpenWnn#onStartInputView */
     @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
 
+        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
         if (restarting) {
             super.onStartInputView(attribute, restarting);
         } else {
@@ -498,6 +549,10 @@
 
             super.onStartInputView(attribute, restarting);
 
+            if (OpenWnn.isXLarge()) {
+                mTextCandidatesViewManager.setPreferences(pref);
+            }
+ 
             mCandidatesViewManager.clearCandidates();
             mStatus = STATUS_INIT;
             mExactMatchMode = false;
@@ -507,13 +562,15 @@
             mHardAlt   = 0;
             updateMetaKeyStateDisplay();
         }
-        /* load preferences */
-        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
 
         /* initialize the engine's state */
         fitInputType(pref, attribute);
 
-        ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(true);
+        if (OpenWnn.isXLarge()) {
+            mTextCandidates1LineViewManager.setAutoHide(true);
+        } else {
+            ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(true);
+        }
 
         if (isEnableL2Converter()) {
             breakSequence();
@@ -522,6 +579,12 @@
 
     /** @see jp.co.omronsoft.openwnn.OpenWnn#hideWindow */
     @Override public void hideWindow() {
+        mCandidatesViewManager.setCandidateMsgRemove();
+
+        BaseInputView baseInputView = ((BaseInputView)((DefaultSoftKeyboard) mInputViewManager).getCurrentView());
+        if (baseInputView != null) {
+            baseInputView.closeDialog();
+        }
         mComposingText.clear();
         mInputViewManager.onUpdateState(this);
         clearCommitInfo();
@@ -532,6 +595,12 @@
             mTutorial = null;
         }
 
+        if (OpenWnn.isXLarge()) {
+            mTextCandidates1LineViewManager.closeDialog();
+        } else {
+            mTextCandidatesViewManager.closeDialog();
+        }
+
         super.hideWindow();
     }
 
@@ -556,6 +625,10 @@
             return;
         }
 
+        if (mEngineState.isSymbolList()) {
+            return;
+        }
+
         boolean isNotComposing = ((candidatesStart < 0) && (candidatesEnd < 0));
         if ((mComposingText.size(ComposingText.LAYER1) != 0)
             && !isNotComposing) {
@@ -604,8 +677,12 @@
                 /* Hardware keyboard */
                 int hiddenState = newConfig.hardKeyboardHidden;
                 boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES);
+                boolean type12Key = (newConfig.keyboard == Configuration.KEYBOARD_12KEY);
                 ((DefaultSoftKeyboardJAJP) mInputViewManager).setHardKeyboardHidden(hidden);
+                ((DefaultSoftKeyboard) mInputViewManager).setHardware12Keyboard(type12Key);
+                mTextCandidatesViewManager.setHardKeyboardHidden(hidden);
                 mEnableTutorial = hidden;
+                mEnableHardware12Keyboard = type12Key;
             }
         } catch (Exception ex) {
             /* do nothing if an error occurs. */
@@ -624,6 +701,9 @@
             onKeyUpEvent(ev.keyEvent);
             return true;
 
+        case OpenWnnEvent.KEYLONGPRESS:
+            return onKeyLongPressEvent(ev.keyEvent);
+
         case OpenWnnEvent.INITIALIZE_LEARNING_DICTIONARY:
             mConverterEN.initializeDictionary(WnnEngine.DICTIONARY_TYPE_LEARN);
             mConverterJAJP.initializeDictionary(WnnEngine.DICTIONARY_TYPE_LEARN);
@@ -689,6 +769,37 @@
             mStatus |= STATUS_INPUT_EDIT;
             return true;
 
+        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP:
+            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollUp();
+            }
+            return true;
+
+        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN:
+            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollDown();
+            }
+            return true;
+
+        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_UP:
+            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollFullUp();
+            }
+            return true;
+
+        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_DOWN:
+            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollFullDown();
+            }
+            return true;
+
+        case OpenWnnEvent.FOCUS_CANDIDATE_START:
+            return true;
+
+        case OpenWnnEvent.FOCUS_CANDIDATE_END:
+            mInputViewManager.onUpdateState(this);
+            return true;
+
         default:
             break;
         }
@@ -723,6 +834,101 @@
             return false;
         }
 
+        if (mEngineState.isSymbolList()) {
+            if (keyEvent != null && keyEvent.isPrintingKey() && isTenKeyCode(keyCode) && !keyEvent.isNumLockOn()) {
+                return false;
+            }
+            switch (keyCode) {
+            case KeyEvent.KEYCODE_DEL:
+                return false;
+
+            case KeyEvent.KEYCODE_BACK:
+                initializeScreen();
+                return true;
+
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
+                if (mCandidatesViewManager.isFocusCandidate()) {
+                    mCandidatesViewManager.selectFocusCandidate();
+                    return true;
+                }
+                return false;
+
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                if (mCandidatesViewManager.isFocusCandidate()) {
+                    processLeftKeyEvent();
+                    return true;
+                }
+                return false;
+
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                if (mCandidatesViewManager.isFocusCandidate()) {
+                    processRightKeyEvent();
+                    return true;
+                }
+                return false;
+
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+                processDownKeyEvent();
+                return true;
+
+            case KeyEvent.KEYCODE_DPAD_UP:
+                if (mCandidatesViewManager.isFocusCandidate()) {
+                    processUpKeyEvent();
+                    return true;
+                }
+                return false;
+
+            case KeyEvent.KEYCODE_SPACE:
+                if (keyEvent != null) {
+                    if (keyEvent.isShiftPressed()) {
+                        onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP));
+                    } else if (keyEvent.isAltPressed()) {
+                        if (keyEvent.getRepeatCount() == 0) {
+                            switchSymbolList();
+                        }
+                    } else {
+                        onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN));
+                    }
+                }
+                return true;
+
+            case KeyEvent.KEYCODE_SYM:
+                switchSymbolList();
+                return true;
+
+            case KeyEvent.KEYCODE_PAGE_UP:
+                onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP));
+                return true;
+
+            case KeyEvent.KEYCODE_PAGE_DOWN:
+                onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN));
+                return true;
+
+            case KeyEvent.KEYCODE_PICTSYMBOLS:
+                if (keyEvent != null) {
+                    if (keyEvent.getRepeatCount() == 0) {
+                        switchSymbolList();
+                    }
+                }
+                return true;
+
+            default:
+            }
+
+            if ((ev.code == OpenWnnEvent.INPUT_KEY) &&
+                (keyCode != KeyEvent.KEYCODE_SEARCH) &&
+                (keyCode != KeyEvent.KEYCODE_ALT_LEFT) &&
+                (keyCode != KeyEvent.KEYCODE_ALT_RIGHT) &&
+                (keyCode != KeyEvent.KEYCODE_SHIFT_LEFT) &&
+                (keyCode != KeyEvent.KEYCODE_SHIFT_RIGHT)) {
+                state = new EngineState();
+                state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
+                updateEngineState(state);
+            }
+        }
+ 
         if (!((ev.code == OpenWnnEvent.COMMIT_COMPOSING_TEXT)
               || ((keyEvent != null)
                   && ((keyCode == KeyEvent.KEYCODE_SHIFT_LEFT)
@@ -751,13 +957,21 @@
             updateEngineState(state);
         }
 
+        if ((ev.code == OpenWnnEvent.INPUT_KEY) && processHardware12Keyboard(keyEvent)) {
+            return true;
+        }
+
         if (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL) {
             mStatus |= STATUS_CANDIDATE_FULL;
             mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_FULL);
+            if (!mEngineState.isSymbolList()) {
+                mInputViewManager.hideInputView();
+            }
             return true;
         } else if (ev.code == OpenWnnEvent.LIST_CANDIDATES_NORMAL) {
             mStatus &= ~STATUS_CANDIDATE_FULL;
             mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
+            mInputViewManager.showInputView();
             return true;
         }
 
@@ -838,7 +1052,7 @@
                 }
                 mAltPressing   = true;
                 updateMetaKeyStateDisplay();
-                return true;
+                return false;
 
             case KeyEvent.KEYCODE_SHIFT_LEFT:
             case KeyEvent.KEYCODE_SHIFT_RIGHT:
@@ -847,7 +1061,7 @@
                 }
                 mShiftPressing = true;
                 updateMetaKeyStateDisplay();
-                return true;
+                return false;
             }
 
             /* handle other key event */
@@ -885,6 +1099,17 @@
             break;
 
         case OpenWnnEvent.CONVERT:
+            if (mEngineState.isRenbun()) {
+                if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                    if (!mCandidatesViewManager.isFocusCandidate()) {
+                        processDownKeyEvent();
+                    }
+                    processRightKeyEvent();
+                } else {
+                    mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
+                }
+                break;
+            }
             startConvert(EngineState.CONVERT_TYPE_RENBUN);
             break;
 
@@ -942,6 +1167,20 @@
 
         /* keys which produce a glyph */
         if (ev.isPrintingKey()) {
+            if (isTenKeyCode(key) && !ev.isNumLockOn()) {
+                return false;
+            }
+            if (ev.isCtrlPressed()){
+                if (key == KeyEvent.KEYCODE_A || key == KeyEvent.KEYCODE_F || key == KeyEvent.KEYCODE_C ||
+                    key == KeyEvent.KEYCODE_V || key == KeyEvent.KEYCODE_X || key == KeyEvent.KEYCODE_Z) {
+                    if (mComposingText.size(ComposingText.LAYER1) < 1) {
+                        return false;
+                    } else {
+                        return true;
+                    }
+                }
+            }
+
             /* do nothing if the character is not able to display or the character is dead key */
             if ((mHardShift > 0 && mHardAlt > 0) ||
                 (ev.isAltPressed() && ev.isShiftPressed())) {
@@ -1009,7 +1248,7 @@
                     updateMetaKeyStateDisplay();
                 }
             }
-
+ 
             if (str == null) {
                 return true;
             }
@@ -1066,6 +1305,7 @@
                 if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) {
                     mStatus &= ~STATUS_CANDIDATE_FULL;
                     mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
+                    mInputViewManager.showInputView();
                 } else {
                     if (!mEngineState.isConvertState()) {
                         initializeScreen();
@@ -1102,8 +1342,27 @@
                 }
                 return true;
 
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+                processDownKeyEvent();
+                return true;
+
+            case KeyEvent.KEYCODE_DPAD_UP:
+                if (OpenWnn.isXLarge()) {
+                    updateViewStatusForPrediction(true, true);
+                } else {
+                    if (mCandidatesViewManager.isFocusCandidate()) {
+                        processUpKeyEvent();
+                    }
+                }
+                return true;
+
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
+                if (mCandidatesViewManager.isFocusCandidate()) {
+                    mCandidatesViewManager.selectFocusCandidate();
+                    return true;
+                }
                 if (!isEnglishPrediction()) {
                     int cursor = mComposingText.getCursor(ComposingText.LAYER1);
                     if (cursor < 1) {
@@ -1130,7 +1389,7 @@
                 return false;
 
             default:
-                return true;
+                return !isThroughKeyCode(key);
             }
         } else {
             /* if there is no composing string. */
@@ -1138,6 +1397,10 @@
                 /* displaying relational prediction candidates */
                 switch (key) {
                 case KeyEvent.KEYCODE_DPAD_LEFT:
+                    if (mCandidatesViewManager.isFocusCandidate()) {
+                        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT);
+                        return true;
+                    }
                     if (isEnableL2Converter()) {
                         /* initialize the converter */
                         mConverter.init();
@@ -1147,6 +1410,10 @@
                     return false;
 
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
+                    if (mCandidatesViewManager.isFocusCandidate()) {
+                        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
+                        return true;
+                    }
                     if (isEnableL2Converter()) {
                         /* initialize the converter */
                         mConverter.init();
@@ -1155,6 +1422,26 @@
                     updateViewStatusForPrediction(true, true);
                     return false;
 
+                case KeyEvent.KEYCODE_DPAD_DOWN:
+                    processDownKeyEvent();
+                    return true;
+
+                case KeyEvent.KEYCODE_DPAD_UP:
+                    if (mCandidatesViewManager.isFocusCandidate()) {
+                        processUpKeyEvent();
+                        return true;
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_DPAD_CENTER:
+                case KeyEvent.KEYCODE_ENTER:
+                case KeyEvent.KEYCODE_NUMPAD_ENTER:
+                    if (mCandidatesViewManager.isFocusCandidate()) {
+                        mCandidatesViewManager.selectFocusCandidate();
+                        return true;
+                    }
+                    break;
+
                 default:
                     return processKeyEventNoInputCandidateShown(ev);
                 }
@@ -1192,14 +1479,27 @@
             mHardAlt = 0;
             mHardShift = 0;
             updateMetaKeyStateDisplay();
+
+            SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
             if (mEngineState.isEnglish()) {
                 /* English mode to Japanese mode */
                 ((DefaultSoftKeyboardJAJP) mInputViewManager).changeKeyMode(DefaultSoftKeyboard.KEYMODE_JA_FULL_HIRAGANA);
                 mConverter = mConverterJAJP;
+
+                mEnableLearning   = pref.getBoolean("opt_enable_learning_ja", true);
+                mEnablePrediction = pref.getBoolean("opt_prediction_ja", true);
             } else {
                 /* Japanese mode to English mode */
                 ((DefaultSoftKeyboardJAJP) mInputViewManager).changeKeyMode(DefaultSoftKeyboard.KEYMODE_JA_HALF_ALPHABET);
                 mConverter = mConverterEN;
+
+                mEnableLearning   = pref.getBoolean("opt_enable_learning_en", true);
+                mEnablePrediction = pref.getBoolean("opt_prediction_en", false);
+                if (OpenWnn.isXLarge()) {
+                    mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", false);
+                } else {
+                    mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", true);
+                }
             }
             mCandidatesViewManager.clearCandidates();
 
@@ -1225,7 +1525,15 @@
                 checkCommitInfo();
             }
             mEnableAutoDeleteSpace = false;
-
+        } else if (mEngineState.isRenbun()) {
+            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                if (!mCandidatesViewManager.isFocusCandidate()) {
+                    processDownKeyEvent();
+                }
+                processRightKeyEvent();
+            } else {
+                mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
+            }
         } else {
             /* start consecutive clause conversion if Japanese mode */
             if (mComposingText.size(0) == 0) {
@@ -1312,6 +1620,11 @@
      * Handle a left key event.
      */
     private void processLeftKeyEvent() {
+        if (mCandidatesViewManager.isFocusCandidate()) {
+            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT);
+            return;
+        }
+
         if (mEngineState.isConvertState()) {
             if (mEngineState.isEisuKana()) {
                 mExactMatchMode = true;
@@ -1339,6 +1652,11 @@
      * Handle a right key event.
      */
     private void processRightKeyEvent() {
+        if (mCandidatesViewManager.isFocusCandidate()) {
+            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
+            return;
+        }
+
         int layer = mTargetLayer;
         ComposingText composingText = mComposingText;
         if (mExactMatchMode || (mEngineState.isConvertState())) {
@@ -1369,6 +1687,20 @@
     }
 
     /**
+     * Handle a down key event.
+     */
+    private void processDownKeyEvent() {
+        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN);
+    }
+
+    /**
+     * Handle a up key event.
+     */
+    private void processUpKeyEvent() {
+        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_UP);
+    }
+
+    /**
      * Handle a key event which is not right or left key when the
      * composing text is empty and some candidates are shown.
      *
@@ -1377,12 +1709,14 @@
      */
     boolean processKeyEventNoInputCandidateShown(KeyEvent ev) {
         boolean ret = true;
+        int key = ev.getKeyCode();
 
-        switch (ev.getKeyCode()) {
+        switch (key) {
         case KeyEvent.KEYCODE_DEL:
             ret = true;
             break;
         case KeyEvent.KEYCODE_ENTER:
+        case KeyEvent.KEYCODE_NUMPAD_ENTER:
         case KeyEvent.KEYCODE_DPAD_UP:
         case KeyEvent.KEYCODE_DPAD_DOWN:
         case KeyEvent.KEYCODE_MENU:
@@ -1402,6 +1736,7 @@
             if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) {
                 mStatus &= ~STATUS_CANDIDATE_FULL;
                 mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
+                mInputViewManager.showInputView();
                 return true;
             } else {
                 ret = true;
@@ -1409,7 +1744,7 @@
             break;
 
         default:
-            return true;
+            return !isThroughKeyCode(key);
         }
 
         if (mConverter != null) {
@@ -1749,6 +2084,10 @@
             }
             return;
 
+        case ENGINE_MODE_SYMBOL_KAO_MOJI:
+            changeSymbolEngineState(state, ENGINE_MODE_SYMBOL_KAO_MOJI);
+            return;
+
         default:
             break;
         }
@@ -1757,6 +2096,7 @@
         state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
         updateEngineState(state);
 
+        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
         state = new EngineState();
         switch (mode) {
         case OpenWnnEvent.Mode.DIRECT:
@@ -1771,6 +2111,14 @@
             updateEngineState(state);
             mConverter = mConverterEN;
             mPreConverter = null;
+
+            mEnableLearning   = pref.getBoolean("opt_enable_learning_en", true);
+            mEnablePrediction = pref.getBoolean("opt_prediction_en", false);
+            if (OpenWnn.isXLarge()) {
+                mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", false);
+            } else {
+                mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", true);
+            }
             break;
 
         case OpenWnnEvent.Mode.NO_LV2_CONV:
@@ -1794,6 +2142,9 @@
             updateEngineState(state);
             mConverter = mConverterJAJP;
             mPreConverter = mPreConverterHiragana;
+
+            mEnableLearning   = pref.getBoolean("opt_enable_learning_ja", true);
+            mEnablePrediction = pref.getBoolean("opt_prediction_ja", true);
             break;
         }
 
@@ -1860,10 +2211,19 @@
             case EngineState.TEMPORARY_DICTIONARY_MODE_NONE:
                 if (myState.temporaryMode != EngineState.TEMPORARY_DICTIONARY_MODE_NONE) {
                     setDictionary(mPrevDictionarySet);
-                    mCurrentSymbol = 0;
+                    mCurrentSymbol = -1;
                     mPreConverter = mPreConverterBack;
                     mConverter = mConverterBack;
                     mDisableAutoCommitEnglishMask &= ~AUTO_COMMIT_ENGLISH_SYMBOL;
+                    ((DefaultSoftKeyboard)mInputViewManager).setNormalKeyboard();
+                    mTextCandidatesViewManager.setSymbolMode(false, ENGINE_MODE_SYMBOL_NONE);
+                    if (OpenWnn.isXLarge()) {
+                        mCandidatesViewManager = mTextCandidates1LineViewManager;
+                        View view = mTextCandidates1LineViewManager.getCurrentView();
+                        if (view != null) {
+                            setCandidatesView(view);
+                        }
+                    }
                 }
                 break;
 
@@ -1878,7 +2238,25 @@
                 }
                 mConverter = mConverterSymbolEngineBack;
                 mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_SYMBOL;
+                int engineModeSymbol = 0;
+ 
+                if (SYMBOL_LISTS[mCurrentSymbol] == SymbolList.SYMBOL_JAPANESE) {
+                    engineModeSymbol = ENGINE_MODE_SYMBOL;
+                } else if (SYMBOL_LISTS[mCurrentSymbol] == SymbolList.SYMBOL_JAPANESE_FACE) {
+                    engineModeSymbol = ENGINE_MODE_SYMBOL_KAO_MOJI;
+                } else {
+                }
+ 
+                mTextCandidatesViewManager.setSymbolMode(true, engineModeSymbol);
+                if (OpenWnn.isXLarge()) {
+                    mCandidatesViewManager = mTextCandidatesViewManager;
+                    View view = mTextCandidatesViewManager.getCurrentView();
+                    if (view != null) {
+                        setCandidatesView(view);
+                    }
+                }
                 breakSequence();
+                ((DefaultSoftKeyboard)mInputViewManager).setSymbolKeyboard();
                 break;
 
             default:
@@ -2066,7 +2444,18 @@
                     commitSpaceJustOne();
                     checkCommitInfo();
                 } else {
-                    startConvert(EngineState.CONVERT_TYPE_RENBUN);
+                    if (mEngineState.isRenbun()) {
+                        if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
+                            if (!mCandidatesViewManager.isFocusCandidate()) {
+                                processDownKeyEvent();
+                            }
+                            processRightKeyEvent();
+                        } else {
+                            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
+                        }
+                    } else {
+                        startConvert(EngineState.CONVERT_TYPE_RENBUN);
+                    }
                 }
             }
             mEnableAutoDeleteSpace = false;
@@ -2267,14 +2656,24 @@
             return;
         }
 
-        mEnableLearning   = preference.getBoolean("opt_enable_learning", true);
-        mEnablePrediction = preference.getBoolean("opt_prediction", true);
-        mEnableSpellCorrection = preference.getBoolean("opt_spell_correction", true);
+        if (mConverter == mConverterEN) {
+            mEnableLearning   = preference.getBoolean("opt_enable_learning_en", true);
+            mEnablePrediction = preference.getBoolean("opt_prediction_en", false);
+            if (OpenWnn.isXLarge()) {
+                mEnableSpellCorrection = preference.getBoolean("opt_spell_correction_en", false);
+            } else {
+                mEnableSpellCorrection = preference.getBoolean("opt_spell_correction_en", true);
+            }
+        } else {
+            mEnableLearning   = preference.getBoolean("opt_enable_learning_ja", true);
+            mEnablePrediction = preference.getBoolean("opt_prediction_ja", true);
+        }
         mDisableAutoCommitEnglishMask &= ~AUTO_COMMIT_ENGLISH_OFF;
         int preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_NONE;
         mEnableConverter = true;
         mEnableSymbolList = true;
         mEnableSymbolListNonHalf = true;
+        setEnabledTabs(true);
         mAutoCaps = preference.getBoolean("auto_caps", true);
         mFilter.filter = 0;
         mEnableAutoInsertSpace = true;
@@ -2305,6 +2704,7 @@
                 mEnableSymbolListNonHalf = false;
                 mFilter.filter = CandidateFilter.FILTER_NON_ASCII;
                 mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_OFF;
+                mTextCandidatesViewManager.setEnableEmoticon(false);
                 break;
 
             case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
@@ -2353,7 +2753,9 @@
         updateEngineState(state);
         updateMetaKeyStateDisplay();
 
-        checkTutorial(info.privateImeOptions);
+        if (!OpenWnn.isXLarge()) {
+            checkTutorial(info.privateImeOptions);
+        }
     }
 
     /**
@@ -2473,6 +2875,85 @@
                 updateMetaKeyStateDisplay();
             }
         }
+        if (mEnableHardware12Keyboard && !mDirectInputMode) {
+            if (isHardKeyboard12KeyLongPress(key)
+                    && ((ev.getFlags() & KeyEvent.FLAG_CANCELED_LONG_PRESS) == 0)) {
+                switch (key) {
+                case KeyEvent.KEYCODE_SOFT_LEFT:
+                    if (mEngineState.isSymbolList()) {
+                        switchSymbolList();
+                    } else if ((mComposingText.size(0) != 0) && !mEngineState.isRenbun()
+                            && (((DefaultSoftKeyboardJAJP)mInputViewManager).getKeyMode()
+                                     == DefaultSoftKeyboardJAJP.KEYMODE_JA_FULL_HIRAGANA)) {
+                        startConvert(EngineState.CONVERT_TYPE_RENBUN);
+                    } else {
+                        ((DefaultSoftKeyboard) mInputViewManager).onKey(
+                                DefaultSoftKeyboard.KEYCODE_JP12_EMOJI, null);
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_SOFT_RIGHT:
+                    ((DefaultSoftKeyboardJAJP) mInputViewManager).showInputModeSwitchDialog();
+                    break;
+
+                case KeyEvent.KEYCODE_DEL:
+                    int newKeyCode = KeyEvent.KEYCODE_FORWARD_DEL;
+                    int composingTextSize = mComposingText.size(ComposingText.LAYER1);
+                    if (composingTextSize > 0) {
+                        if (mComposingText.getCursor(ComposingText.LAYER1) > (composingTextSize - 1)) {
+                            newKeyCode = KeyEvent.KEYCODE_DEL;
+                        }
+                        KeyEvent keyEvent = new KeyEvent(ev.getAction(), newKeyCode);
+                        if (!processKeyEvent(keyEvent)) {
+                            sendDownUpKeyEvents(keyEvent.getKeyCode());
+                        }
+                    } else {
+                        if (mInputConnection != null) {
+                            CharSequence text = mInputConnection.getTextAfterCursor(1, 0);
+                            if ((text == null) || (text.length() == 0)) {
+                                newKeyCode = KeyEvent.KEYCODE_DEL;
+                            }
+                        }
+                        sendDownUpKeyEvents(newKeyCode);
+                    }
+                    break;
+
+                default:
+                    break;
+
+                }
+            }
+        }
+    }
+
+    /**
+     * Handling KeyEvent(KEYLONGPRESS)
+     * <br>
+     * This method is called from {@link #handleEvent}.
+     *
+     * @param ev   An long press key event
+     * @return    {@code true} if the event is processed in this method; {@code false} if not.
+     */
+    private boolean onKeyLongPressEvent(KeyEvent ev) {
+        if (mEnableHardware12Keyboard) {
+            int keyCode = 0;
+            if (ev != null) {
+                keyCode = ev.getKeyCode();
+            }
+            switch (keyCode) {
+            case KeyEvent.KEYCODE_DEL:
+                initializeScreen();
+                if (mInputConnection != null) {
+                    mInputConnection.deleteSurroundingText(Integer.MAX_VALUE, Integer.MAX_VALUE);
+                }
+                return true;
+
+            default:
+                break;
+
+            }
+        }
+        return false;
     }
 
     /**
@@ -2574,4 +3055,84 @@
         mConverterJAJP.breakSequence();
         mConverterEN.breakSequence();
     }
+
+    /**
+     * Switch symbol list.
+     */
+    private void switchSymbolList(){
+        changeSymbolEngineState(new EngineState(), ENGINE_MODE_SYMBOL);
+        mHardAlt = 0;
+        updateMetaKeyStateDisplay();
+    }
+
+    /**
+     * Change symbol engine state.
+     *
+     * @param  state  Engine state
+     * @param  mode   Engine mode
+     */
+    private void changeSymbolEngineState(EngineState state, int mode) {
+        state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_SYMBOL;
+        updateEngineState(state);
+    }
+
+    /**
+     * Set enable tabs.
+     *
+     * @param enableEmoticon {@code true}  - Emoticon is enabled.
+     *                       {@code false} - Emoticon is disabled.
+     */
+    private void setEnabledTabs(boolean enableEmoticon) {
+        mTextCandidatesViewManager.setEnableEmoticon(enableEmoticon);
+    }
+
+    /**
+     * Is enable hard keyboard 12Key long press keycode.
+     *
+     * @param  keyCode  keycode.
+     * @return  {@code true} if enable long press keycode; {@code false} if not.
+     */
+    private boolean isHardKeyboard12KeyLongPress(int keyCode) {
+        boolean isLongPress = false;
+        switch (keyCode) {
+        case KeyEvent.KEYCODE_SOFT_LEFT:
+        case KeyEvent.KEYCODE_SOFT_RIGHT:
+        case KeyEvent.KEYCODE_DEL:
+            isLongPress = true;
+            break;
+
+        default:
+            break;
+        }
+        return isLongPress;
+    }
+
+    /**
+     * Key event handler for hardware 12Keyboard.
+     *
+     * @param keyEvent A key event
+     * @return  {@code true} if the event is handled in this method.
+     */
+    private boolean processHardware12Keyboard(KeyEvent keyEvent) {
+        boolean ret = false;
+        if (mEnableHardware12Keyboard && (keyEvent != null)) {
+            int keyCode = keyEvent.getKeyCode();
+
+            if (isHardKeyboard12KeyLongPress(keyCode)) {
+                if (keyEvent.getRepeatCount() == 0) {
+                    keyEvent.startTracking();
+                }
+                ret = true;
+            } else {
+                Integer code = HW12KEYBOARD_KEYCODE_REPLACE_TABLE.get(keyCode);
+                if (code != null) {
+                    if (keyEvent.getRepeatCount() == 0) {
+                        ((DefaultSoftKeyboard) mInputViewManager).onKey(code.intValue(), null);
+                    }
+                    ret = true;
+                }
+            }
+        }
+        return ret;
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/OpenWnnSQLiteOpenHelper.java b/src/jp/co/omronsoft/openwnn/OpenWnnSQLiteOpenHelper.java
new file mode 100644
index 0000000..382dc09
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/OpenWnnSQLiteOpenHelper.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jp.co.omronsoft.openwnn;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import android.util.Log;
+
+/**
+ * The implementation class of SQLiteOpenHelper .
+ *
+ * @author Copyright (C) 2012 OMRON SOFTWARE CO.,LTD.  All Rights Reserved.
+ */
+public class OpenWnnSQLiteOpenHelper extends SQLiteOpenHelper {
+    private static final int DATABASE_VERSION = 1;
+
+    public OpenWnnSQLiteOpenHelper(Context context, String dbname) {
+        super(context, dbname, null, DATABASE_VERSION);
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/StrSegment.java b/src/jp/co/omronsoft/openwnn/StrSegment.java
index b0715bc..481bb13 100644
--- a/src/jp/co/omronsoft/openwnn/StrSegment.java
+++ b/src/jp/co/omronsoft/openwnn/StrSegment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/StrSegmentClause.java b/src/jp/co/omronsoft/openwnn/StrSegmentClause.java
index 210b3d8..1922210 100644
--- a/src/jp/co/omronsoft/openwnn/StrSegmentClause.java
+++ b/src/jp/co/omronsoft/openwnn/StrSegmentClause.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/SymbolList.java b/src/jp/co/omronsoft/openwnn/SymbolList.java
index e41bc4d..8000525 100644
--- a/src/jp/co/omronsoft/openwnn/SymbolList.java
+++ b/src/jp/co/omronsoft/openwnn/SymbolList.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -98,10 +98,10 @@
 
         case LANG_JA:
             /* symbols for Japanese IME */
-            mSymbols.put(SYMBOL_ENGLISH, getXmlfile(R.xml.symbols_latin1_list));
             mSymbols.put(SYMBOL_JAPANESE, getXmlfile(R.xml.symbols_japan_list));
             mSymbols.put(SYMBOL_JAPANESE_FACE, getXmlfile(R.xml.symbols_japan_face_list));
-            mCurrentList = mSymbols.get(SYMBOL_ENGLISH);
+            mSymbols.put(SYMBOL_ENGLISH, getXmlfile(R.xml.symbols_latin1_list));
+            mCurrentList = mSymbols.get(SYMBOL_JAPANESE);
             break;
 
         case LANG_ZHCN: 
diff --git a/src/jp/co/omronsoft/openwnn/TextCandidates1LineViewManager.java b/src/jp/co/omronsoft/openwnn/TextCandidates1LineViewManager.java
new file mode 100644
index 0000000..4b1a65b
--- /dev/null
+++ b/src/jp/co/omronsoft/openwnn/TextCandidates1LineViewManager.java
@@ -0,0 +1,726 @@
+/*
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package jp.co.omronsoft.openwnn;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Vibrator;
+import android.text.Layout;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.AbsoluteSizeSpan;
+import android.text.style.AlignmentSpan;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.HorizontalScrollView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * The default candidates view manager using {@link android.widget.EditText}.
+ *
+ * @author Copyright (C) 2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ */
+public class TextCandidates1LineViewManager extends CandidatesViewManager {
+
+    /** displayCandidates() normal display */
+    private static final int IS_NEXTCANDIDATE_NORMAL = 1;
+    /** displayCandidates() delay display */
+    private static final int IS_NEXTCANDIDATE_DELAY = 2;
+    /** displayCandidates() display end */
+    private static final int IS_NEXTCANDIDATE_END = 3;
+
+    /** Delay of set candidate */
+    private static final int SET_CANDIDATE_DELAY = 50;
+    /** Delay Millis */
+    private static final int CANDIDATE_DELAY_MILLIS = 500;
+
+    /** Scroll distance */
+    private static final float SCROLL_DISTANCE = 0.9f;
+
+    /** Body view of the candidates list */
+    private ViewGroup  mViewBody;
+    /** Scroller */
+    private HorizontalScrollView mViewBodyScroll;
+    /** Left more button */
+    private ImageView mLeftMoreButton;
+    /** Right more button */
+    private ImageView mRightMoreButton;
+    /** Candidate view */
+    private LinearLayout mViewCandidateList;
+
+    /** {@link OpenWnn} instance using this manager */
+    private OpenWnn mWnn;
+    /** View type (VIEW_TYPE_NORMAL or VIEW_TYPE_FULL or VIEW_TYPE_CLOSE) */
+    private int mViewType;
+
+    /** view width */
+    private int mViewWidth;
+    /** Minimum width of candidate view */
+    private int mCandidateMinimumWidth;
+    /** Minimum height of candidate view */
+    private int mCandidateMinimumHeight;
+
+    /** Minimum width of candidate view */
+    private static final int CANDIDATE_MINIMUM_WIDTH = 48;
+
+    /** Whether hide the view if there is no candidate */
+    private boolean mAutoHideMode;
+    /** The converter to get candidates from and notice the selected candidate to. */
+    private WnnEngine mConverter;
+    /** Limitation of displaying candidates */
+    private int mDisplayLimit;
+
+    /** Vibrator for touch vibration */
+    private Vibrator mVibrator = null;
+    /** AudioManager for click sound */
+    private AudioManager mSound = null;
+
+    /** Number of candidates displaying */
+    private int mWordCount;
+    /** List of candidates */
+    private ArrayList<WnnWord> mWnnWordArray;
+
+    /** Character width of the candidate area */
+    private int mLineLength = 0;
+    /** Maximum width of candidate view */
+    private int mCandidateMaxWidth = 0;
+    /** general information about a display */
+    private final DisplayMetrics mMetrics = new DisplayMetrics();
+    /** Focus is none now */
+    private static final int FOCUS_NONE = -1;
+    /** Handler for set  Candidate */
+    private static final int MSG_SET_CANDIDATES = 1;
+    /** List of textView for CandiData List */
+    private ArrayList<TextView> mTextViewArray = new ArrayList<TextView>();
+    /** Now focus textView index */
+    private int mCurrentFocusIndex = FOCUS_NONE;
+    /** Focused View */
+    private View mFocusedView = null;
+    /** Focused View Background */
+    private Drawable mFocusedViewBackground = null;
+    /** Scale up text size */
+    private AbsoluteSizeSpan mSizeSpan;
+    /** Scale up text alignment */
+    private AlignmentSpan.Standard mCenterSpan;
+    /** Whether candidates long click enable */
+    private boolean mEnableCandidateLongClick = true;
+
+   /** {@code Handler} Handler for focus Candidate wait delay */
+    private Handler mHandler = new Handler() {
+            @Override public void handleMessage(Message msg) {
+
+            switch (msg.what) {
+                case MSG_SET_CANDIDATES:
+                    displayCandidatesDelay(mConverter);
+                    break;
+
+                default:
+                    break;
+                }
+            }
+        };
+
+    /** Event listener for touching a candidate */
+    private OnClickListener mCandidateOnClick = new OnClickListener() {
+        public void onClick(View v) {
+            if (!v.isShown()) {
+                return;
+            }
+            playSoundAndVibration();
+
+            if (v instanceof CandidateTextView) {
+                CandidateTextView text = (CandidateTextView)v;
+                int wordcount = text.getId();
+                WnnWord word = getWnnWord(wordcount);
+                clearFocusCandidate();
+                selectCandidate(word);
+            }
+        }
+    };
+
+    /** Event listener for long-clicking a candidate */
+    private OnLongClickListener mCandidateOnLongClick = new OnLongClickListener() {
+        public boolean onLongClick(View v) {
+            if (!v.isShown()) {
+                return true;
+            }
+
+            if (!mEnableCandidateLongClick) {
+                return false;
+            }
+
+            clearFocusCandidate();
+
+            int wordcount = ((TextView)v).getId();
+            mWord = mWnnWordArray.get(wordcount);
+
+            displayDialog(v, mWord);
+            return true;
+        }
+    };
+
+    /**
+     * Constructor
+     */
+    public TextCandidates1LineViewManager() {
+        this(300);
+    }
+
+    /**
+     * Constructor
+     *
+     * @param displayLimit      The limit of display
+     */
+    public TextCandidates1LineViewManager(int displayLimit) {
+        mDisplayLimit = displayLimit;
+        mWnnWordArray = new ArrayList<WnnWord>();
+        mAutoHideMode = true;
+        mMetrics.setToDefaults();
+    }
+
+    /**
+     * Set auto-hide mode.
+     * @param hide      {@code true} if the view will hidden when no candidate exists;
+     *                  {@code false} if the view is always shown.
+     */
+    public void setAutoHide(boolean hide) {
+        mAutoHideMode = hide;
+    }
+
+    /** @see CandidatesViewManager */
+    public View initView(OpenWnn parent, int width, int height) {
+        mWnn = parent;
+        mViewWidth = width;
+
+        Resources r = mWnn.getResources();
+
+        mCandidateMinimumWidth = (int)(CANDIDATE_MINIMUM_WIDTH * mMetrics.density);
+        mCandidateMinimumHeight = r.getDimensionPixelSize(R.dimen.candidate_layout_height);
+
+        LayoutInflater inflater = parent.getLayoutInflater();
+        mViewBody = (ViewGroup)inflater.inflate(R.layout.candidates_1line, null);
+        mViewBodyScroll = (HorizontalScrollView)mViewBody.findViewById(R.id.candview_scroll_1line);
+        mViewBodyScroll.setOverScrollMode(View.OVER_SCROLL_NEVER);
+        mViewBodyScroll.setOnTouchListener(new View.OnTouchListener() {
+            public boolean onTouch(View v, MotionEvent event) {
+                switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                case MotionEvent.ACTION_MOVE:
+                    if (mHandler.hasMessages(MSG_SET_CANDIDATES)) {
+                        mHandler.removeMessages(MSG_SET_CANDIDATES);
+                        mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, CANDIDATE_DELAY_MILLIS);
+                    }
+                    break;
+
+                default:
+                    break;
+
+                }
+                return false;
+            }
+        });
+
+        mLeftMoreButton = (ImageView)mViewBody.findViewById(R.id.left_more_imageview);
+        mLeftMoreButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                if (!v.isShown()) {
+                    return;
+                }
+                playSoundAndVibration();
+                if (mViewBodyScroll.getScrollX() > 0) {
+                    mViewBodyScroll.smoothScrollBy(
+                                        (int)(mViewBodyScroll.getWidth() * -SCROLL_DISTANCE), 0);
+                }
+            }
+        });
+        mLeftMoreButton.setOnLongClickListener(new View.OnLongClickListener() {
+            public boolean onLongClick(View v) {
+                if (!v.isShown()) {
+                    return false;
+                }
+                if (!mViewBodyScroll.fullScroll(View.FOCUS_LEFT)) {
+                    mViewBodyScroll.scrollTo(mViewBodyScroll.getChildAt(0).getWidth(), 0);
+                }
+                return true;
+            }
+        });
+
+        mRightMoreButton = (ImageView)mViewBody.findViewById(R.id.right_more_imageview);
+        mRightMoreButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                if (!v.isShown()) {
+                    return;
+                }
+                int width = mViewBodyScroll.getWidth();
+                int scrollMax = mViewBodyScroll.getChildAt(0).getRight();
+
+                if ((mViewBodyScroll.getScrollX() + width) < scrollMax) {
+                    mViewBodyScroll.smoothScrollBy((int)(width * SCROLL_DISTANCE), 0);
+                }
+            }
+        });
+        mRightMoreButton.setOnLongClickListener(new View.OnLongClickListener() {
+            public boolean onLongClick(View v) {
+                if (!v.isShown()) {
+                    return false;
+                }
+                if (!mViewBodyScroll.fullScroll(View.FOCUS_RIGHT)) {
+                    mViewBodyScroll.scrollTo(0, 0);
+                }
+                return true;
+            }
+        });
+
+        mViewLongPressDialog = (View)inflater.inflate(R.layout.candidate_longpress_dialog, null);
+
+        /* select button */
+        Button longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_select);
+        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    playSoundAndVibration();
+                    clearFocusCandidate();
+                    selectCandidate(mWord);
+                    closeDialog();
+                }
+            });
+
+        /* cancel button */
+        longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_cancel);
+        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    playSoundAndVibration();
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.UPDATE_CANDIDATE));
+                    closeDialog();
+                }
+            });
+
+        int buttonWidth = r.getDimensionPixelSize(R.dimen.candidate_layout_width);
+        mCandidateMaxWidth = (mViewWidth - buttonWidth * 2) / 2;
+
+        mSizeSpan = new AbsoluteSizeSpan(r.getDimensionPixelSize(R.dimen.candidate_delete_word_size));
+        mCenterSpan = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
+
+        createNormalCandidateView();
+
+        setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE);
+
+        return mViewBody;
+    }
+
+    /**
+     * Create normal candidate view
+     */
+    private void createNormalCandidateView() {
+        mViewCandidateList = (LinearLayout)mViewBody.findViewById(R.id.candidates_view_1line);
+
+        Context context = mViewBodyScroll.getContext();
+        for (int i = 0; i < mDisplayLimit; i++) {
+            mViewCandidateList.addView(new CandidateTextView(context,
+                                                            mCandidateMinimumHeight,
+                                                            mCandidateMinimumWidth,
+                                                            mCandidateMaxWidth));
+        }
+    }
+
+    /** @see CandidatesViewManager#getCurrentView */
+    public View getCurrentView() {
+        return mViewBody;
+    }
+
+    /** @see CandidatesViewManager#setViewType */
+    public void setViewType(int type) {
+        mViewType = type;
+
+        if (type == CandidatesViewManager.VIEW_TYPE_NORMAL) {
+            mViewCandidateList.setMinimumHeight(mCandidateMinimumHeight);
+        } else {
+            mViewCandidateList.setMinimumHeight(-1);
+            mHandler.removeMessages(MSG_SET_CANDIDATES);
+
+            if (mViewBody.isShown()) {
+                mWnn.setCandidatesViewShown(false);
+            }
+        }
+    }
+
+    /** @see CandidatesViewManager#getViewType */
+    public int getViewType() {
+        return mViewType;
+    }
+
+    /** @see CandidatesViewManager#displayCandidates */
+    public void displayCandidates(WnnEngine converter) {
+
+        mHandler.removeMessages(MSG_SET_CANDIDATES);
+
+        closeDialog();
+        clearCandidates();
+        mConverter = converter;
+
+        int isNextCandidate = IS_NEXTCANDIDATE_NORMAL;
+        while(isNextCandidate == IS_NEXTCANDIDATE_NORMAL) {
+            isNextCandidate = displayCandidatesNormal(converter);
+        }
+
+        if (isNextCandidate == IS_NEXTCANDIDATE_DELAY) {
+            isNextCandidate = displayCandidatesDelay(converter);
+        }
+
+        mViewBodyScroll.scrollTo(0,0);
+    }
+
+
+    /**
+     * Display the candidates.
+     * @param converter  {@link WnnEngine} which holds candidates.
+     */
+    private int displayCandidatesNormal(WnnEngine converter) {
+        int isNextCandidate = IS_NEXTCANDIDATE_NORMAL;
+
+        if (converter == null) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        /* Get candidates */
+        WnnWord result = converter.getNextCandidate();
+        if (result == null) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        mLineLength += setCandidate(result);
+        if (mLineLength >= mViewWidth) {
+            isNextCandidate = IS_NEXTCANDIDATE_DELAY;
+        }
+
+        if (mWordCount < 1) { /* no candidates */
+            if (mAutoHideMode) {
+                mWnn.setCandidatesViewShown(false);
+                return IS_NEXTCANDIDATE_END;
+            }
+        }
+
+        if (mWordCount > mDisplayLimit) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        if (!(mViewBody.isShown())) {
+            mWnn.setCandidatesViewShown(true);
+        }
+        return isNextCandidate;
+    }
+
+    /**
+     * Display the candidates.
+     * @param converter  {@link WnnEngine} which holds candidates.
+     */
+    private int displayCandidatesDelay(WnnEngine converter) {
+        int isNextCandidate = IS_NEXTCANDIDATE_DELAY;
+
+        if (converter == null) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        /* Get candidates */
+        WnnWord result = converter.getNextCandidate();
+        if (result == null) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        setCandidate(result);
+
+        if (mWordCount > mDisplayLimit) {
+            return IS_NEXTCANDIDATE_END;
+        }
+
+        mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, SET_CANDIDATE_DELAY);
+
+        return isNextCandidate;
+    }
+
+    /**
+     * Set the candidate for candidate view
+     * @param word set word
+     * @return int Set width
+     */
+    private int setCandidate(WnnWord word) {
+        CandidateTextView candidateTextView =
+                (CandidateTextView) mViewCandidateList.getChildAt(mWordCount);
+        candidateTextView.setCandidateTextView(word, mWordCount, mCandidateOnClick,
+                                                    mCandidateOnLongClick);
+        mWnnWordArray.add(mWordCount, word);
+        mWordCount++;
+        mTextViewArray.add(candidateTextView);
+
+        return candidateTextView.getWidth();
+    }
+
+    /**
+     * Clear the candidate view
+     */
+    private void clearNormalViewCandidate() {
+        int candidateNum = mViewCandidateList.getChildCount();
+        for (int i = 0; i < candidateNum; i++) {
+            View v = mViewCandidateList.getChildAt(i);
+            v.setVisibility(View.GONE);
+        }
+    }
+
+    /** @see CandidatesViewManager#clearCandidates */
+    public void clearCandidates() {
+        clearFocusCandidate();
+        clearNormalViewCandidate();
+
+        mLineLength = 0;
+
+        mWordCount = 0;
+        mWnnWordArray.clear();
+        mTextViewArray.clear();
+
+        if (mAutoHideMode && mViewBody.isShown()) {
+            mWnn.setCandidatesViewShown(false);
+        }
+    }
+
+    /** @see CandidatesViewManager#setPreferences */
+    public void setPreferences(SharedPreferences pref) {
+        try {
+            if (pref.getBoolean("key_vibration", false)) {
+                mVibrator = (Vibrator)mWnn.getSystemService(Context.VIBRATOR_SERVICE);
+            } else {
+                mVibrator = null;
+            }
+            if (pref.getBoolean("key_sound", false)) {
+                mSound = (AudioManager)mWnn.getSystemService(Context.AUDIO_SERVICE);
+            } else {
+                mSound = null;
+            }
+        } catch (Exception ex) {
+            Log.d("OpenWnn", "NO VIBRATOR");
+        }
+    }
+
+    /**
+     * Select a candidate.
+     * <br>
+     * This method notices the selected word to {@link OpenWnn}.
+     *
+     * @param word  The selected word
+     */
+    private void selectCandidate(WnnWord word) {
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.SELECT_CANDIDATE, word));
+    }
+
+    private void playSoundAndVibration() {
+        if (mVibrator != null) {
+            try {
+                mVibrator.vibrate(5);
+            } catch (Exception ex) {
+                Log.e("OpenWnn", "TextCandidates1LineViewManager::selectCandidate Vibrator " + ex.toString());
+            }
+        }
+        if (mSound != null) {
+            try {
+                mSound.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, 1.0f);
+            } catch (Exception ex) {
+                Log.e("OpenWnn", "TextCandidates1LineViewManager::selectCandidate Sound " + ex.toString());
+            }
+        }
+    }
+
+    /**
+     * KeyEvent action for the candidate view.
+     *
+     * @param key    Key event
+     */
+    public void processMoveKeyEvent(int key) {
+        if (!mViewBody.isShown()) {
+            return;
+        }
+
+        switch (key) {
+        case KeyEvent.KEYCODE_DPAD_LEFT:
+            moveFocus(-1);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_RIGHT:
+            moveFocus(1);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_UP:
+            moveFocus(-1);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_DOWN:
+            moveFocus(1);
+            break;
+
+        default:
+            break;
+
+        }
+    }
+
+    /**
+     * Get a flag candidate is focused now.
+     *
+     * @return the Candidate is focused of a flag.
+     */
+    public boolean isFocusCandidate(){
+        if (mCurrentFocusIndex != FOCUS_NONE) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Give focus to View of candidate.
+     */
+    private void setViewStatusOfFocusedCandidate() {
+        View view = mFocusedView;
+        if (view != null) {
+            view.setBackgroundDrawable(mFocusedViewBackground);
+        }
+
+        TextView v = getFocusedView();
+        mFocusedView = v;
+        if (v != null) {
+            mFocusedViewBackground = v.getBackground();
+            v.setBackgroundResource(R.drawable.cand_back_focuse);
+
+            int viewBodyLeft = getViewLeftOnScreen(mViewBodyScroll);
+            int viewBodyRight = viewBodyLeft + mViewBodyScroll.getWidth();
+            int focusedViewLeft = getViewLeftOnScreen(v);
+            int focusedViewRight = focusedViewLeft + v.getWidth();
+
+            if (focusedViewRight > viewBodyRight) {
+                mViewBodyScroll.scrollBy((focusedViewRight - viewBodyRight), 0);
+            } else if (focusedViewLeft < viewBodyLeft) {
+                mViewBodyScroll.scrollBy((focusedViewLeft - viewBodyLeft), 0);
+            }
+        }
+    }
+
+    /**
+     * Clear focus to selected candidate.
+     */
+    private void clearFocusCandidate(){
+        View view = mFocusedView;
+        if (view != null) {
+            view.setBackgroundDrawable(mFocusedViewBackground);
+            mFocusedView = null;
+        }
+
+        mCurrentFocusIndex = FOCUS_NONE;
+
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_END));
+    }
+
+    /**
+     * Select candidate that has focus.
+     */
+    public void selectFocusCandidate(){
+        if (mCurrentFocusIndex != FOCUS_NONE) {
+            selectCandidate(getFocusedWnnWord());
+        }
+    }
+
+    /**
+     * Get View of focus candidate.
+     */
+    private TextView getFocusedView() {
+        if (mCurrentFocusIndex == FOCUS_NONE) {
+            return null;
+        }
+        return mTextViewArray.get(mCurrentFocusIndex);
+    }
+
+    /**
+     * Move the focus to next candidate.
+     *
+     * @param direction  The direction of increment or decrement.
+     */
+    private void moveFocus(int direction) {
+        boolean isStart = (mCurrentFocusIndex == FOCUS_NONE);
+        int size = mTextViewArray.size();
+        int index = isStart ? 0 : (mCurrentFocusIndex + direction);
+
+        if (index < 0) {
+            index = size - 1;
+        } else {
+            if (index >= size) {
+                index = 0;
+            }
+        }
+
+        mCurrentFocusIndex = index;
+        setViewStatusOfFocusedCandidate();
+
+        if (isStart) {
+            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_START));
+        }
+    }
+
+    /**
+     * Get view top position on screen.
+     *
+     * @param view target view.
+     * @return int view top position on screen
+     */
+    private int getViewLeftOnScreen(View view) {
+        int[] location = new int[2];
+        view.getLocationOnScreen(location);
+        return location[0];
+    }
+
+    /** @see CandidatesViewManager#getFocusedWnnWord */
+    public WnnWord getFocusedWnnWord() {
+        return getWnnWord(mCurrentFocusIndex);
+    }
+
+    /**
+     * Get WnnWord.
+     *
+     * @return WnnWord word
+     */
+    public WnnWord getWnnWord(int index) {
+        return mWnnWordArray.get(index);
+    }
+
+    /** @see CandidatesViewManager#setCandidateMsgRemove */
+    public void setCandidateMsgRemove() {
+        mHandler.removeMessages(MSG_SET_CANDIDATES);
+    }
+}
diff --git a/src/jp/co/omronsoft/openwnn/TextCandidatesViewManager.java b/src/jp/co/omronsoft/openwnn/TextCandidatesViewManager.java
index c84e845..81df56e 100644
--- a/src/jp/co/omronsoft/openwnn/TextCandidatesViewManager.java
+++ b/src/jp/co/omronsoft/openwnn/TextCandidatesViewManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,13 +16,20 @@
 
 package jp.co.omronsoft.openwnn;
 
+import java.nio.channels.Selector;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.media.MediaPlayer;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.graphics.Rect;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Message;
 import android.os.Vibrator;
+import android.preference.PreferenceManager;
 import android.text.TextUtils;
 import android.text.TextPaint;
 import android.text.SpannableString;
@@ -31,13 +38,14 @@
 import android.text.style.DynamicDrawableSpan;
 import android.util.Log;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.Gravity;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
-import android.view.View.OnTouchListener;
 import android.view.GestureDetector;
 import android.view.LayoutInflater;
 import android.widget.Button;
@@ -47,16 +55,13 @@
 import android.widget.EditText;
 import android.widget.AbsoluteLayout;
 import android.widget.ImageView;
-import android.graphics.drawable.Drawable;
 
 /**
  * The default candidates view manager class using {@link EditText}.
  *
- * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
+ * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  */
-public class TextCandidatesViewManager implements CandidatesViewManager, GestureDetector.OnGestureListener {
-    /** Height of a line */
-    public static final int LINE_HEIGHT = 34;
+public class TextCandidatesViewManager extends CandidatesViewManager implements GestureDetector.OnGestureListener {
     /** Number of lines to display (Portrait) */
     public static final int LINE_NUM_PORTRAIT       = 2;
     /** Number of lines to display (Landscape) */
@@ -64,29 +69,50 @@
 
     /** Maximum lines */
     private static final int DISPLAY_LINE_MAX_COUNT = 1000;
-    /** Width of the view */
-    private static final int CANDIDATE_MINIMUM_WIDTH = 48;
-    /** Height of the view */
-    private static final int CANDIDATE_MINIMUM_HEIGHT = 35;
-    /** Align the candidate left if the width of the string exceeds this threshold */
-    private static final int CANDIDATE_LEFT_ALIGN_THRESHOLD = 120;
     /** Maximum number of displaying candidates par one line (full view mode) */
     private static final int FULL_VIEW_DIV = 4;
+    /** Maximum number of displaying candidates par one line (full view mode)(symbol)(portrait) */
+    private static final int FULL_VIEW_SYMBOL_DIV_PORT = 6;
+    /** Maximum number of displaying candidates par one line (full view mode)(symbol)(landscape) */
+    private static final int FULL_VIEW_SYMBOL_DIV_LAND = 10;
+    /** Delay of set candidate */
+    private static final int SET_CANDIDATE_DELAY = 50;
+    /** First line count */
+    private static final int SET_CANDIDATE_FIRST_LINE_COUNT = 7;
+    /** Delay line count */
+    private static final int SET_CANDIDATE_DELAY_LINE_COUNT = 1;
+
+    /** Focus is none now */
+    private static final int FOCUS_NONE = -1;
+    /** Handler for focus Candidate */
+    private static final int MSG_MOVE_FOCUS = 0;
+    /** Handler for set  Candidate */
+    private static final int MSG_SET_CANDIDATES = 1;
+    /** Handler for select Candidate */
+    private static final int MSG_SELECT_CANDIDATES = 2;
+
+    /** NUmber of Candidate display lines */
+    private static final int SETTING_NUMBER_OF_LINEMAX = 5;
 
     /** Body view of the candidates list */
-    private ViewGroup  mViewBody;
+    private ViewGroup  mViewBody = null;
+
+    /** The view of the Symbol Tab */
+    private TextView mViewTabSymbol;
+    /** The view of the Emoticon Tab */
+    private TextView mViewTabEmoticon;
     /** Scroller of {@code mViewBodyText} */
     private ScrollView mViewBodyScroll;
     /** Base of {@code mViewCandidateList1st}, {@code mViewCandidateList2nd} */
     private ViewGroup mViewCandidateBase;
     /** Button displayed bottom of the view when there are more candidates. */
     private ImageView mReadMoreButton;
-    /** The view of the scaling up candidate */
-    private View mViewScaleUp;
     /** Layout for the candidates list on normal view */
     private LinearLayout mViewCandidateList1st;
     /** Layout for the candidates list on full view */
     private AbsoluteLayout mViewCandidateList2nd;
+    /** View for symbol tab */
+    private LinearLayout mViewCandidateListTab;
     /** {@link OpenWnn} instance using this manager */
     private OpenWnn mWnn;
     /** View type (VIEW_TYPE_NORMAL or VIEW_TYPE_FULL or VIEW_TYPE_CLOSE) */
@@ -96,42 +122,53 @@
 
     /** Width of the view */
     private int mViewWidth;
-    /** Height of the view */
-    private int mViewHeight;
     /** Minimum width of a candidate (density support) */
     private int mCandidateMinimumWidth;
     /** Maximum width of a candidate (density support) */
     private int mCandidateMinimumHeight;
+    /** Minimum height of the category candidate view */
+    private int mCandidateCategoryMinimumHeight;
+    /** Left align threshold of the candidate view */
+    private int mCandidateLeftAlignThreshold;
+    /** Height of keyboard */
+    private int mKeyboardHeight;
+    /** Height of symbol keyboard */
+    private int mSymbolKeyboardHeight;
+    /** Height of symbol keyboard tab */
+    private int mSymbolKeyboardTabHeight;
+    /** Whether being able to use Emoticon */
+    private boolean mEnableEmoticon = false;
 
-    /** Whether hide the view if there is no candidates */
-    private boolean mAutoHideMode;
-    /** The converter to be get candidates from and notice the selected candidate to. */
+    /** Whether hide the view if there is no candidate */
+    private boolean mAutoHideMode = true;
+    /** The converter to get candidates from and notice the selected candidate to. */
     private WnnEngine mConverter;
     /** Limitation of displaying candidates */
     private int mDisplayLimit;
 
     /** Vibrator for touch vibration */
     private Vibrator mVibrator = null;
-    /** MediaPlayer for click sound */
-    private MediaPlayer mSound = null;
+    /** AudioManager for click sound */
+    private AudioManager mSound = null;
 
-    /** Number of candidates displaying */
-    private int mWordCount;
-    /** List of candidates */
-    private ArrayList<WnnWord> mWnnWordArray;
+    /** Number of candidates displaying for 1st */
+    private int mWordCount1st;
+    /** Number of candidates displaying for 2nd */
+    private int mWordCount2nd;
+    /** List of candidates for 1st */
+    private ArrayList<WnnWord> mWnnWordArray1st = new ArrayList<WnnWord>();
+    /** List of candidates for 2nd */
+    private ArrayList<WnnWord> mWnnWordArray2nd = new ArrayList<WnnWord>();
+    /** List of select candidates */
+    private LinkedList<WnnWord> mWnnWordSelectedList = new LinkedList<WnnWord>();
 
     /** Gesture detector */
     private GestureDetector mGestureDetector;
-    /** The word pressed */
-    private WnnWord mWord;
     /** Character width of the candidate area */
     private int mLineLength = 0;
     /** Number of lines displayed */
     private int mLineCount = 1;
 
-    /** {@code true} if the candidate delete state is selected */
-    private boolean mIsScaleUp = false;
-
     /** {@code true} if the full screen mode is selected */
     private boolean mIsFullView = false;
 
@@ -142,8 +179,6 @@
     private int mDisplayEndOffset = 0;
     /** {@code true} if there are more candidates to display. */
     private boolean mCanReadMore = false;
-    /** Width of {@code mReadMoreButton} */
-    private int mReadMoreButtonWidth = 0;
     /** Color of the candidates */
     private int mTextColor = 0;
     /** Template object for each candidate and normal/full view change button */
@@ -158,79 +193,150 @@
     private int mFullViewPrevLineTopId;
     /** Layout of the previous candidate (in full view) */
     private ViewGroup.LayoutParams mFullViewPrevParams;
-    /** Whether all candidates is displayed */
+    /** Whether all candidates are displayed */
     private boolean mCreateCandidateDone;
     /** Number of lines in normal view */
     private int mNormalViewWordCountOfLine;
-    /** general infomation about a display */
-    private final DisplayMetrics mMetrics = new DisplayMetrics();
 
-    /** Event listener for touching a candidate */
-    private OnTouchListener mCandidateOnTouch = new OnTouchListener() {
-            public boolean onTouch(View v, MotionEvent event) {
-                if (mMotionEvent != null) {
-                    return true;
-                }
+    /** List of textView for CandiData List 1st for Symbol mode */
+    private ArrayList<TextView> mTextViewArray1st = new ArrayList<TextView>();
+    /** List of textView for CandiData List 2st for Symbol mode */
+    private ArrayList<TextView> mTextViewArray2nd = new ArrayList<TextView>();
+    /** Now focus textView index */
+    private int mCurrentFocusIndex = FOCUS_NONE;
+    /** Focused View */
+    private View mFocusedView = null;
+    /** Focused View Background */
+    private Drawable mFocusedViewBackground = null;
+    /** Axis to find next TextView for Up/Down */
+    private int mFocusAxisX = 0;
+    /** Now focused TextView in mTextViewArray1st */
+    private boolean mHasFocusedArray1st = true;
 
-                if ((event.getAction() == MotionEvent.ACTION_UP)
-                    && (v instanceof TextView)) {
-                    Drawable d = v.getBackground();
-                    if (d != null) {
-                        d.setState(new int[] {});
+    /** Portrait Number of Lines from Preference */
+    private int mPortraitNumberOfLine = LINE_NUM_PORTRAIT;
+    /** Landscape Number of Lines from Preference */
+    private int mLandscapeNumberOfLine = LINE_NUM_LANDSCAPE;
+
+    /** Coordinates of line */
+    private int mLineY = 0;
+
+    /** {@code true} if the candidate is selected */
+    private boolean mIsSymbolSelected = false;
+
+    /** Whether candidates is symbol */
+    private boolean mIsSymbolMode = false;
+
+    /** Symbol mode */
+    private int mSymbolMode = OpenWnnJAJP.ENGINE_MODE_SYMBOL;
+
+    /** Text size of candidates */
+    private float mCandNormalTextSize;
+
+    /** Text size of category */
+    private float mCandCategoryTextSize;
+
+    /** HardKeyboard hidden({@code true}) or disp({@code false}) */
+    private boolean mHardKeyboardHidden = true;
+
+    /** Minimum height of the candidate 1line view */
+    private int mCandidateOneLineMinimumHeight;
+
+    /** Whether candidates long click enable */
+    private boolean mEnableCandidateLongClick = true;
+
+    /** Keyboard vertical gap value */
+    private static final float KEYBOARD_VERTICAL_GAP = 0.009f;
+
+    /** Keyboard vertical gap count */
+    private static final int KEYBOARD_VERTICAL_GAP_COUNT = 3;
+
+    /** {@code Handler} Handler for focus Candidate wait delay */
+    private Handler mHandler = new Handler() {
+            @Override public void handleMessage(Message msg) {
+                switch (msg.what) {
+                case MSG_MOVE_FOCUS:
+                    moveFocus(msg.arg1, msg.arg2 == 1);
+                    break;
+
+                case MSG_SET_CANDIDATES:
+                    if (mViewType == CandidatesViewManager.VIEW_TYPE_FULL && mIsSymbolMode) {
+                        displayCandidates(mConverter, false, SET_CANDIDATE_DELAY_LINE_COUNT);
                     }
-                }
+                    break;
 
-                mMotionEvent = event;
-                boolean ret = mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_TOUCH));
-                mMotionEvent = null;
-                return ret;
-            }
-        };
-    
-    
-    /** Event listener for clicking a candidate */
-    private OnClickListener mCandidateOnClick = new OnClickListener() {
-            public void onClick(View v) {
-                if (!v.isShown()) {
-                    return;
-                }
-                
-                if (v instanceof TextView) {
-                    TextView text = (TextView)v;
-                    int wordcount = text.getId();
+                case MSG_SELECT_CANDIDATES:
                     WnnWord word = null;
-                    word = mWnnWordArray.get(wordcount);
-                    selectCandidate(word);
-                }
-            }
-        };
-
-    /** Event listener for long-clicking a candidate */
-    private OnLongClickListener mCandidateOnLongClick = new OnLongClickListener() {
-            public boolean onLongClick(View v) {
-                if (mViewScaleUp == null) {
-                    return false;
-                }
-
-                if (!v.isShown()) {
-                    return true;
-                }
-
-                Drawable d = v.getBackground();
-                if (d != null) {
-                    if(d.getState().length == 0){
-                        return true;
+                    while ((word = mWnnWordSelectedList.poll()) != null) {
+                        selectCandidate(word);
                     }
+                    break;
+
+                default:
+                    break;
                 }
-            
-                int wordcount = ((TextView)v).getId();
-                mWord = mWnnWordArray.get(wordcount);
-                setViewScaleUp(true, mWord);
-            
-                return true;
             }
         };
 
+    /** Event listener for touching a candidate for 1st */
+    private OnClickListener mCandidateOnClick1st = new OnClickListener() {
+        public void onClick(View v) {
+            onClickCandidate(v, mWnnWordArray1st);
+        }
+    };
+
+    /** Event listener for touching a candidate for 2nd */
+    private OnClickListener mCandidateOnClick2nd = new OnClickListener() {
+        public void onClick(View v) {
+            onClickCandidate(v, mWnnWordArray2nd);
+        }
+    };
+
+    /** Event listener for long-clicking a candidate for 1st */
+    private OnLongClickListener mCandidateOnLongClick1st = new OnLongClickListener() {
+        public boolean onLongClick(View v) {
+            return onLongClickCandidate(v, mWnnWordArray1st);
+        }
+    };
+
+    /** Event listener for long-clicking a candidate for for 2nd */
+    private OnLongClickListener mCandidateOnLongClick2nd = new OnLongClickListener() {
+        public boolean onLongClick(View v) {
+            return onLongClickCandidate(v, mWnnWordArray2nd);
+        }
+    };
+
+    /** Event listener for click a symbol tab */
+    private OnClickListener mTabOnClick = new OnClickListener() {
+        public void onClick(View v) {
+            if (!v.isShown()) {
+                return;
+            }
+            playSoundAndVibration();
+
+            if (v instanceof TextView) {
+                TextView text = (TextView)v;
+                switch (text.getId()) {
+                case R.id.candview_symbol:
+                    if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL) {
+                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                                      OpenWnnJAJP.ENGINE_MODE_SYMBOL));
+                    }
+                    break;
+
+                case R.id.candview_emoticon:
+                    if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
+                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
+                                OpenWnnJAJP.ENGINE_MODE_SYMBOL));
+                    }
+                    break;
+
+                default:
+                    break;
+                }
+            }
+        }
+    };
 
     /**
      * Constructor
@@ -245,10 +351,69 @@
      * @param displayLimit      The limit of display
      */
     public TextCandidatesViewManager(int displayLimit) {
-        this.mDisplayLimit = displayLimit;
-        this.mWnnWordArray = new ArrayList<WnnWord>();
-        this.mAutoHideMode = true;
-        mMetrics.setToDefaults();
+        mDisplayLimit = displayLimit;
+    }
+
+    /**
+     * Handle a click event on the candidate.
+     * @param v  View
+     * @param list  List of candidates
+     */
+    private void onClickCandidate(View v, ArrayList<WnnWord> list) {
+        if (!v.isShown()) {
+            return;
+        }
+        playSoundAndVibration();
+
+        if (v instanceof TextView) {
+            TextView text = (TextView)v;
+            int wordcount = text.getId();
+            WnnWord word = list.get(wordcount);
+            
+            if (mHandler.hasMessages(MSG_SET_CANDIDATES)) {
+                mWnnWordSelectedList.add(word);
+                return;
+            }
+            clearFocusCandidate();
+            selectCandidate(word);
+        }
+    }
+
+    /**
+     * Handle a long click event on the candidate.
+     * @param v  View
+     * @param list  List of candidates
+     */
+    public boolean onLongClickCandidate(View v, ArrayList<WnnWord> list) {
+        if (mViewLongPressDialog == null) {
+            return false;
+        }
+
+        if (mIsSymbolMode) {
+            return false;
+        }
+
+        if (!mEnableCandidateLongClick) {
+            return false;
+        }
+
+        if (!v.isShown()) {
+            return true;
+        }
+
+        Drawable d = v.getBackground();
+        if (d != null) {
+            if(d.getState().length == 0){
+                return true;
+            }
+        }
+
+        int wordcount = ((TextView)v).getId();
+        mWord = list.get(wordcount);
+        clearFocusCandidate();
+        displayDialog(v, mWord);
+
+        return true;
     }
 
     /**
@@ -260,54 +425,75 @@
         mAutoHideMode = hide;
     }
 
-    /** @see CandidatesViewManager */
+    /** @see CandidatesViewManager#initView */
     public View initView(OpenWnn parent, int width, int height) {
         mWnn = parent;
         mViewWidth = width;
-        mViewHeight = height;
-        mCandidateMinimumWidth = (int)(CANDIDATE_MINIMUM_WIDTH * mMetrics.density);
-        mCandidateMinimumHeight = (int)(CANDIDATE_MINIMUM_HEIGHT * mMetrics.density);
-        mPortrait = 
-            (parent.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE);
-
         Resources r = mWnn.getResources();
+        mCandidateMinimumWidth = r.getDimensionPixelSize(R.dimen.cand_minimum_width);
+        mCandidateMinimumHeight = r.getDimensionPixelSize(R.dimen.cand_minimum_height);
+        if (OpenWnn.isXLarge()) {
+            mCandidateOneLineMinimumHeight = r.getDimensionPixelSize(R.dimen.candidate_layout_height);
+        }
+        mCandidateCategoryMinimumHeight = r.getDimensionPixelSize(R.dimen.cand_category_minimum_height);
+        mCandidateLeftAlignThreshold = r.getDimensionPixelSize(R.dimen.cand_left_align_threshold);
+        mKeyboardHeight = r.getDimensionPixelSize(R.dimen.keyboard_height);
+        if (OpenWnn.isXLarge()) {
+            mKeyboardHeight += Math.round(height * KEYBOARD_VERTICAL_GAP)
+                                * KEYBOARD_VERTICAL_GAP_COUNT;
+        }
+        mSymbolKeyboardHeight = r.getDimensionPixelSize(R.dimen.symbol_keyboard_height);
+        Drawable d = r.getDrawable(R.drawable.tab_no_select);
+        mSymbolKeyboardTabHeight = d.getMinimumHeight();
+
+        mPortrait =
+            (r.getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE);
+
+        mCandNormalTextSize = r.getDimensionPixelSize(R.dimen.cand_normal_text_size);
+        mCandCategoryTextSize = r.getDimensionPixelSize(R.dimen.cand_category_text_size);
 
         LayoutInflater inflater = parent.getLayoutInflater();
         mViewBody = (ViewGroup)inflater.inflate(R.layout.candidates, null);
 
+        mViewTabSymbol = (TextView)mViewBody.findViewById(R.id.candview_symbol);
+        mViewTabEmoticon = (TextView)mViewBody.findViewById(R.id.candview_emoticon);
+
         mViewBodyScroll = (ScrollView)mViewBody.findViewById(R.id.candview_scroll);
-        mViewBodyScroll.setOnTouchListener(mCandidateOnTouch);
 
         mViewCandidateBase = (ViewGroup)mViewBody.findViewById(R.id.candview_base);
 
+        setNumeberOfDisplayLines();
         createNormalCandidateView();
         mViewCandidateList2nd = (AbsoluteLayout)mViewBody.findViewById(R.id.candidates_2nd_view);
 
-        mReadMoreButtonWidth = r.getDrawable(R.drawable.cand_up).getMinimumWidth();
-
         mTextColor = r.getColor(R.color.candidate_text);
-        
-        mReadMoreButton = (ImageView)mViewBody.findViewById(R.id.read_more_text);
+
+        mReadMoreButton = (ImageView)mViewBody.findViewById(R.id.read_more_button);
         mReadMoreButton.setOnTouchListener(new View.OnTouchListener() {
                 public boolean onTouch(View v, MotionEvent event) {
+                    int resid = 0;
                     switch (event.getAction()) {
                     case MotionEvent.ACTION_DOWN:
                         if (mIsFullView) {
-                            mReadMoreButton.setImageResource(R.drawable.cand_down_press);
+                            resid = R.drawable.cand_up_press;
                         } else {
-                            mReadMoreButton.setImageResource(R.drawable.cand_up_press);
+                            resid = R.drawable.cand_down_press;
                         }
-                	    break;
+                        break;
                     case MotionEvent.ACTION_UP:
                         if (mIsFullView) {
-                            mReadMoreButton.setImageResource(R.drawable.cand_down);
+                            resid = R.drawable.cand_up;
                         } else {
-                            mReadMoreButton.setImageResource(R.drawable.cand_up);
+                            resid = R.drawable.cand_down;
                         }
                         break;
                     default:
                         break;
                     }
+
+                    if (resid != 0) {
+                        mReadMoreButton.setImageResource(resid);
+                    }
                     return false;
                 }
             });
@@ -316,6 +502,7 @@
                     if (!v.isShown()) {
                         return;
                     }
+                    playSoundAndVibration();
 
                     if (mIsFullView) {
                         mIsFullView = false;
@@ -331,23 +518,27 @@
 
         mGestureDetector = new GestureDetector(this);
 
-        View scaleUp = (View)inflater.inflate(R.layout.candidate_scale_up, null);
-        mViewScaleUp = scaleUp;
+        mViewLongPressDialog = (View)inflater.inflate(R.layout.candidate_longpress_dialog, null);
 
         /* select button */
-        Button b = (Button)scaleUp.findViewById(R.id.candidate_select);
-        b.setOnClickListener(new View.OnClickListener() {
+        Button longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_select);
+        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
+                    playSoundAndVibration();
+                    clearFocusCandidate();
                     selectCandidate(mWord);
+                    closeDialog();
                 }
             });
 
         /* cancel button */
-        b = (Button)scaleUp.findViewById(R.id.candidate_cancel);
-        b.setOnClickListener(new View.OnClickListener() {
+        longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_cancel);
+        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
-                    setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
+                    playSoundAndVibration();
+                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
                     mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.UPDATE_CANDIDATE));
+                    closeDialog();
                 }
             });
 
@@ -359,15 +550,20 @@
      */
     private void createNormalCandidateView() {
         mViewCandidateList1st = (LinearLayout)mViewBody.findViewById(R.id.candidates_1st_view);
-        mViewCandidateList1st.setOnTouchListener(mCandidateOnTouch);
-        mViewCandidateList1st.setOnClickListener(mCandidateOnClick);
+        mViewCandidateList1st.setOnClickListener(mCandidateOnClick1st);
 
-        int line = getMaxLine();
+        mViewCandidateListTab = (LinearLayout)mViewBody.findViewById(R.id.candview_tab);
+        TextView tSymbol = mViewTabSymbol;
+        tSymbol.setOnClickListener(mTabOnClick);
+        TextView tEmoticon = mViewTabEmoticon;
+        tEmoticon.setOnClickListener(mTabOnClick);
+
+        int line = SETTING_NUMBER_OF_LINEMAX;
         int width = mViewWidth;
         for (int i = 0; i < line; i++) {
             LinearLayout lineView = new LinearLayout(mViewBodyScroll.getContext());
             lineView.setOrientation(LinearLayout.HORIZONTAL);
-            LinearLayout.LayoutParams layoutParams = 
+            LinearLayout.LayoutParams layoutParams =
                 new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                               ViewGroup.LayoutParams.WRAP_CONTENT);
             lineView.setLayoutParams(layoutParams);
@@ -402,7 +598,7 @@
 
         if (readMore) {
             displayCandidates(this.mConverter, false, -1);
-        } else { 
+        } else {
             if (type == CandidatesViewManager.VIEW_TYPE_NORMAL) {
                 mIsFullView = false;
                 if (mDisplayEndOffset > 0) {
@@ -426,27 +622,51 @@
      * @return          {@code true} if display is updated; {@code false} if otherwise
      */
     private boolean setViewLayout(int type) {
+        
+        ViewGroup.LayoutParams params;
+        int line = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
+
+        if ((mViewType == CandidatesViewManager.VIEW_TYPE_FULL)
+                && (type == CandidatesViewManager.VIEW_TYPE_NORMAL)) {
+            clearFocusCandidate();
+        }
+
         mViewType = type;
-        setViewScaleUp(false, null);
 
         switch (type) {
         case CandidatesViewManager.VIEW_TYPE_CLOSE:
+            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+                                                   getCandidateMinimumHeight() * line);
+            mViewBodyScroll.setLayoutParams(params);
+            mViewCandidateListTab.setVisibility(View.GONE);
             mViewCandidateBase.setMinimumHeight(-1);
+            mHandler.removeMessages(MSG_SET_CANDIDATES);
             return false;
 
         case CandidatesViewManager.VIEW_TYPE_NORMAL:
+            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+                                                   getCandidateMinimumHeight() * line);
+            mViewBodyScroll.setLayoutParams(params);
             mViewBodyScroll.scrollTo(0, 0);
+            mViewCandidateListTab.setVisibility(View.GONE);
             mViewCandidateList1st.setVisibility(View.VISIBLE);
             mViewCandidateList2nd.setVisibility(View.GONE);
             mViewCandidateBase.setMinimumHeight(-1);
-            int line = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
-            mViewCandidateList1st.setMinimumHeight(getCandidateMinimumHeight() * line);
             return false;
 
         case CandidatesViewManager.VIEW_TYPE_FULL:
         default:
+            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+                                                   getCandidateViewHeight());
+            mViewBodyScroll.setLayoutParams(params);
+            if (mIsSymbolMode) {
+                updateSymbolType();
+                mViewCandidateListTab.setVisibility(View.VISIBLE);
+            } else {
+                mViewCandidateListTab.setVisibility(View.GONE);
+            }
             mViewCandidateList2nd.setVisibility(View.VISIBLE);
-            mViewCandidateBase.setMinimumHeight(mViewHeight);
+            mViewCandidateBase.setMinimumHeight(-1);
             return true;
         }
     }
@@ -459,39 +679,94 @@
     /** @see CandidatesViewManager#displayCandidates */
     public void displayCandidates(WnnEngine converter) {
 
+        mHandler.removeMessages(MSG_SET_CANDIDATES);
+
+        if (mIsSymbolSelected) {
+            mIsSymbolSelected = false;
+            if (mSymbolMode == OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
+                return;
+            }
+
+            int prevLineCount = mLineCount;
+            int prevWordCount1st = mWordCount1st;
+            clearNormalViewCandidate();
+            mWordCount1st = 0;
+            mLineCount = 1;
+            mLineLength = 0;
+            mNormalViewWordCountOfLine = 0;
+            mWnnWordArray1st.clear();
+            mTextViewArray1st.clear();
+            if (((prevWordCount1st == 0) && (mWordCount1st == 1)) ||
+                (prevLineCount < mLineCount)) {
+                mViewBodyScroll.scrollTo(0, mViewBodyScroll.getScrollY() + getCandidateMinimumHeight());
+            }
+            if (isFocusCandidate() && mHasFocusedArray1st) {
+                mCurrentFocusIndex = 0;
+                Message m = mHandler.obtainMessage(MSG_MOVE_FOCUS, 0, 0);
+                mHandler.sendMessage(m);
+            }
+            return;
+        }
+
         mCanReadMore = false;
         mDisplayEndOffset = 0;
         mIsFullView = false;
         mFullViewWordCount = 0;
         mFullViewOccupyCount = 0;
         mFullViewPrevLineTopId = 0;
+        mFullViewPrevView = null;
         mCreateCandidateDone = false;
         mNormalViewWordCountOfLine = 0;
 
         clearCandidates();
         mConverter = converter;
-        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
-        
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
+
         mViewCandidateTemplate.setVisibility(View.VISIBLE);
         mViewCandidateTemplate.setBackgroundResource(R.drawable.cand_back);
 
         displayCandidates(converter, true, getMaxLine());
+
+        if (mIsSymbolMode) {
+            mIsFullView = true;
+            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
+        }
     }
 
     /** @see CandidatesViewManager#getMaxLine */
     private int getMaxLine() {
-        int maxLine = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
+        int maxLine = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
         return maxLine;
     }
 
     /**
+     * Get categories text.
+     * @param String Source string replacement
+     * @return String Categories text
+     */
+    private String getCategoriesText(String categoriesString) {
+        String ret = null;
+
+        Resources r = mWnn.getResources();
+        if(categoriesString.equals(r.getString(R.string.half_symbol_categories_txt))) {
+            ret = r.getString(R.string.half_symbol_txt);
+        } else if (categoriesString.equals(r.getString(R.string.full_symbol_categories_txt))) {
+            ret = r.getString(R.string.full_symbol_txt);
+        } else {
+            ret = new String("");
+        }
+
+        return ret;
+    }
+
+    /**
      * Display the candidates.
      * 
      * @param converter  {@link WnnEngine} which holds candidates.
      * @param dispFirst  Whether it is the first time displaying the candidates
      * @param maxLine    The maximum number of displaying lines
      */
-    synchronized private void displayCandidates(WnnEngine converter, boolean dispFirst, int maxLine) {
+    private void displayCandidates(WnnEngine converter, boolean dispFirst, int maxLine) {
         if (converter == null) {
             return;
         }
@@ -499,21 +774,69 @@
         /* Concatenate the candidates already got and the last one in dispFirst mode */
         int displayLimit = mDisplayLimit;
 
-        boolean isHistorySequence = false;
+        boolean isDelay = false;
         boolean isBreak = false;
 
+        if (converter instanceof SymbolList) {
+            if (!dispFirst) {
+                if (maxLine == -1) {
+                    isDelay = true;
+                    maxLine = mLineCount + SET_CANDIDATE_FIRST_LINE_COUNT;
+
+                    mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, SET_CANDIDATE_DELAY);
+
+                } else if (maxLine == SET_CANDIDATE_DELAY_LINE_COUNT) {
+                    isDelay = true;
+                    maxLine = mLineCount + SET_CANDIDATE_DELAY_LINE_COUNT;
+
+                    mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, SET_CANDIDATE_DELAY);
+                }
+            }
+            if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
+                displayLimit = -1;
+            }
+        }
+
         /* Get candidates */
         WnnWord result = null;
-        while ((displayLimit == -1 || mWordCount < displayLimit)) {
-            result = converter.getNextCandidate();
+        String prevCandidate = null;
+        while ((displayLimit == -1 || getWordCount() < displayLimit)) {
+            for (int i = 0; i < DISPLAY_LINE_MAX_COUNT; i++) {
+                result = converter.getNextCandidate();
+                if (result == null) {
+                    break;
+                }
+
+                if (converter instanceof SymbolList) {
+                    break;
+                }
+
+                if ((prevCandidate == null) || !prevCandidate.equals(result.candidate)) {
+                    break;
+                }
+            }
 
             if (result == null) {
                 break;
+            } else {
+                prevCandidate = result.candidate;
+            }
+
+            if (converter instanceof SymbolList) {
+                if (isCategory(result)) {
+                    if (getWordCount() != 0) {
+                        createNextLine(false);
+                    }
+                    result.candidate = getCategoriesText(result.candidate);
+                    setCandidate(true, result);
+                    createNextLine(true);
+                    continue;
+                }
             }
 
             setCandidate(false, result);
 
-            if (dispFirst && (maxLine < mLineCount)) {
+            if ((dispFirst || isDelay) && (maxLine < mLineCount)) {
                 mCanReadMore = true;
                 isBreak = true;
                 break;
@@ -522,11 +845,13 @@
 
         if (!isBreak && !mCreateCandidateDone) {
             /* align left if necessary */
-            createNextLine();
+            createNextLine(false);
             mCreateCandidateDone = true;
+            mHandler.removeMessages(MSG_SET_CANDIDATES);
+            mHandler.sendMessage(mHandler.obtainMessage(MSG_SELECT_CANDIDATES));
         }
-        
-        if (mWordCount < 1) { /* no candidates */
+
+        if (getWordCount() < 1) { /* no candidates */
             if (mAutoHideMode) {
                 mWnn.setCandidatesViewShown(false);
                 return;
@@ -555,31 +880,51 @@
         TextView template = mViewCandidateTemplate;
         textLength += template.getPaddingLeft() + template.getPaddingRight();
         int maxWidth = mViewWidth;
-
+        boolean isEmojiSymbol = false;
+        if (mIsSymbolMode && (word.candidate.length() < 3)) {
+            isEmojiSymbol = true;
+        }
         TextView textView;
-        if (mIsFullView || getMaxLine() < mLineCount) {
+
+        boolean is2nd = isFirstListOver(mIsFullView, mLineCount, word);
+        if (is2nd) {
             /* Full view */
-            int indentWidth = mViewWidth / FULL_VIEW_DIV;
-            int occupyCount = Math.min((textLength + indentWidth) / indentWidth, FULL_VIEW_DIV);
+            int viewDivison = getCandidateViewDivison();
+            int indentWidth = mViewWidth / viewDivison;
+            int occupyCount = Math.min((textLength + indentWidth + getCandidateSpaceWidth(isEmojiSymbol)) / indentWidth, viewDivison);
             if (isCategory) {
-                occupyCount = FULL_VIEW_DIV;
+                occupyCount = viewDivison;
             }
 
-            if (FULL_VIEW_DIV < (mFullViewOccupyCount + occupyCount)) {
-                if (FULL_VIEW_DIV != mFullViewOccupyCount) {
-                    mFullViewPrevParams.width += (FULL_VIEW_DIV - mFullViewOccupyCount) * indentWidth;
-                    mViewCandidateList2nd.updateViewLayout(mFullViewPrevView, mFullViewPrevParams);
+            if (viewDivison < (mFullViewOccupyCount + occupyCount)) {
+                if (viewDivison != mFullViewOccupyCount) {
+                    mFullViewPrevParams.width += (viewDivison - mFullViewOccupyCount) * indentWidth;
+                    if (mFullViewPrevView != null) {
+                        mViewCandidateList2nd.updateViewLayout(mFullViewPrevView, mFullViewPrevParams);
+                    }
                 }
                 mFullViewOccupyCount = 0;
-                mFullViewPrevLineTopId = mFullViewPrevView.getId();
+                if (mFullViewPrevView != null) {
+                    mFullViewPrevLineTopId = mFullViewPrevView.getId();
+                }
                 mLineCount++;
+                if (isCategory) {
+                    mLineY += mCandidateCategoryMinimumHeight;
+                } else {
+                    mLineY += getCandidateMinimumHeight();
+                }
+            }
+            if (mFullViewWordCount == 0) {
+                mLineY = 0;
             }
 
             ViewGroup layout = mViewCandidateList2nd;
 
             int width = indentWidth * occupyCount;
             int height = getCandidateMinimumHeight();
-
+            if (isCategory) {
+                height = mCandidateCategoryMinimumHeight;
+            }
 
             ViewGroup.LayoutParams params = buildLayoutParams(mViewCandidateList2nd, width, height);
 
@@ -599,24 +944,32 @@
             mFullViewPrevParams = params;
 
         } else {
-            textLength = Math.max(textLength, getCandidateMinimumWidth());
+            int viewDivison = getCandidateViewDivison();
+            int indentWidth = mViewWidth / viewDivison;
+            textLength = Math.max(textLength, indentWidth);
 
             /* Normal view */
             int nextEnd = mLineLength + textLength;
-            if (mLineCount == 1) {
+            nextEnd += getCandidateSpaceWidth(isEmojiSymbol);
+
+            if (mLineCount == 1 && !mIsSymbolMode) {
                 maxWidth -= getCandidateMinimumWidth();
             }
 
-            if ((maxWidth < nextEnd) && (mWordCount != 0)) {
-                createNextLine();
+            if ((maxWidth < nextEnd) && (getWordCount() != 0)) {
+
+                createNextLineFor1st();
                 if (getMaxLine() < mLineCount) {
                     mLineLength = 0;
                     /* Call this method again to add the candidate in the full view */
-                    setCandidate(isCategory, word);
+                    if (!mIsSymbolSelected) {
+                        setCandidate(isCategory, word);
+                    }
                     return;
                 }
                 
                 mLineLength = textLength;
+                mLineLength += getCandidateSpaceWidth(isEmojiSymbol);
             } else {
                 mLineLength = nextEnd;
             }
@@ -628,28 +981,55 @@
                 if (mLineCount == 1) {
                     mViewCandidateTemplate.setBackgroundDrawable(null);
                 }
-                mLineLength += CANDIDATE_LEFT_ALIGN_THRESHOLD;
+                mLineLength += mCandidateLeftAlignThreshold;
+            } else {
+                int CompareLength = textLength;
+                CompareLength += getCandidateSpaceWidth(isEmojiSymbol);
             }
 
             mNormalViewWordCountOfLine++;
         }
 
         textView.setText(word.candidate);
-        textView.setTextColor(mTextColor);
-        textView.setId(mWordCount);
+        if (is2nd) {
+            textView.setId(mWordCount2nd);
+        } else {
+            textView.setId(mWordCount1st);
+        }
         textView.setVisibility(View.VISIBLE);
         textView.setPressed(false);
+        textView.setFocusable(false);
 
         if (isCategory) {
+            textView.setText("      " + word.candidate);
+
+            textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandCategoryTextSize);
+            textView.setBackgroundDrawable(null);
+            textView.setGravity(Gravity.CENTER_VERTICAL);
+            textView.setMinHeight(mCandidateCategoryMinimumHeight);
+            textView.setHeight(mCandidateCategoryMinimumHeight);
+
             textView.setOnClickListener(null);
             textView.setOnLongClickListener(null);
-            textView.setBackgroundDrawable(null);
+            textView.setTextColor(mTextColor);
         } else {
-            textView.setOnClickListener(mCandidateOnClick);
-            textView.setOnLongClickListener(mCandidateOnLongClick);
+            textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandNormalTextSize);
+            textView.setGravity(Gravity.CENTER);
+            textView.setMinHeight(getCandidateMinimumHeight());
+            textView.setHeight(getCandidateMinimumHeight());
+
+            if (is2nd) {
+                textView.setOnClickListener(mCandidateOnClick2nd);
+                textView.setOnLongClickListener(mCandidateOnLongClick2nd);
+            } else {
+                textView.setOnClickListener(mCandidateOnClick1st);
+                textView.setOnLongClickListener(mCandidateOnLongClick1st);
+            }
+
             textView.setBackgroundResource(R.drawable.cand_back);
+ 
+            textView.setTextColor(mTextColor);
         }
-        textView.setOnTouchListener(mCandidateOnTouch);
 
         if (maxWidth < textLength) {
             textView.setEllipsize(TextUtils.TruncateAt.END);
@@ -668,54 +1048,59 @@
 
         if (span != null) {
             SpannableString spannable = new SpannableString("   ");
-            spannable.setSpan(span, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
+            spannable.setSpan(span, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             textView.setText(spannable);
         }
+        textView.setPadding(0, 0, 0, 0);
 
-        mWnnWordArray.add(mWordCount, word);
-        mWordCount++;
+        if (is2nd) {
+            mWnnWordArray2nd.add(mWordCount2nd, word);
+            mWordCount2nd++;
+            mTextViewArray2nd.add(textView);
+        } else {
+            mWnnWordArray1st.add(mWordCount1st, word);
+            mWordCount1st++;
+            mTextViewArray1st.add(textView);
+        }
     }
 
     /**
      * Create AbsoluteLayout.LayoutParams
      * @param layout AbsoluteLayout
-     * @param width
-     * @param height
-     * @return ViewGroup.LayoutParams
+     * @param width  The width of the display
+     * @param height The height of the display
+     * @return Layout parameter
      */
     private ViewGroup.LayoutParams buildLayoutParams(AbsoluteLayout layout, int width, int height) {
 
-        int indentWidth = mViewWidth / FULL_VIEW_DIV;
+        int viewDivison = getCandidateViewDivison();
+        int indentWidth = mViewWidth / viewDivison;
         int x         = indentWidth * mFullViewOccupyCount;
-        int nomalLine = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
-        int y         = getCandidateMinimumHeight() * (mLineCount - nomalLine - 1);
+        int y         = mLineY;
         ViewGroup.LayoutParams params
               = new AbsoluteLayout.LayoutParams(width, height, x, y);
 
         return params;
     }
 
-
-
-            
-
-
     /**
      * Create a view for a candidate.
      * @return the view
      */
     private TextView createCandidateView() {
-        TextView text = new TextView(mViewBodyScroll.getContext());
-        text.setTextSize(20);
+        TextView text = new CandidateTextView(mViewBodyScroll.getContext());
+        text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandNormalTextSize);
         text.setBackgroundResource(R.drawable.cand_back);
+        text.setCompoundDrawablePadding(0);
         text.setGravity(Gravity.CENTER);
         text.setSingleLine();
-        text.setPadding(4, 4, 4, 4);
+        text.setPadding(0, 0, 0, 0);
         text.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                                            ViewGroup.LayoutParams.WRAP_CONTENT,
                                                            1.0f));
         text.setMinHeight(getCandidateMinimumHeight());
         text.setMinimumWidth(getCandidateMinimumWidth());
+        text.setSoundEffectsEnabled(false);
         return text;
     }
 
@@ -723,24 +1108,30 @@
      * Display {@code mReadMoreText} if there are more candidates.
      */
     private void setReadMore() {
-        if (mIsScaleUp) {
+        if (mIsSymbolMode) {
             mReadMoreButton.setVisibility(View.GONE);
             mViewCandidateTemplate.setVisibility(View.GONE);
             return;
         }
 
+        int resid = 0;
+
         if (mIsFullView) {
             mReadMoreButton.setVisibility(View.VISIBLE);
-            mReadMoreButton.setImageResource(R.drawable.cand_down);
+            resid = R.drawable.cand_up;
         } else {
             if (mCanReadMore) {
                 mReadMoreButton.setVisibility(View.VISIBLE);
-                mReadMoreButton.setImageResource(R.drawable.cand_up);
+                resid = R.drawable.cand_down;
             } else {
                 mReadMoreButton.setVisibility(View.GONE);
                 mViewCandidateTemplate.setVisibility(View.GONE);
             }
         }
+
+        if (resid != 0) {
+            mReadMoreButton.setImageResource(resid);
+        }
     }
 
     /**
@@ -759,9 +1150,11 @@
             }
         }
     }
-        
+
     /** @see CandidatesViewManager#clearCandidates */
     public void clearCandidates() {
+        closeDialog();
+        clearFocusCandidate();
         clearNormalViewCandidate();
 
         ViewGroup layout = mViewCandidateList2nd;
@@ -770,15 +1163,20 @@
             View v = layout.getChildAt(i);
             v.setVisibility(View.GONE);
         }
-    
-        mLineCount = 1;
-        mWordCount = 0;
-        mWnnWordArray.clear();
 
+        mLineCount = 1;
+        mWordCount1st = 0;
+        mWordCount2nd = 0;
+        mWnnWordArray1st.clear();
+        mWnnWordArray2nd.clear();
+        mTextViewArray1st.clear();
+        mTextViewArray2nd.clear();
         mLineLength = 0;
 
+        mLineY = 0;
+
         mIsFullView = false;
-        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
         if (mAutoHideMode) {
             setViewLayout(CandidatesViewManager.VIEW_TYPE_CLOSE);
         }
@@ -799,18 +1197,83 @@
                 mVibrator = null;
             }
             if (pref.getBoolean("key_sound", false)) {
-                mSound = MediaPlayer.create(mWnn, R.raw.type);
+                mSound = (AudioManager)mWnn.getSystemService(Context.AUDIO_SERVICE);
             } else {
                 mSound = null;
             }
+            setNumeberOfDisplayLines();
         } catch (Exception ex) {
-            Log.d("iwnn", "NO VIBRATOR");
+            Log.e("OpenWnn", "NO VIBRATOR");
         }
     }
     
     /**
-     * Process {@code OpenWnnEvent.CANDIDATE_VIEW_TOUCH} event.
-     * 
+     * Set normal mode.
+     */
+    public void setNormalMode() {
+        setReadMore();
+        mIsFullView = false;
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
+    }
+
+    /**
+     * Set full mode.
+     */
+    public void setFullMode() {
+        mIsFullView = true;
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
+    }
+
+    /**
+     * Set symbol mode.
+     */
+    public void setSymbolMode(boolean enable, int mode) {
+        if (mIsSymbolMode && !enable) {
+            setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE);
+        }
+        mSymbolMode = mode;
+        mIsSymbolMode = enable;
+    }
+
+    /**
+     * Set scroll up.
+     */
+    public void setScrollUp() {
+        if (!mViewBodyScroll.pageScroll(ScrollView.FOCUS_UP)) {
+            mViewBodyScroll.scrollTo(0, mViewBodyScroll.getChildAt(0).getHeight());
+        }
+    }
+
+    /**
+     * Set scroll down.
+     */
+    public void setScrollDown() {
+        if (!mViewBodyScroll.pageScroll(ScrollView.FOCUS_DOWN)) {
+            mViewBodyScroll.scrollTo(0, 0);
+        }
+    }
+
+    /**
+     * Set scroll full up.
+     */
+    public void setScrollFullUp() {
+        if (!mViewBodyScroll.fullScroll(ScrollView.FOCUS_UP)) {
+            mViewBodyScroll.scrollTo(0, mViewBodyScroll.getChildAt(0).getHeight());
+        }
+    }
+
+    /**
+     * Set scroll full down.
+     */
+    public void setScrollFullDown() {
+        if (!mViewBodyScroll.fullScroll(ScrollView.FOCUS_DOWN)) {
+            mViewBodyScroll.scrollTo(0, 0);
+        }
+    }
+
+    /**
+     * Process {@link OpenWnnEvent#CANDIDATE_VIEW_TOUCH} event.
+     *
      * @return      {@code true} if event is processed; {@code false} if otherwise
      */
     public boolean onTouchSync() {
@@ -825,14 +1288,29 @@
      * @param word  The selected word
      */
     private void selectCandidate(WnnWord word) {
-        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
+        if (!mIsSymbolMode) {
+            mIsFullView = false;
+            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
+        }
+        mIsSymbolSelected = mIsSymbolMode;
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.SELECT_CANDIDATE, word));
+    }
+
+    private void playSoundAndVibration() {
         if (mVibrator != null) {
-            try { mVibrator.vibrate(30); } catch (Exception ex) { }
+            try {
+                mVibrator.vibrate(5);
+            } catch (Exception ex) {
+                Log.e("OpenWnn", "TextCandidatesViewManager::selectCandidate Vibrator " + ex.toString());
+            }
         }
         if (mSound != null) {
-            try { mSound.seekTo(0); mSound.start(); } catch (Exception ex) { }
+            try {
+                mSound.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, -1);
+            } catch (Exception ex) {
+                Log.e("OpenWnn", "TextCandidatesViewManager::selectCandidate Sound " + ex.toString());
+            }
         }
-        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.SELECT_CANDIDATE, word));
     }
 
     /** @see android.view.GestureDetector.OnGestureListener#onDown */
@@ -842,15 +1320,15 @@
 
     /** @see android.view.GestureDetector.OnGestureListener#onFling */
     public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
-        if (mIsScaleUp) {
-            return false;
-        }
-
         boolean consumed = false;
         if (arg1 != null && arg0 != null && arg1.getY() < arg0.getY()) {
             if ((mViewType == CandidatesViewManager.VIEW_TYPE_NORMAL) && mCanReadMore) {
                 if (mVibrator != null) {
-                    try { mVibrator.vibrate(30); } catch (Exception ex) { }
+                    try {
+                        mVibrator.vibrate(5);
+                    } catch (Exception ex) {
+                        Log.e("iwnn", "TextCandidatesViewManager::onFling Vibrator " + ex.toString());
+                    }
                 }
                 mIsFullView = true;
                 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
@@ -859,7 +1337,11 @@
         } else {
             if (mViewBodyScroll.getScrollY() == 0) {
                 if (mVibrator != null) {
-                    try { mVibrator.vibrate(30); } catch (Exception ex) { }
+                    try {
+                        mVibrator.vibrate(5);
+                    } catch (Exception ex) {
+                        Log.e("iwnn", "TextCandidatesViewManager::onFling Sound " + ex.toString());
+                    }
                 }
                 mIsFullView = false;
                 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
@@ -907,77 +1389,73 @@
     }
 
     /**
-     * Switch list/enlarge view mode.
-     * @param up  {@code true}:enlarge, {@code false}:list
-     * @param word  The candidate word to be enlarged.
+     * Create a layout for the next line.
      */
-    private void setViewScaleUp(boolean up, WnnWord word) {
-        if (up == mIsScaleUp || (mViewScaleUp == null)) {
-            return;
-        }
-
-        if (up) {
-            setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
-            mViewCandidateList1st.setVisibility(View.GONE);
-            mViewCandidateBase.setMinimumHeight(-1);
-            mViewCandidateBase.addView(mViewScaleUp);
-            TextView text = (TextView)mViewScaleUp.findViewById(R.id.candidate_scale_up_text);
-            text.setText(word.candidate);
-            if (!mPortrait) {
-                Resources r = mViewBodyScroll.getContext().getResources();
-                text.setTextSize(r.getDimensionPixelSize(R.dimen.candidate_delete_word_size_landscape));
+    private void createNextLine(boolean isCategory) {
+        if (isFirstListOver(mIsFullView, mLineCount, null)) {
+            /* Full view */
+            mFullViewOccupyCount = 0;
+            if (mFullViewPrevView != null) {
+                mFullViewPrevLineTopId = mFullViewPrevView.getId();
             }
-
-            mIsScaleUp = true;
-            setReadMore();
+            if (isCategory) {
+                mLineY += mCandidateCategoryMinimumHeight;
+            } else {
+                mLineY += getCandidateMinimumHeight();
+            }
+            mLineCount++;
         } else {
-            mIsScaleUp = false;
-            mViewCandidateBase.removeView(mViewScaleUp);
+            createNextLineFor1st();
         }
     }
 
     /**
      * Create a layout for the next line.
      */
-    private void createNextLine() {
-        int lineCount = mLineCount;
-        if (mIsFullView || getMaxLine() < lineCount) {
-            /* Full view */
-            mFullViewOccupyCount = 0;
-            mFullViewPrevLineTopId = mFullViewPrevView.getId();
+    private void createNextLineFor1st() {
+        LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(mLineCount - 1);
+        float weight = 0;
+        if (mLineLength < mCandidateLeftAlignThreshold) {
+            if (mLineCount == 1) {
+                mViewCandidateTemplate.setVisibility(View.GONE);
+            }
         } else {
-            /* Normal view */
-            LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(lineCount - 1);
-            float weight = 0;
-            if (mLineLength < CANDIDATE_LEFT_ALIGN_THRESHOLD) {
-                if (lineCount == 1) {
-                    mViewCandidateTemplate.setVisibility(View.GONE);
-                }
-            } else {
-                weight = 1.0f;
-            }
-
-            LinearLayout.LayoutParams params
-                = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
-                                                ViewGroup.LayoutParams.WRAP_CONTENT,
-                                                weight);
-            
-            int child = lineView.getChildCount();
-            for (int i = 0; i < child; i++) {
-                View view = lineView.getChildAt(i);
-
-                if (view != mViewCandidateTemplate) {
-                    view.setLayoutParams(params);
-                }
-            }
-
-            mLineLength = 0;
-            mNormalViewWordCountOfLine = 0;
+            weight = 1.0f;
         }
+
+        LinearLayout.LayoutParams params
+            = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+                                            ViewGroup.LayoutParams.WRAP_CONTENT,
+                                            weight);
+
+        int child = lineView.getChildCount();
+        for (int i = 0; i < child; i++) {
+            View view = lineView.getChildAt(i);
+
+            if (view != mViewCandidateTemplate) {
+                view.setLayoutParams(params);
+                view.setPadding(0, 0, 0, 0);
+            }
+        }
+
+        mLineLength = 0;
+        mNormalViewWordCountOfLine = 0;
         mLineCount++;
     }
 
     /**
+     * Judge if it's a category.
+     *
+     * @return {@code true} if category
+     */
+    boolean isCategory(WnnWord word) {
+        int length = word.candidate.length();
+        return ((length > 3) && (word.candidate.charAt(0) == '['));
+    }
+
+    /**
+     * Get a minimum width of a candidate view.
+     *
      * @return the minimum width of a candidate view.
      */
     private int getCandidateMinimumWidth() {
@@ -990,4 +1468,444 @@
     private int getCandidateMinimumHeight() {
         return mCandidateMinimumHeight;
     }
+
+    /**
+     * Get a height of a candidate view.
+     *
+     * @return the height of a candidate view.
+     */
+    private int getCandidateViewHeight() {
+        if (OpenWnn.isXLarge()) {
+           return mKeyboardHeight + mCandidateOneLineMinimumHeight - mSymbolKeyboardHeight
+                         - mSymbolKeyboardTabHeight;
+        } else {
+            int numberOfLine = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
+            Resources resource = mWnn.getResources();
+            Drawable keyboardBackground = resource.getDrawable(R.drawable.keyboard_background);
+            Rect keyboardPadding = new Rect(0 ,0 ,0 ,0);
+            keyboardBackground.getPadding(keyboardPadding);
+            int keyboardTotalPadding = keyboardPadding.top + keyboardPadding.bottom;
+            if (mIsSymbolMode) {
+                return mKeyboardHeight + numberOfLine * getCandidateMinimumHeight()
+                       - mSymbolKeyboardHeight - mSymbolKeyboardTabHeight;
+            } else if (!mHardKeyboardHidden) {
+                return mKeyboardHeight + numberOfLine * getCandidateMinimumHeight()
+                       - mSymbolKeyboardHeight;
+            } else {
+                return mKeyboardHeight + keyboardTotalPadding
+                       + numberOfLine * getCandidateMinimumHeight();
+            }
+        }
+    }
+
+    /**
+     * Update symbol type.
+     */
+    private void updateSymbolType() {
+        switch (mSymbolMode) {
+        case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
+            updateTabStatus(mViewTabSymbol, true, true);
+            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, false);
+            break;
+
+        case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
+            updateTabStatus(mViewTabSymbol, true, false);
+            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, true);
+            break;
+
+        default:
+            updateTabStatus(mViewTabSymbol, true, false);
+            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, false);
+            break;
+        }
+    }
+
+    /**
+     * Update tab status.
+     *
+     * @param tab           The tab view.
+     * @param enabled       The tab is enabled.
+     * @param selected      The tab is selected.
+     */
+    private void updateTabStatus(TextView tab, boolean enabled, boolean selected) {
+        tab.setVisibility(View.VISIBLE);
+        tab.setEnabled(enabled);
+        int backgroundId = 0;
+        int colorId = 0;
+        if (enabled) {
+            if (selected) {
+                backgroundId = R.drawable.cand_tab;
+                colorId = R.color.tab_textcolor_select;
+            } else {
+                backgroundId = R.drawable.cand_tab_noselect;
+                colorId = R.color.tab_textcolor_no_select;
+            }
+        } else {
+            backgroundId = R.drawable.cand_tab_noselect;
+            colorId = R.color.tab_textcolor_disable;
+        }
+        tab.setBackgroundResource(backgroundId);
+        tab.setTextColor(mWnn.getResources().getColor(colorId));
+    }
+
+    /**
+     * Get candidate number of division.
+     * @return Number of division
+     */
+    private int getCandidateViewDivison() {
+        int viewDivison;
+
+        if (mIsSymbolMode) {
+            int mode = mSymbolMode;
+            switch (mode) {
+            case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
+                viewDivison = (mPortrait) ? FULL_VIEW_SYMBOL_DIV_PORT : FULL_VIEW_SYMBOL_DIV_LAND;
+                break;
+            case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
+            default:
+                viewDivison = FULL_VIEW_DIV;
+                break;
+            }
+        } else {
+             viewDivison = FULL_VIEW_DIV;
+        }
+        return viewDivison;
+    }
+
+    /**
+     * @return Word count
+     */
+    private int getWordCount() {
+        return mWordCount1st + mWordCount2nd;
+    }
+
+    /**
+     * @return Add second
+     */
+    private boolean isFirstListOver(boolean isFullView, int lineCount, WnnWord word) {
+
+        if (mIsSymbolMode) {
+            switch (mSymbolMode) {
+            case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
+                return true;
+            case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
+				return true;
+            default:
+                return (isFullView || getMaxLine() < lineCount);
+            }
+        } else {
+            return (isFullView || getMaxLine() < lineCount);
+        }
+    }
+
+    /**
+     * @return Candidate space width
+     */
+    private int getCandidateSpaceWidth(boolean isEmojiSymbol) {
+        Resources r = mWnn.getResources();
+        if (mPortrait) {
+            if (isEmojiSymbol) {
+                return 0;
+            } else {
+                return r.getDimensionPixelSize(R.dimen.cand_space_width);
+            }
+        } else {
+            if (isEmojiSymbol) {
+                return r.getDimensionPixelSize(R.dimen.cand_space_width_emoji_symbol);
+            } else {
+                return r.getDimensionPixelSize(R.dimen.cand_space_width);
+            }
+        }
+    }
+
+    /**
+     * KeyEvent action for the candidate view.
+     *
+     * @param key    Key event
+     */
+    public void processMoveKeyEvent(int key) {
+        if (!mViewBody.isShown()) {
+            return;
+        }
+
+        switch (key) {
+        case KeyEvent.KEYCODE_DPAD_UP:
+            moveFocus(-1, true);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_DOWN:
+            moveFocus(1, true);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_LEFT:
+            moveFocus(-1, false);
+            break;
+
+        case KeyEvent.KEYCODE_DPAD_RIGHT:
+            moveFocus(1, false);
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    /**
+     * Get a flag candidate is focused now.
+     *
+     * @return the Candidate is focused of a flag.
+     */
+    public boolean isFocusCandidate(){
+        if (mCurrentFocusIndex != FOCUS_NONE) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Give focus to View of candidate.
+     */
+    public void setViewStatusOfFocusedCandidate(){
+        View view = mFocusedView;
+        if (view != null) {
+            view.setBackgroundDrawable(mFocusedViewBackground);
+            view.setPadding(0, 0, 0, 0);
+        }
+
+        TextView v = getFocusedView();
+        mFocusedView = v;
+        if (v != null) {
+            mFocusedViewBackground = v.getBackground();
+            v.setBackgroundResource(R.drawable.cand_back_focuse);
+            v.setPadding(0, 0, 0, 0);
+
+            int viewBodyTop = getViewTopOnScreen(mViewBodyScroll);
+            int viewBodyBottom = viewBodyTop + mViewBodyScroll.getHeight();
+            int focusedViewTop = getViewTopOnScreen(v);
+            int focusedViewBottom = focusedViewTop + v.getHeight();
+
+            if (focusedViewBottom > viewBodyBottom) {
+                mViewBodyScroll.scrollBy(0, (focusedViewBottom - viewBodyBottom));
+            } else if (focusedViewTop < viewBodyTop) {
+                mViewBodyScroll.scrollBy(0, (focusedViewTop - viewBodyTop));
+            }
+        }
+    }
+
+    /**
+     * Clear focus to selected candidate.
+     */
+    public void clearFocusCandidate(){
+        View view = mFocusedView;
+        if (view != null) {
+            view.setBackgroundDrawable(mFocusedViewBackground);
+            view.setPadding(0, 0, 0, 0);
+            mFocusedView = null;
+        }
+
+        mFocusAxisX = 0;
+        mHasFocusedArray1st = true;
+        mCurrentFocusIndex = FOCUS_NONE;
+        mHandler.removeMessages(MSG_MOVE_FOCUS);
+        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_END));
+    }
+
+    /**
+     * @see CandidatesViewManager#selectFocusCandidate
+     */
+    public void selectFocusCandidate(){
+        if (mCurrentFocusIndex != FOCUS_NONE) {
+            WnnWord word = getFocusedWnnWord();
+
+            if (mHandler.hasMessages(MSG_SET_CANDIDATES)) {
+                mWnnWordSelectedList.add(word);
+            } else {
+                selectCandidate(word);
+            }
+        }
+    }
+
+    /** @see CandidatesViewManager#getFocusedWnnWord */
+    public WnnWord getFocusedWnnWord() {
+        return getWnnWord(mCurrentFocusIndex);
+    }
+
+    /**
+     * Get WnnWord.
+     * 
+     * @return WnnWord word
+     */
+    public WnnWord getWnnWord(int index) {
+        WnnWord word = null;
+        if (index < 0) {
+            index = 0;
+            mHandler.removeMessages(MSG_MOVE_FOCUS);
+            Log.i("iwnn", "TextCandidatesViewManager::getWnnWord  index < 0 ");
+        } else {
+            int size = mHasFocusedArray1st ? mWnnWordArray1st.size() : mWnnWordArray2nd.size();
+            if (index >= size) {
+                index = size - 1;
+                mHandler.removeMessages(MSG_MOVE_FOCUS);
+                Log.i("iwnn", "TextCandidatesViewManager::getWnnWord  index > candidate max ");
+            }
+        }
+     
+        if (mHasFocusedArray1st) {
+            word = mWnnWordArray1st.get(index);
+        } else {
+            word = mWnnWordArray2nd.get(index);
+        }
+        return word;
+    }
+
+    /**
+     * Set display candidate line from SharedPreferences.
+     */
+    private void setNumeberOfDisplayLines(){
+        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mWnn);
+        mPortraitNumberOfLine = Integer.parseInt(pref.getString("setting_portrait", "2"));
+        mLandscapeNumberOfLine = Integer.parseInt(pref.getString("setting_landscape", "1"));
+    }
+
+    /**
+     * Set emoticon enabled.
+     */
+    public void setEnableEmoticon(boolean enableEmoticon) {
+        mEnableEmoticon = enableEmoticon;
+    }
+
+    /**
+     * Get View of focus candidate.
+     */
+    public TextView getFocusedView() {
+        if (mCurrentFocusIndex == FOCUS_NONE) {
+            return null;
+        }
+        TextView t;
+        if (mHasFocusedArray1st) {
+            t = mTextViewArray1st.get(mCurrentFocusIndex);
+        } else {
+            t = mTextViewArray2nd.get(mCurrentFocusIndex);
+        }
+        return t;
+    }
+
+    /**
+     * Move the focus to next candidate.
+     *
+     * @param direction  The direction of increment or decrement.
+     * @param updown     {@code true} if move is up or down.
+     */
+    public void moveFocus(int direction, boolean updown) {
+        boolean isStart = (mCurrentFocusIndex == FOCUS_NONE);
+        if (direction == 0) {
+            setViewStatusOfFocusedCandidate();
+        }
+
+        int size1st = mTextViewArray1st.size();
+        if (mHasFocusedArray1st && (size1st == 0)) {
+            mHasFocusedArray1st = false;
+        }
+        ArrayList<TextView> list = mHasFocusedArray1st ? mTextViewArray1st : mTextViewArray2nd;
+        int size = list.size();
+        int start = (mCurrentFocusIndex == FOCUS_NONE) ? 0 : (mCurrentFocusIndex + direction);
+
+        int index = -1;
+        boolean hasChangedLine = false;
+        for (int i = start; (0 <= i) && (i < size); i += direction) {
+            TextView view = list.get(i);
+            if (!view.isShown()) {
+                break;
+            }
+
+            if (mIsSymbolMode && (view.getBackground() == null)) {
+                continue;
+            }
+
+            if (updown) {
+                int left = view.getLeft();
+                if ((left <= mFocusAxisX)
+                        && (mFocusAxisX < view.getRight())) {
+                    index = i;
+                    break;
+                }
+
+                if (left == 0) {
+                    hasChangedLine = true;
+                }
+            } else {
+                index = i;
+                break;
+            }
+        }
+
+        if ((index < 0) && hasChangedLine && !mHasFocusedArray1st && (0 < direction)) {
+            index = mTextViewArray2nd.size() - 1;
+        }
+
+        if (0 <= index) {
+            mCurrentFocusIndex = index;
+            setViewStatusOfFocusedCandidate();
+            if (!updown) {
+                mFocusAxisX = getFocusedView().getLeft();
+            }
+        } else {
+            if (mCanReadMore && (0 < size1st)) {
+
+                if ((mHasFocusedArray1st && (direction < 0))
+                        || (!mHasFocusedArray1st && (0 < direction))) {
+                    updown = false;
+                }
+
+                mHasFocusedArray1st = !mHasFocusedArray1st;
+
+                if (!mHasFocusedArray1st && !mIsFullView) {
+                    setFullMode();
+                }
+            }
+
+            if (size1st == 0) {
+                updown = false;
+            }
+
+            if (0 < direction) {
+                mCurrentFocusIndex = -1;
+            } else {
+                mCurrentFocusIndex = (mHasFocusedArray1st ? size1st : mTextViewArray2nd.size());
+            }
+            Message m = mHandler.obtainMessage(MSG_MOVE_FOCUS, direction, updown ? 1 : 0);
+            mHandler.sendMessage(m);
+        }
+
+        if (isStart) {
+            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_START));
+        }
+    }
+
+    /**
+     * Set hardkeyboard hidden.
+     *
+     * @param hardKeyboardHidden hardkeyaboard hidden.
+     */
+    public void setHardKeyboardHidden(boolean hardKeyboardHidden) {
+        mHardKeyboardHidden = hardKeyboardHidden;
+    }
+
+    /**
+     * Get view top position on screen.
+     *
+     * @param view target view.
+     * @return int view top position on screen
+     */
+    public int getViewTopOnScreen(View view) {
+        int[] location = new int[2];
+        view.getLocationOnScreen(location);
+        return location[1];
+    }
+
+
+    /** @see CandidatesViewManager#setCandidateMsgRemove */
+    public void setCandidateMsgRemove() {
+        mHandler.removeMessages(MSG_SET_CANDIDATES);
+    }
 }
diff --git a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsEdit.java b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsEdit.java
index 9a023e5..cf774ce 100644
--- a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsEdit.java
+++ b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsEdit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -113,7 +113,6 @@
         super.onCreate(savedInstanceState);
 
         /* create view from XML layout */
-        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
         setContentView(R.layout.user_dictionary_tools_edit);
 
         /* get widgets */
diff --git a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsList.java b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsList.java
index 15d1f4a..0c584b6 100644
--- a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsList.java
+++ b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsList.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +21,15 @@
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.graphics.Color;
+import android.graphics.Paint.FontMetricsInt;
 import android.os.Bundle;
+import android.text.TextPaint;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Display;
+import android.view.Gravity;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
@@ -144,6 +148,9 @@
     /** Page right button */
     private Button mRightButton = null;
 
+    /** for isXLarge */
+    private static boolean mIsXLarge = false;
+
     /**
      * Send the specified event to IME
      *
@@ -154,10 +161,8 @@
     /** Get the comparator for sorting the list */
     protected abstract Comparator<WnnWord> getComparator();
 
-    /**
-     * Create the header
-     */
-    protected abstract void  headerCreate();
+    /** Show Dialog Num */
+    private int mDialogShow = -1;
 
     /** @see android.app.Activity#onCreate */
     @Override protected void onCreate(Bundle savedInstanceState) {
@@ -166,7 +171,6 @@
         super.onCreate(savedInstanceState);
 
         /* create XML layout */
-        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
         setContentView(R.layout.user_dictionary_tools_list);
         mTableLayout = (TableLayout)findViewById(R.id.user_dictionary_tools_table);
 
@@ -201,18 +205,39 @@
     /** @see android.app.Activity#onStart */
     @Override protected void onStart() {
         super.onStart();
+        mDialogShow = -1;
         sBeforeSelectedViewID = -1;
         sJustBeforeActionTime = -1;
         mWordList = getWords();
 
-        headerCreate();
         final TextView leftText = (TextView) findViewById(R.id.user_dictionary_tools_list_title_words_count);
         leftText.setText(mWordList.size() + "/" + MAX_WORD_COUNT);
 
+        mIsXLarge = ((getResources().getConfiguration().screenLayout &
+                      Configuration.SCREENLAYOUT_SIZE_MASK)
+                      == Configuration.SCREENLAYOUT_SIZE_XLARGE);
         updateWordList();
     }
 
     /**
+     * Called when the system is about to start resuming a previous activity.
+     *
+     * @see android.app.Activity#onPause
+     */
+    @Override protected void onPause() {
+
+        if (mDialogShow == DIALOG_CONTROL_DELETE_CONFIRM) {
+            dismissDialog(DIALOG_CONTROL_DELETE_CONFIRM);
+            mDialogShow = -1;
+        } else if (mDialogShow == DIALOG_CONTROL_INIT_CONFIRM){
+            dismissDialog(DIALOG_CONTROL_INIT_CONFIRM);
+            mDialogShow = -1;
+        }
+
+        super.onPause();
+    }
+
+    /**
      * Set parameters of table
      *
      * @param  w        The width of the table
@@ -308,12 +333,14 @@
         case MENU_ITEM_DELETE:
             /* delete the word (show dialog) */
             showDialog(DIALOG_CONTROL_DELETE_CONFIRM);
+            mDialogShow = DIALOG_CONTROL_DELETE_CONFIRM;
             ret = true;
             break;
 
         case MENU_ITEM_INIT:
             /* clear the dictionary (show dialog) */
             showDialog(DIALOG_CONTROL_INIT_CONFIRM);
+            mDialogShow = DIALOG_CONTROL_INIT_CONFIRM;
             ret = true;
             break;
 
@@ -372,6 +399,7 @@
         new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int button) {
 
+                mDialogShow = -1;
                 CharSequence focusString = ((TextView)sFocusingView).getText();
                 CharSequence focusPairString = ((TextView)sFocusingPairView).getText();
                 WnnWord wnnWordSearch = new WnnWord();
@@ -422,6 +450,7 @@
         new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int button) {
 
+                mDialogShow = -1;
                 /* clear the user dictionary */
                 OpenWnnEvent ev = new OpenWnnEvent(OpenWnnEvent.INITIALIZE_USER_DICTIONARY, new WnnWord());
 
@@ -638,6 +667,12 @@
             Display display = windowManager.getDefaultDisplay();
             int system_width = display.getWidth();
 
+            UserDictionaryToolsListFocus dummy = new UserDictionaryToolsListFocus(this);
+            dummy.setTextSize(WORD_TEXT_SIZE);
+            TextPaint paint = dummy.getPaint();
+            FontMetricsInt fontMetrics = paint.getFontMetricsInt();
+            int row_hight = (Math.abs(fontMetrics.top) + fontMetrics.bottom) * 2;
+ 
             for (int i = 1; i <= MAX_LIST_WORD_COUNT; i++) {
                 TableRow row = new TableRow(this);
                 UserDictionaryToolsListFocus stroke = new UserDictionaryToolsListFocus(this);
@@ -654,6 +689,10 @@
                 stroke.setFocusableInTouchMode(true);
                 stroke.setOnTouchListener(this);
                 stroke.setOnFocusChangeListener(this);
+                if (isXLarge()) {
+                    stroke.setHeight(row_hight);
+                    stroke.setGravity(Gravity.CENTER_VERTICAL);
+                }
 
                 UserDictionaryToolsListFocus candidate = new UserDictionaryToolsListFocus(this);
                 candidate.setId(i+MAX_WORD_COUNT);
@@ -670,6 +709,10 @@
                 candidate.setOnTouchListener(this);
                 candidate.setOnFocusChangeListener(this);
 
+                if (isXLarge()) {
+                    candidate.setHeight(row_hight);
+                    candidate.setGravity(Gravity.CENTER_VERTICAL);
+                }
                 stroke.setPairView(candidate);
                 candidate.setPairView(stroke);
 
@@ -726,4 +769,14 @@
         }
         mTableLayout.requestLayout();
     }
+
+    /**
+     * Whether the x large mode.
+     *
+     * @return      {@code true} if x large; {@code false} if not x large.
+     */
+    public static boolean isXLarge() {
+        return mIsXLarge;
+    }
+
 }
diff --git a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsListFocus.java b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsListFocus.java
index 4a6a8fe..51b9bf6 100644
--- a/src/jp/co/omronsoft/openwnn/UserDictionaryToolsListFocus.java
+++ b/src/jp/co/omronsoft/openwnn/UserDictionaryToolsListFocus.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnClause.java b/src/jp/co/omronsoft/openwnn/WnnClause.java
index 6d4babd..aabd2ce 100644
--- a/src/jp/co/omronsoft/openwnn/WnnClause.java
+++ b/src/jp/co/omronsoft/openwnn/WnnClause.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnDictionary.java b/src/jp/co/omronsoft/openwnn/WnnDictionary.java
index c4b2aa5..e58955e 100644
--- a/src/jp/co/omronsoft/openwnn/WnnDictionary.java
+++ b/src/jp/co/omronsoft/openwnn/WnnDictionary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnEngine.java b/src/jp/co/omronsoft/openwnn/WnnEngine.java
index 4d23966..a24aa37 100644
--- a/src/jp/co/omronsoft/openwnn/WnnEngine.java
+++ b/src/jp/co/omronsoft/openwnn/WnnEngine.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnPOS.java b/src/jp/co/omronsoft/openwnn/WnnPOS.java
index dd61f2e..33fd6a0 100644
--- a/src/jp/co/omronsoft/openwnn/WnnPOS.java
+++ b/src/jp/co/omronsoft/openwnn/WnnPOS.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnSentence.java b/src/jp/co/omronsoft/openwnn/WnnSentence.java
index c6ffbca..6644b7d 100644
--- a/src/jp/co/omronsoft/openwnn/WnnSentence.java
+++ b/src/jp/co/omronsoft/openwnn/WnnSentence.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/jp/co/omronsoft/openwnn/WnnWord.java b/src/jp/co/omronsoft/openwnn/WnnWord.java
index fb2f7c6..0ac065c 100644
--- a/src/jp/co/omronsoft/openwnn/WnnWord.java
+++ b/src/jp/co/omronsoft/openwnn/WnnWord.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
+ * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.