diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp
index dba0241cf9c0c204a75f42c9979f8b8884f9e124..5c094772b8c3e090ab324a5f75770f6397fdd2ec 100644
--- a/src/corelib/tools/qchar.cpp
+++ b/src/corelib/tools/qchar.cpp
@@ -377,6 +377,29 @@ QT_BEGIN_NAMESPACE
     \value Script_Sharada
     \value Script_SoraSompeng
     \value Script_Takri
+    \value Script_CaucasianAlbanian
+    \value Script_BassaVah
+    \value Script_Duployan
+    \value Script_Elbasan
+    \value Script_Grantha
+    \value Script_PahawhHmong
+    \value Script_Khojki
+    \value Script_LinearA
+    \value Script_Mahajani
+    \value Script_Manichaean
+    \value Script_MendeKikakui
+    \value Script_Modi
+    \value Script_Mro
+    \value Script_OldNorthArabian
+    \value Script_Nabataean
+    \value Script_Palmyrene
+    \value Script_PauCinHau
+    \value Script_OldPermic
+    \value Script_PsalterPahlavi
+    \value Script_Siddham
+    \value Script_Khudawadi
+    \value Script_Tirhuta
+    \value Script_WarangCiti
 
     \omitvalue ScriptCount
 
diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h
index 5630642fc97854fcb81cbc21f3684b0ff05eb6b8..97e2aa70886c2aa1d6f066c3f923c66a22078589 100644
--- a/src/corelib/tools/qchar.h
+++ b/src/corelib/tools/qchar.h
@@ -250,6 +250,31 @@ public:
         Script_SoraSompeng,
         Script_Takri,
 
+        // Unicode 7.0 additions
+        Script_CaucasianAlbanian,
+        Script_BassaVah,
+        Script_Duployan,
+        Script_Elbasan,
+        Script_Grantha,
+        Script_PahawhHmong,
+        Script_Khojki,
+        Script_LinearA,
+        Script_Mahajani,
+        Script_Manichaean,
+        Script_MendeKikakui,
+        Script_Modi,
+        Script_Mro,
+        Script_OldNorthArabian,
+        Script_Nabataean,
+        Script_Palmyrene,
+        Script_PauCinHau,
+        Script_OldPermic,
+        Script_PsalterPahlavi,
+        Script_Siddham,
+        Script_Khudawadi,
+        Script_Tirhuta,
+        Script_WarangCiti,
+
         ScriptCount
     };
 
@@ -339,7 +364,8 @@ public:
         Unicode_6_0,
         Unicode_6_1,
         Unicode_6_2,
-        Unicode_6_3
+        Unicode_6_3,
+        Unicode_7_0
     };
     // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
 
diff --git a/src/corelib/tools/qunicodetools.cpp b/src/corelib/tools/qunicodetools.cpp
index bce5a75d9e365ebfaa7a79735be7d651faf0ff15..56576c69f1d3cd79722f5e3905a6e1af51ddcf0b 100644
--- a/src/corelib/tools/qunicodetools.cpp
+++ b/src/corelib/tools/qunicodetools.cpp
@@ -49,7 +49,7 @@ namespace QUnicodeTools {
 // -----------------------------------------------------------------------------------------------------
 //
 // The text boundaries determination algorithm.
-// See http://www.unicode.org/reports/tr29/tr29-23.html
+// See http://www.unicode.org/reports/tr29/tr29-25.html
 //
 // -----------------------------------------------------------------------------------------------------
 
@@ -341,7 +341,7 @@ static void getSentenceBreaks(const ushort *string, quint32 len, QCharAttributes
 // -----------------------------------------------------------------------------------------------------
 //
 // The line breaking algorithm.
-// See http://www.unicode.org/reports/tr14/tr14-32.html
+// See http://www.unicode.org/reports/tr14/tr14-33.html
 //
 // -----------------------------------------------------------------------------------------------------
 
@@ -659,7 +659,7 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
 
 // ----------------------------------------------------------------------------
 //
-// The Unicode script property. See http://www.unicode.org/reports/tr24/tr24-21.html
+// The Unicode script property. See http://www.unicode.org/reports/tr24/tr24-22.html
 //
 // ----------------------------------------------------------------------------
 
diff --git a/src/gui/text/qharfbuzzng.cpp b/src/gui/text/qharfbuzzng.cpp
index 4baf1fd03ca0dcef07e0ec18aee9ce4a49e10604..102c62ea8ae455751f1d457fe6b9fa4750a035bd 100644
--- a/src/gui/text/qharfbuzzng.cpp
+++ b/src/gui/text/qharfbuzzng.cpp
@@ -94,6 +94,8 @@ static const hb_script_t _qtscript_to_hbscript[] = {
     HB_SCRIPT_BUHID,
     HB_SCRIPT_TAGBANWA,
     HB_SCRIPT_COPTIC,
+
+    // Unicode 4.0 additions
     HB_SCRIPT_LIMBU,
     HB_SCRIPT_TAI_LE,
     HB_SCRIPT_LINEAR_B,
@@ -102,6 +104,8 @@ static const hb_script_t _qtscript_to_hbscript[] = {
     HB_SCRIPT_OSMANYA,
     HB_SCRIPT_CYPRIOT,
     HB_SCRIPT_BRAILLE,
+
+    // Unicode 4.1 additions
     HB_SCRIPT_BUGINESE,
     HB_SCRIPT_NEW_TAI_LUE,
     HB_SCRIPT_GLAGOLITIC,
@@ -109,11 +113,15 @@ static const hb_script_t _qtscript_to_hbscript[] = {
     HB_SCRIPT_SYLOTI_NAGRI,
     HB_SCRIPT_OLD_PERSIAN,
     HB_SCRIPT_KHAROSHTHI,
+
+    // Unicode 5.0 additions
     HB_SCRIPT_BALINESE,
     HB_SCRIPT_CUNEIFORM,
     HB_SCRIPT_PHOENICIAN,
     HB_SCRIPT_PHAGS_PA,
     HB_SCRIPT_NKO,
+
+    // Unicode 5.1 additions
     HB_SCRIPT_SUNDANESE,
     HB_SCRIPT_LEPCHA,
     HB_SCRIPT_OL_CHIKI,
@@ -125,6 +133,8 @@ static const hb_script_t _qtscript_to_hbscript[] = {
     HB_SCRIPT_CARIAN,
     HB_SCRIPT_LYDIAN,
     HB_SCRIPT_CHAM,
+
+    // Unicode 5.2 additions
     HB_SCRIPT_TAI_THAM,
     HB_SCRIPT_TAI_VIET,
     HB_SCRIPT_AVESTAN,
@@ -140,16 +150,45 @@ static const hb_script_t _qtscript_to_hbscript[] = {
     HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
     HB_SCRIPT_OLD_TURKIC,
     HB_SCRIPT_KAITHI,
+
+    // Unicode 6.0 additions
     HB_SCRIPT_BATAK,
     HB_SCRIPT_BRAHMI,
     HB_SCRIPT_MANDAIC,
+
+    // Unicode 6.1 additions
     HB_SCRIPT_CHAKMA,
     HB_SCRIPT_MEROITIC_CURSIVE,
     HB_SCRIPT_MEROITIC_HIEROGLYPHS,
     HB_SCRIPT_MIAO,
     HB_SCRIPT_SHARADA,
     HB_SCRIPT_SORA_SOMPENG,
-    HB_SCRIPT_TAKRI
+    HB_SCRIPT_TAKRI,
+
+    // Unicode 7.0 additions
+    HB_SCRIPT_CAUCASIAN_ALBANIAN,
+    HB_SCRIPT_BASSA_VAH,
+    HB_SCRIPT_DUPLOYAN,
+    HB_SCRIPT_ELBASAN,
+    HB_SCRIPT_GRANTHA,
+    HB_SCRIPT_PAHAWH_HMONG,
+    HB_SCRIPT_KHOJKI,
+    HB_SCRIPT_LINEAR_A,
+    HB_SCRIPT_MAHAJANI,
+    HB_SCRIPT_MANICHAEAN,
+    HB_SCRIPT_MENDE_KIKAKUI,
+    HB_SCRIPT_MODI,
+    HB_SCRIPT_MRO,
+    HB_SCRIPT_OLD_NORTH_ARABIAN,
+    HB_SCRIPT_NABATAEAN,
+    HB_SCRIPT_PALMYRENE,
+    HB_SCRIPT_PAU_CIN_HAU,
+    HB_SCRIPT_OLD_PERMIC,
+    HB_SCRIPT_PSALTER_PAHLAVI,
+    HB_SCRIPT_SIDDHAM,
+    HB_SCRIPT_KHUDAWADI,
+    HB_SCRIPT_TIRHUTA,
+    HB_SCRIPT_WARANG_CITI
 };
 Q_STATIC_ASSERT(QChar::ScriptCount == sizeof(_qtscript_to_hbscript) / sizeof(_qtscript_to_hbscript[0]));
 
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 873f6b37d999a4fc42071f2e8fbafff0a9b18b5a..10a61d3c84e5b9f68c74369d6f92d0fc82ca5486 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -881,16 +881,22 @@ static inline void qt_getJustificationOpportunities(const ushort *string, int le
     int spaceAs;
 
     switch (si.analysis.script) {
+    case QChar::Script_Arabic:
+    case QChar::Script_Syriac:
     case QChar::Script_Nko:
     case QChar::Script_Mandaic:
     case QChar::Script_Mongolian:
     case QChar::Script_PhagsPa:
+    case QChar::Script_Manichaean:
+    case QChar::Script_PsalterPahlavi:
         // same as default but inter character justification takes precedence
         spaceAs = Justification_Arabic_Space;
         break;
 
+    case QChar::Script_Tibetan:
     case QChar::Script_Hiragana:
     case QChar::Script_Katakana:
+    case QChar::Script_Bopomofo:
     case QChar::Script_Han:
         // same as default but inter character justification is the only option
         spaceAs = Justification_Character;
@@ -1630,10 +1636,10 @@ void QTextEngine::itemize() const
         for (int i = 0; i < length; ++i) {
             switch (analysis[i].script) {
             case QChar::Script_Latin:
-            case QChar::Script_Han:
             case QChar::Script_Hiragana:
             case QChar::Script_Katakana:
             case QChar::Script_Bopomofo:
+            case QChar::Script_Han:
                 analysis[i].script = QChar::Script_Common;
                 break;
             default:
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index bd22a8fce50073e566a017e8a3f7284aa3a0bb4c..112bb8e0a638dcb26ea11c963e7ea45d88a56f78 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -218,7 +218,30 @@ static const char *specialLanguages[] = {
     "hmd", // Miao
     "sa", // Sharada
     "srb", // SoraSompeng
-    "doi"  // Takri
+    "doi", // Takri
+    "lez", // CaucasianAlbanian
+    "bsq", // BassaVah
+    "fr", // Duployan
+    "sq", // Elbasan
+    "sa", // Grantha
+    "hnj", // PahawhHmong
+    "sd", // Khojki
+    "lab", // LinearA
+    "hi", // Mahajani
+    "xmn", // Manichaean
+    "men", // MendeKikakui
+    "mr", // Modi
+    "mru", // Mro
+    "xna", // OldNorthArabian
+    "arc", // Nabataean
+    "arc", // Palmyrene
+    "ctd", // PauCinHau
+    "kv", // OldPermic
+    "pal", // PsalterPahlavi
+    "sa", // Siddham
+    "sd", // Khudawadi
+    "mai", // Tirhuta
+    "hoc"  // WarangCiti
 };
 Q_STATIC_ASSERT(sizeof(specialLanguages) / sizeof(const char *) == QChar::ScriptCount);
 
diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
index 4e882263bf283e48ec1d95571d7714a5927d1205..f80d6e6d9353c19f37fa2d91fd8c1edfb1363174 100644
--- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp
+++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
@@ -135,6 +135,8 @@ void tst_QChar::toUpper()
     QVERIFY(QChar(0x1c7).toUpper().unicode() == 0x1c7);
     QVERIFY(QChar(0x1c8).toUpper().unicode() == 0x1c7);
     QVERIFY(QChar(0x1c9).toUpper().unicode() == 0x1c7);
+    QVERIFY(QChar(0x25c).toUpper().unicode() == 0xa7ab);
+    QVERIFY(QChar(0x29e).toUpper().unicode() == 0xa7b0);
     QVERIFY(QChar(0x1d79).toUpper().unicode() == 0xa77d);
     QVERIFY(QChar(0x0265).toUpper().unicode() == 0xa78d);
 
@@ -144,6 +146,8 @@ void tst_QChar::toUpper()
     QVERIFY(QChar::toUpper(0x1c7) == 0x1c7);
     QVERIFY(QChar::toUpper(0x1c8) == 0x1c7);
     QVERIFY(QChar::toUpper(0x1c9) == 0x1c7);
+    QVERIFY(QChar::toUpper(0x25c) == 0xa7ab);
+    QVERIFY(QChar::toUpper(0x29e) == 0xa7b0);
     QVERIFY(QChar::toUpper(0x1d79) == 0xa77d);
     QVERIFY(QChar::toUpper(0x0265) == 0xa78d);
 
@@ -160,6 +164,8 @@ void tst_QChar::toLower()
     QVERIFY(QChar(0x1c9).toLower().unicode() == 0x1c9);
     QVERIFY(QChar(0xa77d).toLower().unicode() == 0x1d79);
     QVERIFY(QChar(0xa78d).toLower().unicode() == 0x0265);
+    QVERIFY(QChar(0xa7ab).toLower().unicode() == 0x25c);
+    QVERIFY(QChar(0xa7b1).toLower().unicode() == 0x287);
 
     QVERIFY(QChar::toLower('a') == 'a');
     QVERIFY(QChar::toLower('A') == 'a');
@@ -168,6 +174,8 @@ void tst_QChar::toLower()
     QVERIFY(QChar::toLower(0x1c9) == 0x1c9);
     QVERIFY(QChar::toLower(0xa77d) == 0x1d79);
     QVERIFY(QChar::toLower(0xa78d) == 0x0265);
+    QVERIFY(QChar::toLower(0xa7ab) == 0x25c);
+    QVERIFY(QChar::toLower(0xa7b1) == 0x287);
 
     QVERIFY(QChar::toLower(0x10400) == 0x10428);
     QVERIFY(QChar::toLower(0x10428) == 0x10428);
@@ -205,6 +213,8 @@ void tst_QChar::toCaseFolded()
     QVERIFY(QChar(0x1c9).toCaseFolded().unicode() == 0x1c9);
     QVERIFY(QChar(0xa77d).toCaseFolded().unicode() == 0x1d79);
     QVERIFY(QChar(0xa78d).toCaseFolded().unicode() == 0x0265);
+    QVERIFY(QChar(0xa7ab).toCaseFolded().unicode() == 0x25c);
+    QVERIFY(QChar(0xa7b1).toCaseFolded().unicode() == 0x287);
 
     QVERIFY(QChar::toCaseFolded('a') == 'a');
     QVERIFY(QChar::toCaseFolded('A') == 'a');
@@ -213,6 +223,8 @@ void tst_QChar::toCaseFolded()
     QVERIFY(QChar::toCaseFolded(0x1c9) == 0x1c9);
     QVERIFY(QChar::toCaseFolded(0xa77d) == 0x1d79);
     QVERIFY(QChar::toCaseFolded(0xa78d) == 0x0265);
+    QVERIFY(QChar::toCaseFolded(0xa7ab) == 0x25c);
+    QVERIFY(QChar::toCaseFolded(0xa7b1) == 0x287);
 
     QVERIFY(QChar::toCaseFolded(0x10400) == 0x10428);
     QVERIFY(QChar::toCaseFolded(0x10428) == 0x10428);
@@ -341,6 +353,7 @@ void tst_QChar::isPrint()
     QVERIFY(QChar(0x1e9e).isPrint()); // assigned in 5.1
     QVERIFY(QChar::isPrint(0x1b000)); // assigned in 6.0
     QVERIFY(QChar::isPrint(0x110d0)); // assigned in 5.1
+    QVERIFY(!QChar::isPrint(0x1bca0)); // assigned in 7.0
 }
 
 void tst_QChar::isUpper()
@@ -471,6 +484,7 @@ void tst_QChar::joiningType()
     QVERIFY(QChar(0x0627).joiningType() == QChar::Joining_Right);
     QVERIFY(QChar(0x05d0).joiningType() == QChar::Joining_None);
     QVERIFY(QChar(0x00ad).joiningType() == QChar::Joining_Transparent);
+    QVERIFY(QChar(0xA872).joiningType() == QChar::Joining_Left);
 
     QVERIFY(QChar::joiningType('a') == QChar::Joining_None);
     QVERIFY(QChar::joiningType('0') == QChar::Joining_None);
@@ -484,6 +498,8 @@ void tst_QChar::joiningType()
     QVERIFY(QChar::joiningType(0x2FA17) == QChar::Joining_None);
 
     QVERIFY(QChar::joiningType(0xA872) == QChar::Joining_Left);
+    QVERIFY(QChar::joiningType(0x10ACD) == QChar::Joining_Left);
+    QVERIFY(QChar::joiningType(0x10AD7) == QChar::Joining_Left);
 }
 
 void tst_QChar::combiningClass()
@@ -574,6 +590,10 @@ void tst_QChar::unicodeVersion()
     QVERIFY(QChar(0x061c).unicodeVersion() == QChar::Unicode_6_3);
     QVERIFY(QChar::unicodeVersion(0x061c) == QChar::Unicode_6_3);
 
+    QVERIFY(QChar(0x20bd).unicodeVersion() == QChar::Unicode_7_0);
+    QVERIFY(QChar::unicodeVersion(0x20bd) == QChar::Unicode_7_0);
+    QVERIFY(QChar::unicodeVersion(0x16b00) == QChar::Unicode_7_0);
+
     QVERIFY(QChar(0x09ff).unicodeVersion() == QChar::Unicode_Unassigned);
     QVERIFY(QChar::unicodeVersion(0x09ff) == QChar::Unicode_Unassigned);
     QVERIFY(QChar::unicodeVersion(0x110000) == QChar::Unicode_Unassigned);
diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp
index af193c3bc21d09b18a615cd452edfd6778f377ed..2f6e28bd9fb6e32e9eba033f26f2ad0b85b8423a 100644
--- a/util/unicode/main.cpp
+++ b/util/unicode/main.cpp
@@ -43,8 +43,8 @@
 #include <private/qunicodetables_p.h>
 #endif
 
-#define DATA_VERSION_S "6.3"
-#define DATA_VERSION_STR "QChar::Unicode_6_3"
+#define DATA_VERSION_S "7.0"
+#define DATA_VERSION_STR "QChar::Unicode_7_0"
 
 
 static QHash<QByteArray, QChar::UnicodeVersion> age_map;
@@ -70,6 +70,7 @@ static void initAgeMap()
         { QChar::Unicode_6_1,   "6.1" },
         { QChar::Unicode_6_2,   "6.2" },
         { QChar::Unicode_6_3,   "6.3" },
+        { QChar::Unicode_7_0,   "7.0" },
         { QChar::Unicode_Unassigned, 0 }
     };
     AgeMap *d = ageMap;
@@ -694,6 +695,30 @@ static void initScriptMap()
         { QChar::Script_Sharada,                "Sharada" },
         { QChar::Script_SoraSompeng,            "SoraSompeng" },
         { QChar::Script_Takri,                  "Takri" },
+        // 7.0
+        { QChar::Script_CaucasianAlbanian,      "CaucasianAlbanian" },
+        { QChar::Script_BassaVah,               "BassaVah" },
+        { QChar::Script_Duployan,               "Duployan" },
+        { QChar::Script_Elbasan,                "Elbasan" },
+        { QChar::Script_Grantha,                "Grantha" },
+        { QChar::Script_PahawhHmong,            "PahawhHmong" },
+        { QChar::Script_Khojki,                 "Khojki" },
+        { QChar::Script_LinearA,                "LinearA" },
+        { QChar::Script_Mahajani,               "Mahajani" },
+        { QChar::Script_Manichaean,             "Manichaean" },
+        { QChar::Script_MendeKikakui,           "MendeKikakui" },
+        { QChar::Script_Modi,                   "Modi" },
+        { QChar::Script_Mro,                    "Mro" },
+        { QChar::Script_OldNorthArabian,        "OldNorthArabian" },
+        { QChar::Script_Nabataean,              "Nabataean" },
+        { QChar::Script_Palmyrene,              "Palmyrene" },
+        { QChar::Script_PauCinHau,              "PauCinHau" },
+        { QChar::Script_OldPermic,              "OldPermic" },
+        { QChar::Script_PsalterPahlavi,         "PsalterPahlavi" },
+        { QChar::Script_Siddham,                "Siddham" },
+        { QChar::Script_Khudawadi,              "Khudawadi" },
+        { QChar::Script_Tirhuta,                "Tirhuta" },
+        { QChar::Script_WarangCiti,             "WarangCiti" },
         // unhandled
         { QChar::Script_Unknown,                0 }
     };
@@ -712,23 +737,23 @@ static const char *property_string =
     "    ushort direction           : 8; /* 5 used */\n"
     "    ushort combiningClass      : 8;\n"
     "    ushort joining             : 3;\n"
-    "    signed short digitValue    : 5; /* 5 used */\n"
+    "    signed short digitValue    : 5;\n"
     "    signed short mirrorDiff    : 16;\n"
-    "    signed short lowerCaseDiff : 16;\n"
-    "    signed short upperCaseDiff : 16;\n"
-    "    signed short titleCaseDiff : 16;\n"
-    "    signed short caseFoldDiff  : 16;\n"
     "    ushort lowerCaseSpecial    : 1;\n"
+    "    signed short lowerCaseDiff : 15;\n"
     "    ushort upperCaseSpecial    : 1;\n"
+    "    signed short upperCaseDiff : 15;\n"
     "    ushort titleCaseSpecial    : 1;\n"
+    "    signed short titleCaseDiff : 15;\n"
     "    ushort caseFoldSpecial     : 1;\n"
-    "    ushort unicodeVersion      : 4;\n"
+    "    signed short caseFoldDiff  : 15;\n"
+    "    ushort unicodeVersion      : 8; /* 5 used */\n"
     "    ushort nfQuickCheck        : 8;\n" // could be narrowed
     "    ushort graphemeBreakClass  : 4; /* 4 used */\n"
     "    ushort wordBreakClass      : 4; /* 4 used */\n"
     "    ushort sentenceBreakClass  : 8; /* 4 used */\n"
     "    ushort lineBreakClass      : 8; /* 6 used */\n"
-    "    ushort script              : 8; /* 7 used */\n"
+    "    ushort script              : 8;\n"
     "};\n\n"
     "Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4) Q_DECL_NOTHROW;\n"
     "Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2) Q_DECL_NOTHROW;\n"
@@ -786,7 +811,7 @@ struct PropertyFlags {
     // from ArabicShaping.txt
     QChar::JoiningType joining : 3;
     // from DerivedAge.txt
-    QChar::UnicodeVersion age : 4;
+    QChar::UnicodeVersion age : 5;
     int digitValue;
 
     int mirrorDiff : 16;
@@ -849,6 +874,7 @@ static int appendToSpecialCaseMap(const QList<int> &map)
     return pos;
 }
 
+// DerivedCoreProperties.txt
 static inline bool isDefaultIgnorable(uint ucs4)
 {
     // Default_Ignorable_Code_Point:
@@ -860,9 +886,11 @@ static inline bool isDefaultIgnorable(uint ucs4)
         return ucs4 == 0xad;
 
     return ucs4 == 0x034f
+            || ucs4 == 0x061c
             || (ucs4 >= 0x115f && ucs4 <= 0x1160)
             || (ucs4 >= 0x17b4 && ucs4 <= 0x17b5)
             || (ucs4 >= 0x180b && ucs4 <= 0x180d)
+            || ucs4 == 0x180e
             || (ucs4 >= 0x200b && ucs4 <= 0x200f)
             || (ucs4 >= 0x202a && ucs4 <= 0x202e)
             || (ucs4 >= 0x2060 && ucs4 <= 0x206f)
@@ -871,7 +899,9 @@ static inline bool isDefaultIgnorable(uint ucs4)
             || ucs4 == 0xfeff
             || ucs4 == 0xffa0
             || (ucs4 >= 0xfff0 && ucs4 <= 0xfff8)
-            || (ucs4 >= 0x1d173 && ucs4 <= 0xe0fff && (ucs4 <= 0x1d17a || ucs4 >= 0xe0000));
+            || (ucs4 >= 0x1bca0 && ucs4 <= 0x1bca3)
+            || (ucs4 >= 0x1d173 && ucs4 <= 0x1d17a)
+            || (ucs4 >= 0xe0000 && ucs4 <= 0xe0fff);
 }
 
 struct UnicodeData {
@@ -1092,7 +1122,7 @@ static void readUnicodeData()
             int upperCase = properties[UD_UpperCase].toInt(&ok, 16);
             Q_ASSERT(ok);
             int diff = upperCase - codepoint;
-            if (qAbs(diff) >= (1<<14)) {
+            if (qAbs(diff) >= (1<<13)) {
                 qWarning() << "upperCaseDiff exceeded (" << hex << codepoint << "->" << upperCase << "); map it for special case";
                 // if the condition below doesn't hold anymore we need to modify our special upper casing code in qchar.cpp
                 Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(upperCase));
@@ -1112,7 +1142,7 @@ static void readUnicodeData()
             int lowerCase = properties[UD_LowerCase].toInt(&ok, 16);
             Q_ASSERT(ok);
             int diff = lowerCase - codepoint;
-            if (qAbs(diff) >= (1<<14)) {
+            if (qAbs(diff) >= (1<<13)) {
                 qWarning() << "lowerCaseDiff exceeded (" << hex << codepoint << "->" << lowerCase << "); map it for special case";
                 // if the condition below doesn't hold anymore we need to modify our special lower casing code in qchar.cpp
                 Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(lowerCase));
@@ -1135,7 +1165,7 @@ static void readUnicodeData()
             int titleCase = properties[UD_TitleCase].toInt(&ok, 16);
             Q_ASSERT(ok);
             int diff = titleCase - codepoint;
-            if (qAbs(diff) >= (1<<14)) {
+            if (qAbs(diff) >= (1<<13)) {
                 qWarning() << "titleCaseDiff exceeded (" << hex << codepoint << "->" << titleCase << "); map it for special case";
                 // if the condition below doesn't hold anymore we need to modify our special title casing code in qchar.cpp
                 Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(titleCase));
@@ -1701,7 +1731,7 @@ static void readCaseFolding()
         if (foldMap.size() == 1) {
             int caseFolded = foldMap.at(0);
             int diff = caseFolded - codepoint;
-            if (qAbs(diff) >= (1<<14)) {
+            if (qAbs(diff) >= (1<<13)) {
                 qWarning() << "caseFoldDiff exceeded (" << hex << codepoint << "->" << caseFolded << "); map it for special case";
                 // if the condition below doesn't hold anymore we need to modify our special case folding code in qchar.cpp
                 Q_ASSERT(!QChar::requiresSurrogates(codepoint) && !QChar::requiresSurrogates(caseFolded));
@@ -2182,10 +2212,10 @@ static QByteArray createPropertyInfo()
 
     // we reserve one bit more than in the assert below for the sign
     Q_ASSERT(maxMirroredDiff < (1<<12));
-    Q_ASSERT(maxLowerCaseDiff < (1<<14));
-    Q_ASSERT(maxUpperCaseDiff < (1<<14));
-    Q_ASSERT(maxTitleCaseDiff < (1<<14));
-    Q_ASSERT(maxCaseFoldDiff < (1<<14));
+    Q_ASSERT(maxLowerCaseDiff < (1<<13));
+    Q_ASSERT(maxUpperCaseDiff < (1<<13));
+    Q_ASSERT(maxTitleCaseDiff < (1<<13));
+    Q_ASSERT(maxCaseFoldDiff < (1<<13));
 
     const int BMP_BLOCKSIZE = 32;
     const int BMP_SHIFT = 5;
@@ -2337,37 +2367,37 @@ static QByteArray createPropertyInfo()
 //     "        ushort joining             : 3;\n"
         out += QByteArray::number( p.joining );
         out += ", ";
-//     "        signed short digitValue    : 5; /* 5 used */\n"
+//     "        signed short digitValue    : 5;\n"
         out += QByteArray::number( p.digitValue );
         out += ", ";
 //     "        signed short mirrorDiff    : 16;\n"
-//     "        signed short lowerCaseDiff : 16;\n"
-//     "        signed short upperCaseDiff : 16;\n"
-//     "        signed short titleCaseDiff : 16;\n"
-//     "        signed short caseFoldDiff  : 16;\n"
         out += QByteArray::number( p.mirrorDiff );
         out += ", ";
-        out += QByteArray::number( p.lowerCaseDiff );
-        out += ", ";
-        out += QByteArray::number( p.upperCaseDiff );
-        out += ", ";
-        out += QByteArray::number( p.titleCaseDiff );
-        out += ", ";
-        out += QByteArray::number( p.caseFoldDiff );
-        out += ", ";
 //     "        ushort lowerCaseSpecial    : 1;\n"
-//     "        ushort upperCaseSpecial    : 1;\n"
-//     "        ushort titleCaseSpecial    : 1;\n"
-//     "        ushort caseFoldSpecial     : 1;\n"
+//     "        signed short lowerCaseDiff : 15;\n"
         out += QByteArray::number( p.lowerCaseSpecial );
         out += ", ";
+        out += QByteArray::number( p.lowerCaseDiff );
+        out += ", ";
+//     "        ushort upperCaseSpecial    : 1;\n"
+//     "        signed short upperCaseDiff : 15;\n"
         out += QByteArray::number( p.upperCaseSpecial );
         out += ", ";
+        out += QByteArray::number( p.upperCaseDiff );
+        out += ", ";
+//     "        ushort titleCaseSpecial    : 1;\n"
+//     "        signed short titleCaseDiff : 15;\n"
         out += QByteArray::number( p.titleCaseSpecial );
         out += ", ";
+        out += QByteArray::number( p.titleCaseDiff );
+        out += ", ";
+//     "        ushort caseFoldSpecial     : 1;\n"
+//     "        signed short caseFoldDiff  : 15;\n"
         out += QByteArray::number( p.caseFoldSpecial );
         out += ", ";
-//     "        ushort unicodeVersion      : 4;\n"
+        out += QByteArray::number( p.caseFoldDiff );
+        out += ", ";
+//     "        ushort unicodeVersion      : 8; /* 5 used */\n"
         out += QByteArray::number( p.age );
         out += ", ";
 //     "    ushort nfQuickCheck        : 8;\n"
@@ -2385,7 +2415,7 @@ static QByteArray createPropertyInfo()
         out += ", ";
         out += QByteArray::number( p.lineBreakClass );
         out += ", ";
-//     "        ushort script              : 8; /* 7 used */\n"
+//     "        ushort script              : 8;\n"
         out += QByteArray::number( p.script );
         out += " },";
     }