diff --git a/scim-wnn/src/preeditor.cpp b/scim-wnn/src/preeditor.cpp
index d3e04e3..5fc0a4c 100644
--- a/scim-wnn/src/preeditor.cpp
+++ b/scim-wnn/src/preeditor.cpp
@@ -24,7 +24,33 @@
     iconvert.set_encoding ("EUC-JP");
     config = cfg;
     if (!convChars.size())
-        iconvert.convert(convChars,String("���󥡥�!~�������"));
+        iconvert.convert(convChars,String("���󥡥�!~���Ѥ��"));
+    if (!hKanaChars.size()) {
+        // ���������ɤ���ʳ���ˡ�פ��Ĥ��ʤ��衼
+        const String hKana[] = {
+            "��","��","��","��","��","��","��","��","��","��","��","����","��","����","��",
+            "����","��","����","��","����","��","����","��","����","��","����","��","����","��",
+            "����","��","����","��","����","��","��","�Ž�","��","�Î�","��","�Ď�","��","��","��",
+            "��","��","��","�ʎ�","�ʎ�","��","�ˎ�","�ˎ�","��","�̎�","�̎�","��","�͎�","�͎�",
+            "��","�Ύ�","�Ύ�","��","��","��","��","��","��","��","��","��","��","��","��",
+            "��","��","��","��","��","��","��","��","��","��","","","","","","","",
+            "��","��","","","","",
+            "��","��","��","��","��","��","��","��","��","��","��","����","��","����","��",
+            "����","��","����","��","����","��","����","��","����","��","����","��","����","��",
+            "����","��","����","��","����","��","��","�Ž�","��","�Î�","��","�Ď�","��","��","��",
+            "��","��","��","�ʎ�","�ʎ�","��","�ˎ�","�ˎ�","��","�̎�","�̎�","��","�͎�","�͎�",
+            "��","�Ύ�","�Ύ�","��","��","��","��","��","��","��","��","��","��","��","��",
+            "��","��","��","��","��","��","��","��","��","��","����","��","��","","","","",
+            "","-","���܎؎��ގ��ގَ�"
+            };
+        for(unsigned int i = 0;hKana[i] != "���܎؎��ގ��ގَ�";i ++) {
+            if (hKana[i] != "") {
+                WideString k;
+                iconvert.convert(k,hKana[i]);
+                hKanaChars.insert(pair<ucs4_t,WideString>(convChars[HIRA_START] + i,k));
+            }
+        }
+    }
 }
 
 
@@ -34,6 +60,7 @@
 
 WideString PreEditor::text = WideString();
 WideString PreEditor::convChars = WideString();
+map<ucs4_t,WideString> PreEditor::hKanaChars;
 int PreEditor::pos = 0;
 IConvert PreEditor::iconvert;
 
@@ -173,8 +200,17 @@
 void PreEditor::convZenHan(WideString &t)
 {
     for(unsigned int i = 0;i < t.size();i ++) {
-        if ((t[i] >= convChars[WASCII_START]) && (t[i] <= convChars[WASCII_START]))
+        if ((t[i] >= convChars[WASCII_START]) && (t[i] <= convChars[WASCII_END]))
             t[i] = t[i] - convChars[WASCII_START] + convChars[ASCII_START];
+
+        // Ķ��Ⱦ�ѥ����Ѵ�
+        map<ucs4_t,WideString>::iterator it = hKanaChars.find(t[i]);
+        if (it != hKanaChars.end()) {
+            WideString m1 = t.substr(0,i);
+            WideString m2 = t.substr(i + 1);
+            t = m1 + it->second + m2;
+            i += it->second.length() - 1;
+        }
     }
     return;
 
@@ -200,6 +236,23 @@
 
 
 /*!
+    \fn PreEditor::toHalf()
+ */
+void PreEditor::toHalf()
+{
+    convZenHan(text);
+}
+
+/*!
+    \fn PreEditor::toWide()
+ */
+void PreEditor::toWide()
+{
+    convHanZen(text);
+}
+
+
+/*!
     \fn PreEditor::keyEventHook(const KeyEvent &key)
  */
 bool PreEditor::keyEventHook(const KeyEvent &key)
diff --git a/scim-wnn/src/preeditor.h b/scim-wnn/src/preeditor.h
index 921dcd6..94837de 100644
--- a/scim-wnn/src/preeditor.h
+++ b/scim-wnn/src/preeditor.h
@@ -22,6 +22,8 @@
 
 #define Uses_SCIM_ICONV
 #define Uses_SCIM_CONFIG_BASE
+#include <vector>
+#include <map>
 #include <scim.h>
 #include <scim_iconv.h>
 #include <scim_event.h>
@@ -75,6 +77,8 @@
     virtual String getName();
     virtual String getPropertyName() {return(String("PreEditor"));};
     virtual void setText(const WideString &t);
+    virtual void toWide();
+    virtual void toHalf();
 
 protected:
     static WideString text;
@@ -82,6 +86,7 @@
     static IConvert iconvert;
     ConfigPointer config;
     static WideString convChars;
+    static map<ucs4_t,WideString> hKanaChars;
 
 };
 
diff --git a/scim-wnn/src/romkan.cpp b/scim-wnn/src/romkan.cpp
index ddc8a50..cb1ed68 100644
--- a/scim-wnn/src/romkan.cpp
+++ b/scim-wnn/src/romkan.cpp
@@ -52,9 +52,10 @@
         String s = _RomkanTable[i];
         iconvert.convert(w,String(_RomkanTable[i + 1]));
         RomkanTable.insert(pair<String,WideString>(s,w));
-        if (s.length() > 1) {
-            String k = s.substr(0,s.length() - 1);
-            if (keepTable.find(k) == keepTable.end()) {
+
+        for(unsigned int j = s.length();j > 1;j --) {
+            String k = s.substr(0,j - 1);
+            if ((keepTable.find(k) == keepTable.end()) && (RomkanTable.find(k) == RomkanTable.end())) {
                 keepTable.insert(k);
             }
         }
@@ -271,6 +272,25 @@
     convKataHira(text);
 }
 
+/*!
+    \fn Romkan::toHalf()
+ */
+void Romkan::toHalf()
+{
+    convZenHan(text);
+    buf.clear();
+}
+
+/*!
+    \fn Romkan::toWide()
+ */
+void Romkan::toWide()
+{
+    convHanZen(text);
+    buf.clear();
+}
+
+
 
 /*!
     \fn Romkan::keyEventHook(const KeyEvent &key)
diff --git a/scim-wnn/src/romkan.h b/scim-wnn/src/romkan.h
index d6d8e31..6cd9ca6 100644
--- a/scim-wnn/src/romkan.h
+++ b/scim-wnn/src/romkan.h
@@ -54,6 +54,8 @@
     virtual void del();
     virtual void hiraKata();
     virtual void kataHira();
+    virtual void toWide();
+    virtual void toHalf();
     virtual bool keyEventHook(const KeyEvent &key);
     virtual String getModeName();
     virtual bool cancelEvent();
diff --git a/scim-wnn/src/romkan_table.h b/scim-wnn/src/romkan_table.h
index 954525b..c9f0d99 100644
--- a/scim-wnn/src/romkan_table.h
+++ b/scim-wnn/src/romkan_table.h
@@ -354,3 +354,4 @@
     "zx",   ":-",
     ""
 };
+
diff --git a/scim-wnn/src/scim_wnn_def.h b/scim-wnn/src/scim_wnn_def.h
index 3daca15..7beacc7 100644
--- a/scim-wnn/src/scim_wnn_def.h
+++ b/scim-wnn/src/scim_wnn_def.h
@@ -61,6 +61,10 @@
 #define SCIM_DEFAULT_WNN_KEY_CONVERT_HIRAGANA       "Alt+h"
 #define SCIM_CONFIG_WNN_KEY_CONVERT_KATAKANA        "/IMEngine/Wnn/Key/ConvertKatakana"
 #define SCIM_DEFAULT_WNN_KEY_CONVERT_KATAKANA       "Alt+k"
+#define SCIM_CONFIG_WNN_KEY_CONVERT_HALF            "/IMEngine/Wnn/Key/ConvertHalf"
+#define SCIM_DEFAULT_WNN_KEY_CONVERT_HALF           "F6"
+#define SCIM_CONFIG_WNN_KEY_CONVERT_WIDE            "/IMEngine/Wnn/Key/ConvertWide"
+#define SCIM_DEFAULT_WNN_KEY_CONVERT_WIDE           "F5"
 
 #define SCIM_CONFIG_WNN_KEY_CONVERSION_IKEIJI       "/IMEngine/Wnn/Key/ConversionIkeiji"
 #define SCIM_DEFAULT_WNN_KEY_CONVERSION_IKEIJI      "Shift+F8"
diff --git a/scim-wnn/src/scim_wnn_imengine.cpp b/scim-wnn/src/scim_wnn_imengine.cpp
index 34c9119..fc5bb93 100644
--- a/scim-wnn/src/scim_wnn_imengine.cpp
+++ b/scim-wnn/src/scim_wnn_imengine.cpp
@@ -280,6 +280,12 @@
     scim_string_to_key_list(k_convert_katakana,
         _scim_config->read(String(SCIM_CONFIG_WNN_KEY_CONVERT_KATAKANA),
             String(SCIM_DEFAULT_WNN_KEY_CONVERT_KATAKANA)));
+    scim_string_to_key_list(k_convert_half,
+        _scim_config->read(String(SCIM_CONFIG_WNN_KEY_CONVERT_HALF),
+            String(SCIM_DEFAULT_WNN_KEY_CONVERT_HALF)));
+    scim_string_to_key_list(k_convert_wide,
+        _scim_config->read(String(SCIM_CONFIG_WNN_KEY_CONVERT_WIDE),
+            String(SCIM_DEFAULT_WNN_KEY_CONVERT_WIDE)));
 
     scim_string_to_key_list(k_conversion_rensou,
         _scim_config->read(String(SCIM_CONFIG_WNN_KEY_CONVERSION_RENSOU),
@@ -478,6 +484,16 @@
             updatePreEditor();
             return(true);
         } else
+        if (k_convert_half.comp(key)) {
+            m_preeditor->toHalf();
+            updatePreEditor();
+            return(true);
+        } else
+        if (k_convert_wide.comp(key)) {
+            m_preeditor->toWide();
+            updatePreEditor();
+            return(true);
+        } else
         if (k_select_yosoku.comp(key) && yosoku) {
             if ((m_convList.kType == YOSOKU) && (m_convList.count)) {
                 return(process_yosoku_key_event(key));
diff --git a/scim-wnn/src/scim_wnn_imengine.h b/scim-wnn/src/scim_wnn_imengine.h
index 48998ac..d829bbb 100644
--- a/scim-wnn/src/scim_wnn_imengine.h
+++ b/scim-wnn/src/scim_wnn_imengine.h
@@ -141,6 +141,8 @@
         k_lookup_pagedown,      // �����������
         k_convert_hiragana,     // �Ҥ餬���Ѵ�
         k_convert_katakana,     // ���������Ѵ�
+        k_convert_half,         // Ⱦ���Ѵ�
+        k_convert_wide,         // �����Ѵ�
         k_auto_conversion,      // �Ѵ��⡼�ɥȥ���
 
         // for Wnn7