diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index a4f672d..6a76a0b 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -1750,10 +1750,13 @@
             NameSplitter splitter, StringBuilder sb) {
 
         splitter.guessNameStyle(name);
+        int unadjustedFullNameStyle = name.fullNameStyle;
         name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle);
         String displayName = splitter.join(name, true);
 
-        structuredNameUpdate.bindLong(1, name.fullNameStyle);
+        // Don't update database with the adjusted fullNameStyle as it is locale
+        // related
+        structuredNameUpdate.bindLong(1, unadjustedFullNameStyle);
         DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName);
         structuredNameUpdate.bindLong(3, name.phoneticNameStyle);
         structuredNameUpdate.bindLong(4, dataId);
@@ -1767,8 +1770,10 @@
 
             if (phoneticName != null) {
                 sortKey = sortKeyAlternative = phoneticName;
-            } else if (name.fullNameStyle == FullNameStyle.CHINESE) {
-                sortKey = sortKeyAlternative = splitter.convertHanziToPinyin(displayName);
+            } else if (name.fullNameStyle == FullNameStyle.CHINESE ||
+                    name.fullNameStyle == FullNameStyle.CJK) {
+                sortKey = sortKeyAlternative = ContactLocaleUtils.getIntance()
+                        .getSortKey(displayName, name.fullNameStyle);
             }
 
             if (sortKey == null) {
@@ -1829,8 +1834,10 @@
                 if (phoneticName == null && company != null) {
                     int nameStyle = splitter.guessFullNameStyle(company);
                     nameStyle = splitter.getAdjustedFullNameStyle(nameStyle);
-                    if (nameStyle == FullNameStyle.CHINESE) {
-                        sortKey = splitter.convertHanziToPinyin(company);
+                    if (nameStyle == FullNameStyle.CHINESE ||
+                            nameStyle == FullNameStyle.CJK ) {
+                        sortKey = ContactLocaleUtils.getIntance()
+                                .getSortKey(company, nameStyle);
                     }
                 }
 
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 6b218a1..b65a113 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -1244,11 +1244,12 @@
                 // As the name could be changed, let's guess the name style again.
                 name.fullNameStyle = FullNameStyle.UNDEFINED;
                 mSplitter.guessNameStyle(name);
-
+                int unadjustedFullNameStyle = name.fullNameStyle;
+                name.fullNameStyle = mSplitter.getAdjustedFullNameStyle(name.fullNameStyle);
                 final String joined = mSplitter.join(name, true);
                 update.put(StructuredName.DISPLAY_NAME, joined);
 
-                update.put(StructuredName.FULL_NAME_STYLE, name.fullNameStyle);
+                update.put(StructuredName.FULL_NAME_STYLE, unadjustedFullNameStyle);
                 update.put(StructuredName.PHONETIC_NAME_STYLE, name.phoneticNameStyle);
             } else if (touchedUnstruct && touchedStruct){
                 if (!update.containsKey(StructuredName.FULL_NAME_STYLE)) {
@@ -1969,23 +1970,6 @@
                         " WHERE " + RawContacts._ID + "=?)" +
                 " AND " + RawContacts._ID + "!=?");
 
-        mDataRowHandlers = new HashMap<String, DataRowHandler>();
-
-        mDataRowHandlers.put(Email.CONTENT_ITEM_TYPE, new EmailDataRowHandler());
-        mDataRowHandlers.put(Im.CONTENT_ITEM_TYPE,
-                new CommonDataRowHandler(Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL));
-        mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new CommonDataRowHandler(
-                StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, StructuredPostal.LABEL));
-        mDataRowHandlers.put(Organization.CONTENT_ITEM_TYPE, new OrganizationDataRowHandler());
-        mDataRowHandlers.put(Phone.CONTENT_ITEM_TYPE, new PhoneDataRowHandler());
-        mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new NicknameDataRowHandler());
-        mDataRowHandlers.put(StructuredName.CONTENT_ITEM_TYPE,
-                new StructuredNameRowHandler(mNameSplitter));
-        mDataRowHandlers.put(StructuredPostal.CONTENT_ITEM_TYPE,
-                new StructuredPostalRowHandler(mPostalSplitter));
-        mDataRowHandlers.put(GroupMembership.CONTENT_ITEM_TYPE, new GroupMembershipRowHandler());
-        mDataRowHandlers.put(Photo.CONTENT_ITEM_TYPE, new PhotoDataRowHandler());
-
         mMimeTypeIdEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
         mMimeTypeIdIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
         mMimeTypeIdStructuredName = mDbHelper.getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE);
@@ -2003,6 +1987,24 @@
         return (mDb != null);
     }
 
+    private void initDataRowHandlers() {
+      mDataRowHandlers = new HashMap<String, DataRowHandler>();
+
+      mDataRowHandlers.put(Email.CONTENT_ITEM_TYPE, new EmailDataRowHandler());
+      mDataRowHandlers.put(Im.CONTENT_ITEM_TYPE,
+              new CommonDataRowHandler(Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL));
+      mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new CommonDataRowHandler(
+              StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, StructuredPostal.LABEL));
+      mDataRowHandlers.put(Organization.CONTENT_ITEM_TYPE, new OrganizationDataRowHandler());
+      mDataRowHandlers.put(Phone.CONTENT_ITEM_TYPE, new PhoneDataRowHandler());
+      mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new NicknameDataRowHandler());
+      mDataRowHandlers.put(StructuredName.CONTENT_ITEM_TYPE,
+              new StructuredNameRowHandler(mNameSplitter));
+      mDataRowHandlers.put(StructuredPostal.CONTENT_ITEM_TYPE,
+              new StructuredPostalRowHandler(mPostalSplitter));
+      mDataRowHandlers.put(GroupMembership.CONTENT_ITEM_TYPE, new GroupMembershipRowHandler());
+      mDataRowHandlers.put(Photo.CONTENT_ITEM_TYPE, new PhotoDataRowHandler());
+    }
     /**
      * Visible for testing.
      */
@@ -2020,6 +2022,7 @@
         mPostalSplitter = new PostalSplitter(mCurrentLocale);
         mCommonNicknameCache = new CommonNicknameCache(mDbHelper.getReadableDatabase());
         ContactLocaleUtils.getIntance().setLocale(mCurrentLocale);
+        initDataRowHandlers();
     }
 
     @Override
@@ -2879,10 +2882,11 @@
                 }
                 displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle);
             }
-            if (displayNameStyle == FullNameStyle.CHINESE) {
+            if (displayNameStyle == FullNameStyle.CHINESE ||
+                    displayNameStyle == FullNameStyle.CJK) {
                 sortKeyPrimary = sortKeyAlternative =
                         ContactLocaleUtils.getIntance().getSortKey(
-                                displayNamePrimary, FullNameStyle.CHINESE);
+                                displayNamePrimary, displayNameStyle);
             }
         }
 
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java
index f47b490..3f9bc86 100644
--- a/src/com/android/providers/contacts/NameSplitter.java
+++ b/src/com/android/providers/contacts/NameSplitter.java
@@ -480,32 +480,6 @@
     }
 
     /**
-     * Given a name in Chinese, returns a Pinyin representation.
-     */
-    public String convertHanziToPinyin(String name) {
-
-        // TODO: move this code to HanziToPinyin and optimize
-        ArrayList<Token> tokens = HanziToPinyin.getInstance().get(name);
-        if (tokens != null) {
-            int size = tokens.size();
-            if (size != 0) {
-                StringBuilder sb = new StringBuilder();
-                for (int i = 0; i < size; i++) {
-                    String pinyin = tokens.get(i).target;
-                    if (!TextUtils.isEmpty(pinyin)) {
-                        if (sb.length() != 0) {
-                            sb.append(' ');
-                        }
-                        sb.append(pinyin);
-                    }
-                }
-                return sb.toString();
-            }
-        }
-        return null;
-    }
-
-    /**
      * Concatenates parts of a full name inserting spaces and commas as specified.
      */
     private String join(String part1, String part2, String part3, String suffix,
@@ -805,9 +779,6 @@
      */
     public void guessNameStyle(Name name) {
         guessFullNameStyle(name);
-        if (FullNameStyle.CJK == name.fullNameStyle) {
-            name.fullNameStyle = getAdjustedFullNameStyle(name.fullNameStyle);
-        }
         guessPhoneticNameStyle(name);
         name.fullNameStyle = getAdjustedNameStyleBasedOnPhoneticNameStyle(name.fullNameStyle,
                 name.phoneticNameStyle);
