diff --git a/source/common/ucnv2022.cpp b/source/common/ucnv2022.cpp
index 169ad4c5..a211df79 100644
--- a/source/common/ucnv2022.cpp
+++ b/source/common/ucnv2022.cpp
@@ -513,7 +513,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){
                     ucnv_loadSharedData("ISO8859_7", &stackPieces, &stackArgs, errorCode);
             }
             myConverterData->myConverterArray[JISX208] =
-                ucnv_loadSharedData("Shift-JIS", &stackPieces, &stackArgs, errorCode);
+                ucnv_loadSharedData("EUC-JP", &stackPieces, &stackArgs, errorCode);
             if(jpCharsetMasks[version]&CSM(JISX212)) {
                 myConverterData->myConverterArray[JISX212] =
                     ucnv_loadSharedData("jisx-212", &stackPieces, &stackArgs, errorCode);
@@ -1514,79 +1514,6 @@ jisx201FromU(uint32_t value) {
     return 0xfffe;
 }
 
-/*
- * Take a valid Shift-JIS byte pair, check that it is in the range corresponding
- * to JIS X 0208, and convert it to a pair of 21..7E bytes.
- * Return 0 if the byte pair is out of range.
- */
-static inline uint32_t
-_2022FromSJIS(uint32_t value) {
-    uint8_t trail;
-
-    if(value > 0xEFFC) {
-        return 0;  /* beyond JIS X 0208 */
-    }
-
-    trail = (uint8_t)value;
-
-    value &= 0xff00;  /* lead byte */
-    if(value <= 0x9f00) {
-        value -= 0x7000;
-    } else /* 0xe000 <= value <= 0xef00 */ {
-        value -= 0xb000;
-    }
-    value <<= 1;
-
-    if(trail <= 0x9e) {
-        value -= 0x100;
-        if(trail <= 0x7e) {
-            value |= trail - 0x1f;
-        } else {
-            value |= trail - 0x20;
-        }
-    } else /* trail <= 0xfc */ {
-        value |= trail - 0x7e;
-    }
-    return value;
-}
-
-/*
- * Convert a pair of JIS X 0208 21..7E bytes to Shift-JIS.
- * If either byte is outside 21..7E make sure that the result is not valid
- * for Shift-JIS so that the converter catches it.
- * Some invalid byte values already turn into equally invalid Shift-JIS
- * byte values and need not be tested explicitly.
- */
-static inline void
-_2022ToSJIS(uint8_t c1, uint8_t c2, char bytes[2]) {
-    if(c1&1) {
-        ++c1;
-        if(c2 <= 0x5f) {
-            c2 += 0x1f;
-        } else if(c2 <= 0x7e) {
-            c2 += 0x20;
-        } else {
-            c2 = 0;  /* invalid */
-        }
-    } else {
-        if((uint8_t)(c2-0x21) <= ((0x7e)-0x21)) {
-            c2 += 0x7e;
-        } else {
-            c2 = 0;  /* invalid */
-        }
-    }
-    c1 >>= 1;
-    if(c1 <= 0x2f) {
-        c1 += 0x70;
-    } else if(c1 <= 0x3f) {
-        c1 += 0xb0;
-    } else {
-        c1 = 0;  /* invalid */
-    }
-    bytes[0] = (char)c1;
-    bytes[1] = (char)c2;
-}
-
 /*
  * JIS X 0208 has fallbacks from Unicode half-width Katakana to full-width (DBCS)
  * Katakana.
@@ -1857,8 +1784,13 @@ getTrail:
                                 converterData->myConverterArray[cs0],
                                 sourceChar, &value,
                                 useFallback, MBCS_OUTPUT_2);
-                    if(len2 == 2 || (len2 == -2 && len == 0)) {  /* only accept DBCS: abs(len)==2 */
-                        value = _2022FromSJIS(value);
+                    // Only accept DBCS char (abs(len2) == 2).
+                    // With EUC-JP table for JIS X 208, half-width Kana
+                    // represented with DBCS starting with 0x8E has to be
+                    // filtered out so that they can be converted with
+                    // hwkana_fb table.
+                    if((len2 == 2 && ((value & 0xFF00) != 0x8E00)) || (len2 == -2 && len == 0)) {
+                        value &= 0x7F7F;
                         if(value != 0) {
                             targetValue = value;
                             len = len2;
@@ -2250,18 +2182,13 @@ getTrailByte:
                         if (leadIsOk && trailIsOk) {
                             ++mySource;
                             tmpSourceChar = (mySourceChar << 8) | trailByte;
-                            if(cs == JISX208) {
-                                _2022ToSJIS((uint8_t)mySourceChar, trailByte, tempBuf);
-                                mySourceChar = tmpSourceChar;
-                            } else {
-                                /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */
-                                mySourceChar = tmpSourceChar;
-                                if (cs == KSC5601) {
-                                    tmpSourceChar += 0x8080;  /* = _2022ToGR94DBCS(tmpSourceChar) */
-                                }
-                                tempBuf[0] = (char)(tmpSourceChar >> 8);
-                                tempBuf[1] = (char)(tmpSourceChar);
+                            /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */
+                            mySourceChar = tmpSourceChar;
+                            if (cs == JISX208 || cs == KSC5601) {
+                                tmpSourceChar += 0x8080;  /* = _2022ToGR94DBCS(tmpSourceChar) */
                             }
+                            tempBuf[0] = (char)(tmpSourceChar >> 8);
+                            tempBuf[1] = (char)(tmpSourceChar);
                             targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->myConverterArray[cs], tempBuf, 2, FALSE);
                         } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) {
                             /* report a pair of illegal bytes if the second byte is not a DBCS starter */
