Put the flags back in and serialize clusters.

Note that now JSON glyph buffers and Unicode buffers look very similar, except for the g/u property difference.
diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh
index 285d898..64fac02 100644
--- a/src/hb-buffer-deserialize-json.hh
+++ b/src/hb-buffer-deserialize-json.hh
@@ -34,33 +34,33 @@
 
 #line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
-	0u, 0u, 9u, 123u, 9u, 93u, 9u, 44u, 9u, 57u, 9u, 93u, 9u, 34u, 97u, 103u, 
-	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 123u, 
-	9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 108u, 108u, 
-	34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 120u, 121u, 34u, 34u, 9u, 58u, 
-	9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
-	9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 65u, 122u, 34u, 122u, 9u, 125u, 
-	9u, 125u, 9u, 57u, 0u, 0u, 9u, 93u, 9u, 123u, 0
+	0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
+	48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
+	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
+	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
+	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
+	65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 93u, 
+	9u, 123u, 0u, 0u, 0
 };
 
 static const char _deserialize_json_key_spans[] = {
-	0, 115, 85, 36, 49, 85, 26, 7, 
-	2, 1, 50, 49, 10, 117, 117, 115, 
-	117, 1, 50, 49, 10, 117, 117, 1, 
-	1, 50, 49, 117, 117, 2, 1, 50, 
-	49, 10, 117, 117, 1, 50, 49, 10, 
-	117, 117, 1, 50, 49, 58, 89, 117, 
-	117, 49, 0, 85, 115
+	0, 115, 26, 21, 2, 1, 50, 49, 
+	10, 117, 117, 117, 1, 50, 49, 10, 
+	117, 117, 1, 1, 50, 49, 117, 117, 
+	2, 1, 50, 49, 10, 117, 117, 1, 
+	50, 49, 10, 117, 117, 1, 50, 49, 
+	58, 89, 117, 117, 1, 50, 49, 85, 
+	115, 0
 };
 
 static const short _deserialize_json_index_offsets[] = {
-	0, 0, 116, 202, 239, 289, 375, 402, 
-	410, 413, 415, 466, 516, 527, 645, 763, 
-	879, 997, 999, 1050, 1100, 1111, 1229, 1347, 
-	1349, 1351, 1402, 1452, 1570, 1688, 1691, 1693, 
-	1744, 1794, 1805, 1923, 2041, 2043, 2094, 2144, 
-	2155, 2273, 2391, 2393, 2444, 2494, 2553, 2643, 
-	2761, 2879, 2929, 2930, 3016
+	0, 0, 116, 143, 165, 168, 170, 221, 
+	271, 282, 400, 518, 636, 638, 689, 739, 
+	750, 868, 986, 988, 990, 1041, 1091, 1209, 
+	1327, 1330, 1332, 1383, 1433, 1444, 1562, 1680, 
+	1682, 1733, 1783, 1794, 1912, 2030, 2032, 2083, 
+	2133, 2192, 2282, 2400, 2518, 2520, 2571, 2621, 
+	2707, 2823
 };
 
 static const char _deserialize_json_indicies[] = {
@@ -69,72 +69,56 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	0, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	2, 3, 3, 3, 3, 3, 3, 3, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 2, 1, 3, 3, 3, 
 	3, 3, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 3, 1, 4, 1, 
+	5, 1, 6, 7, 1, 1, 8, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 9, 1, 10, 11, 
+	1, 12, 1, 12, 12, 12, 12, 12, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 12, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 13, 1, 13, 13, 
+	13, 13, 13, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 13, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 14, 1, 1, 15, 16, 16, 
+	16, 16, 16, 16, 16, 16, 16, 1, 
+	17, 18, 18, 18, 18, 18, 18, 18, 
+	18, 18, 1, 19, 19, 19, 19, 19, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 19, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 20, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 4, 1, 5, 5, 5, 
-	5, 5, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 5, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	6, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 7, 1, 8, 8, 8, 8, 8, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 8, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 9, 1, 
-	9, 9, 9, 9, 9, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 9, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 2, 
-	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 1, 5, 5, 5, 5, 5, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 5, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 6, 1, 1, 
-	1, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 7, 1, 
-	11, 11, 11, 11, 11, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 11, 
-	1, 12, 1, 13, 1, 14, 15, 1, 
-	1, 16, 1, 17, 18, 1, 19, 1, 
-	19, 19, 19, 19, 19, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 19, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 20, 1, 20, 20, 20, 20, 20, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 20, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 21, 
-	1, 1, 22, 23, 23, 23, 23, 23, 
-	23, 23, 23, 23, 1, 24, 25, 25, 
-	25, 25, 25, 25, 25, 25, 25, 1, 
-	26, 26, 26, 26, 26, 1, 1, 1, 
+	1, 22, 22, 22, 22, 22, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 26, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 27, 1, 1, 1, 1, 
+	22, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 3, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -144,12 +128,13 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 28, 1, 29, 29, 
-	29, 29, 29, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 23, 1, 19, 
+	19, 19, 19, 19, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 29, 1, 1, 
+	1, 1, 1, 1, 1, 1, 19, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 11, 1, 1, 1, 1, 1, 1, 
+	1, 1, 20, 1, 1, 1, 18, 18, 
+	18, 18, 18, 18, 18, 18, 18, 18, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -158,293 +143,269 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 21, 1, 24, 1, 24, 
+	24, 24, 24, 24, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 30, 1, 31, 31, 31, 31, 
-	31, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 24, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 31, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	25, 1, 25, 25, 25, 25, 25, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 25, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 26, 1, 
+	1, 27, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 1, 29, 30, 30, 30, 
+	30, 30, 30, 30, 30, 30, 1, 31, 
+	31, 31, 31, 31, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 31, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 32, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 4, 1, 
-	26, 26, 26, 26, 26, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 26, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 27, 1, 1, 1, 25, 
-	25, 25, 25, 25, 25, 25, 25, 25, 
-	25, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 33, 1, 31, 31, 31, 
+	31, 31, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 31, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	32, 1, 1, 1, 30, 30, 30, 30, 
+	30, 30, 30, 30, 30, 30, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 28, 1, 32, 1, 
-	32, 32, 32, 32, 32, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 32, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 33, 1, 33, 33, 33, 33, 33, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 33, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 34, 
-	1, 1, 35, 36, 36, 36, 36, 36, 
-	36, 36, 36, 36, 1, 37, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 1, 
-	39, 39, 39, 39, 39, 1, 1, 1, 
+	1, 33, 1, 34, 1, 35, 1, 35, 
+	35, 35, 35, 35, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 39, 
+	1, 1, 1, 1, 1, 1, 35, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 40, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	36, 1, 36, 36, 36, 36, 36, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 36, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 37, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 1, 39, 39, 39, 39, 
+	39, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 39, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 40, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 41, 1, 39, 39, 
-	39, 39, 39, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 39, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 40, 1, 1, 1, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	41, 1, 39, 39, 39, 39, 39, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 39, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 40, 1, 1, 
+	1, 42, 42, 42, 42, 42, 42, 42, 
+	42, 42, 42, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 41, 1, 42, 1, 43, 1, 
-	43, 43, 43, 43, 43, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 43, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 44, 1, 44, 44, 44, 44, 44, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 41, 1, 
+	43, 44, 1, 45, 1, 45, 45, 45, 
+	45, 45, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 44, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 45, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 45, 46, 46, 46, 46, 46, 
-	46, 46, 46, 46, 1, 47, 47, 47, 
-	47, 47, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 47, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 46, 1, 
+	46, 46, 46, 46, 46, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	48, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 46, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 47, 1, 1, 48, 
+	49, 49, 49, 49, 49, 49, 49, 49, 
+	49, 1, 50, 51, 51, 51, 51, 51, 
+	51, 51, 51, 51, 1, 52, 52, 52, 
+	52, 52, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 52, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	53, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 49, 1, 47, 47, 47, 47, 47, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 47, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 48, 1, 
-	1, 1, 50, 50, 50, 50, 50, 50, 
-	50, 50, 50, 50, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 54, 1, 52, 52, 52, 52, 52, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 52, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 53, 1, 
+	1, 1, 51, 51, 51, 51, 51, 51, 
+	51, 51, 51, 51, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 49, 
-	1, 51, 52, 1, 53, 1, 53, 53, 
-	53, 53, 53, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 53, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 54, 
-	1, 54, 54, 54, 54, 54, 1, 1, 
+	1, 55, 1, 55, 55, 55, 55, 55, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	54, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 55, 1, 1, 
-	56, 57, 57, 57, 57, 57, 57, 57, 
-	57, 57, 1, 58, 59, 59, 59, 59, 
-	59, 59, 59, 59, 59, 1, 60, 60, 
-	60, 60, 60, 1, 1, 1, 1, 1, 
+	1, 1, 55, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 60, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 61, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 56, 1, 56, 56, 
+	56, 56, 56, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 56, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 57, 1, 1, 58, 59, 59, 
+	59, 59, 59, 59, 59, 59, 59, 1, 
+	60, 61, 61, 61, 61, 61, 61, 61, 
+	61, 61, 1, 62, 62, 62, 62, 62, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 62, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 63, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 62, 1, 60, 60, 60, 60, 
-	60, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 60, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 61, 
-	1, 1, 1, 59, 59, 59, 59, 59, 
-	59, 59, 59, 59, 59, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 64, 
+	1, 62, 62, 62, 62, 62, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	62, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 63, 1, 1, 1, 
+	61, 61, 61, 61, 61, 61, 61, 61, 
+	61, 61, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	62, 1, 63, 1, 63, 63, 63, 63, 
-	63, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 63, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 64, 1, 64, 
-	64, 64, 64, 64, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 64, 1, 
+	1, 1, 1, 1, 1, 64, 1, 65, 
+	1, 65, 65, 65, 65, 65, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 65, 1, 1, 66, 67, 
-	67, 67, 67, 67, 67, 67, 67, 67, 
-	1, 68, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 1, 70, 70, 70, 70, 
-	70, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 70, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 71, 
+	65, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 66, 1, 66, 66, 66, 66, 
+	66, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 66, 1, 67, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 68, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 1, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	1, 1, 1, 1, 1, 1, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	70, 70, 70, 70, 70, 70, 70, 70, 
+	1, 71, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 72, 72, 1, 72, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 1, 1, 1, 1, 1, 1, 1, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 1, 1, 1, 1, 72, 1, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 72, 72, 72, 72, 72, 72, 
+	72, 72, 1, 73, 73, 73, 73, 73, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 73, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 74, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	72, 1, 70, 70, 70, 70, 70, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 70, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 71, 1, 1, 
-	1, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 75, 
+	1, 73, 73, 73, 73, 73, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 72, 1, 
-	73, 1, 73, 73, 73, 73, 73, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 73, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 74, 1, 74, 74, 74, 
-	74, 74, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 74, 1, 75, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 76, 77, 77, 77, 
-	77, 77, 77, 77, 77, 77, 1, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 1, 1, 1, 1, 1, 1, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 1, 79, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 80, 80, 1, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 1, 1, 1, 1, 1, 1, 
-	1, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 1, 1, 1, 1, 80, 
-	1, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 80, 80, 80, 80, 80, 
-	80, 80, 80, 1, 81, 81, 81, 81, 
-	81, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 81, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 82, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
+	73, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 74, 1, 1, 1, 
+	76, 76, 76, 76, 76, 76, 76, 76, 
+	76, 76, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	83, 1, 81, 81, 81, 81, 81, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 81, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 82, 1, 1, 
-	1, 84, 84, 84, 84, 84, 84, 84, 
-	84, 84, 84, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 75, 1, 77, 
+	1, 77, 77, 77, 77, 77, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	77, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 83, 1, 
-	9, 9, 9, 9, 9, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 9, 
+	1, 1, 78, 1, 78, 78, 78, 78, 
+	78, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 2, 
-	3, 3, 3, 3, 3, 3, 3, 3, 
-	3, 1, 1, 85, 85, 85, 85, 85, 
+	1, 1, 1, 78, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 68, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 1, 79, 79, 
+	79, 79, 79, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 85, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 86, 1, 
+	1, 1, 1, 1, 1, 79, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 80, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 87, 
-	1, 31, 31, 31, 31, 31, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 81, 1, 0, 0, 0, 0, 
+	0, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	31, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 0, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -455,45 +416,46 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 4, 1, 0
+	1, 1, 1, 1, 1, 1, 2, 1, 
+	1, 0
 };
 
 static const char _deserialize_json_trans_targs[] = {
-	1, 0, 2, 5, 6, 3, 49, 50, 
-	3, 4, 5, 6, 7, 8, 23, 29, 
-	42, 9, 17, 10, 11, 12, 13, 16, 
-	13, 16, 14, 6, 51, 14, 51, 15, 
-	18, 19, 20, 21, 22, 21, 22, 14, 
-	6, 51, 24, 25, 26, 27, 28, 14, 
-	6, 51, 28, 30, 36, 31, 32, 33, 
-	34, 35, 34, 35, 14, 6, 51, 37, 
-	38, 39, 40, 41, 40, 41, 14, 6, 
-	51, 43, 44, 45, 47, 48, 46, 14, 
-	46, 14, 6, 51, 48, 51, 52, 50
+	1, 0, 2, 2, 3, 4, 18, 24, 
+	37, 44, 5, 12, 6, 7, 8, 9, 
+	11, 9, 11, 10, 2, 47, 10, 47, 
+	13, 14, 15, 16, 17, 16, 17, 10, 
+	2, 47, 19, 20, 21, 22, 23, 10, 
+	2, 47, 23, 25, 31, 26, 27, 28, 
+	29, 30, 29, 30, 10, 2, 47, 32, 
+	33, 34, 35, 36, 35, 36, 10, 2, 
+	47, 38, 39, 40, 42, 43, 41, 10, 
+	41, 10, 2, 47, 43, 45, 46, 47, 
+	48, 49
 };
 
 static const char _deserialize_json_trans_actions[] = {
-	0, 0, 1, 1, 2, 3, 3, 3, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 4, 4, 4, 
-	0, 0, 5, 5, 6, 0, 7, 0, 
-	0, 0, 4, 4, 4, 0, 0, 8, 
-	8, 9, 0, 0, 0, 4, 4, 10, 
-	10, 11, 0, 0, 0, 0, 0, 4, 
-	4, 4, 0, 0, 12, 12, 13, 0, 
-	0, 4, 4, 4, 0, 0, 14, 14, 
-	15, 0, 0, 0, 4, 4, 4, 16, 
-	0, 17, 17, 3, 0, 0, 0, 0
+	0, 0, 1, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 2, 2, 
+	2, 0, 0, 3, 3, 4, 0, 5, 
+	0, 0, 2, 2, 2, 0, 0, 6, 
+	6, 7, 0, 0, 0, 2, 2, 8, 
+	8, 9, 0, 0, 0, 0, 0, 2, 
+	2, 2, 0, 0, 10, 10, 11, 0, 
+	0, 2, 2, 2, 0, 0, 12, 12, 
+	13, 0, 0, 0, 2, 2, 2, 14, 
+	0, 15, 15, 16, 0, 0, 0, 0, 
+	0, 0
 };
 
 static const int deserialize_json_start = 1;
-static const int deserialize_json_first_final = 49;
+static const int deserialize_json_first_final = 47;
 static const int deserialize_json_error = 0;
 
 static const int deserialize_json_en_main = 1;
 
 
-#line 101 "hb-buffer-deserialize-json.rl"
+#line 98 "hb-buffer-deserialize-json.rl"
 
 
 static hb_bool_t
@@ -520,12 +482,12 @@
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 524 "hb-buffer-deserialize-json.hh"
+#line 486 "hb-buffer-deserialize-json.hh"
 	{
 	cs = deserialize_json_start;
 	}
 
-#line 529 "hb-buffer-deserialize-json.hh"
+#line 491 "hb-buffer-deserialize-json.hh"
 	{
 	int _slen;
 	int _trans;
@@ -550,14 +512,14 @@
 		goto _again;
 
 	switch ( _deserialize_json_trans_actions[_trans] ) {
-	case 2:
+	case 1:
 #line 38 "hb-buffer-deserialize-json.rl"
 	{
 	memset (&info, 0, sizeof (info));
 	memset (&pos , 0, sizeof (pos ));
 }
 	break;
-	case 7:
+	case 5:
 #line 43 "hb-buffer-deserialize-json.rl"
 	{
 	buffer->add_info (info);
@@ -567,13 +529,13 @@
 	*end_ptr = p;
 }
 	break;
-	case 4:
+	case 2:
 #line 51 "hb-buffer-deserialize-json.rl"
 	{
 	tok = p;
 }
 	break;
-	case 16:
+	case 14:
 #line 55 "hb-buffer-deserialize-json.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
@@ -582,42 +544,31 @@
 	  return false;
 }
 	break;
-	case 17:
+	case 15:
 #line 62 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
 	break;
-	case 10:
+	case 8:
 #line 63 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 	break;
-	case 12:
+	case 10:
 #line 64 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 	break;
-	case 14:
+	case 12:
 #line 65 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 	break;
-	case 5:
+	case 3:
 #line 66 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 	break;
-	case 8:
+	case 6:
 #line 67 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 	break;
-	case 1:
-#line 38 "hb-buffer-deserialize-json.rl"
-	{
-	memset (&info, 0, sizeof (info));
-	memset (&pos , 0, sizeof (pos ));
-}
-#line 51 "hb-buffer-deserialize-json.rl"
-	{
-	tok = p;
-}
-	break;
-	case 3:
+	case 16:
 #line 62 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_uint (tok, p, &info.codepoint)) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
@@ -629,55 +580,55 @@
 	*end_ptr = p;
 }
 	break;
-	case 11:
-#line 63 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
-#line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 13:
-#line 64 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
-#line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 15:
-#line 65 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-#line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
-	case 6:
-#line 66 "hb-buffer-deserialize-json.rl"
-	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-#line 43 "hb-buffer-deserialize-json.rl"
-	{
-	buffer->add_info (info);
-	if (unlikely (!buffer->successful))
-	  return false;
-	buffer->pos[buffer->len - 1] = pos;
-	*end_ptr = p;
-}
-	break;
 	case 9:
+#line 63 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 11:
+#line 64 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 13:
+#line 65 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 4:
+#line 66 "hb-buffer-deserialize-json.rl"
+	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
+#line 43 "hb-buffer-deserialize-json.rl"
+	{
+	buffer->add_info (info);
+	if (unlikely (!buffer->successful))
+	  return false;
+	buffer->pos[buffer->len - 1] = pos;
+	*end_ptr = p;
+}
+	break;
+	case 7:
 #line 67 "hb-buffer-deserialize-json.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
@@ -689,7 +640,7 @@
 	*end_ptr = p;
 }
 	break;
-#line 693 "hb-buffer-deserialize-json.hh"
+#line 644 "hb-buffer-deserialize-json.hh"
 	}
 
 _again:
@@ -701,7 +652,7 @@
 	_out: {}
 	}
 
-#line 129 "hb-buffer-deserialize-json.rl"
+#line 126 "hb-buffer-deserialize-json.rl"
 
 
   *end_ptr = p;
diff --git a/src/hb-buffer-deserialize-json.rl b/src/hb-buffer-deserialize-json.rl
index caaa154..336a5ea 100644
--- a/src/hb-buffer-deserialize-json.rl
+++ b/src/hb-buffer-deserialize-json.rl
@@ -79,24 +79,21 @@
 glyph_number = (glyph_id >tok %parse_gid);
 
 glyph	= "\"g\""  colon (glyph_string | glyph_number);
+codepoint	= "\"u\""  colon glyph_number;
 cluster	= "\"cl\"" colon (unum >tok %parse_cluster);
 xoffset	= "\"dx\"" colon (num >tok %parse_x_offset);
 yoffset	= "\"dy\"" colon (num >tok %parse_y_offset);
 xadvance= "\"ax\"" colon (num >tok %parse_x_advance);
 yadvance= "\"ay\"" colon (num >tok %parse_y_advance);
 
-element = glyph | cluster | xoffset | yoffset | xadvance | yadvance;
+element = glyph | codepoint | cluster | xoffset | yoffset | xadvance | yadvance;
 item	=
 	( '{' space* element (comma element)* space* '}')
 	>clear_item
 	@add_item
 	;
 
-json_glyphs = space* item (comma item)* space* (','|']')?;
-unicode_item = (glyph_number >clear_item %add_item);
-json_unicode = space* unicode_item (comma unicode_item)* (','|']');
-
-main := json_glyphs | json_unicode;
+main := space* item (comma item)* space* (','|']')?;
 
 }%%
 
diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh
index 70de5be..90275b8 100644
--- a/src/hb-buffer-deserialize-text.hh
+++ b/src/hb-buffer-deserialize-text.hh
@@ -34,27 +34,27 @@
 
 #line 36 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
-	0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 122u, 9u, 122u, 
-	45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 
-	45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 9u, 124u, 
-	9u, 124u, 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
-	9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0
+	0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 48u, 122u, 
+	9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 
+	44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 
+	9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 
+	9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0
 };
 
 static const char _deserialize_text_key_spans[] = {
-	0, 83, 1, 1, 55, 77, 75, 114, 
-	13, 10, 13, 10, 10, 13, 10, 1, 
-	13, 10, 14, 116, 116, 0, 77, 116, 
-	116, 114, 116, 116, 116, 116, 116, 116, 
-	116, 116, 116, 116
+	0, 83, 1, 1, 55, 77, 10, 75, 
+	114, 13, 10, 13, 10, 10, 13, 10, 
+	1, 13, 10, 14, 116, 116, 0, 77, 
+	116, 116, 116, 116, 114, 116, 116, 116, 
+	116, 116, 116, 116, 116, 116, 116
 };
 
 static const short _deserialize_text_index_offsets[] = {
-	0, 0, 84, 86, 88, 144, 222, 298, 
-	413, 427, 438, 452, 463, 474, 488, 499, 
-	501, 515, 526, 541, 658, 775, 776, 854, 
-	971, 1088, 1203, 1320, 1437, 1554, 1671, 1788, 
-	1905, 2022, 2139, 2256
+	0, 0, 84, 86, 88, 144, 222, 233, 
+	309, 424, 438, 449, 463, 474, 485, 499, 
+	510, 512, 526, 537, 552, 669, 786, 787, 
+	865, 982, 1099, 1216, 1333, 1448, 1565, 1682, 
+	1799, 1916, 2033, 2150, 2267, 2384, 2501
 };
 
 static const char _deserialize_text_indicies[] = {
@@ -87,102 +87,92 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 4, 1, 8, 
 	9, 9, 9, 9, 9, 9, 9, 9, 
-	9, 1, 1, 1, 1, 1, 1, 1, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 1, 1, 1, 1, 1, 1, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 1, 11, 11, 11, 11, 11, 
+	9, 1, 10, 11, 11, 11, 11, 11, 
+	11, 11, 11, 11, 1, 1, 1, 1, 
+	1, 1, 1, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 1, 1, 1, 
+	1, 1, 1, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 1, 13, 13, 
+	13, 13, 13, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 13, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 11, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 8, 9, 9, 9, 9, 9, 
-	9, 9, 9, 9, 1, 1, 1, 1, 
-	1, 1, 1, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 1, 1, 1, 
-	1, 1, 1, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 1, 12, 1, 
-	1, 13, 14, 14, 14, 14, 14, 14, 
-	14, 14, 14, 1, 15, 16, 16, 16, 
+	1, 1, 1, 1, 1, 10, 11, 11, 
+	11, 11, 11, 11, 11, 11, 11, 1, 
+	1, 1, 1, 1, 1, 1, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	1, 1, 1, 1, 1, 1, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	1, 14, 1, 1, 15, 16, 16, 16, 
 	16, 16, 16, 16, 16, 16, 1, 17, 
-	1, 1, 18, 19, 19, 19, 19, 19, 
-	19, 19, 19, 19, 1, 20, 21, 21, 
+	18, 18, 18, 18, 18, 18, 18, 18, 
+	18, 1, 19, 1, 1, 20, 21, 21, 
 	21, 21, 21, 21, 21, 21, 21, 1, 
 	22, 23, 23, 23, 23, 23, 23, 23, 
-	23, 23, 1, 24, 1, 1, 25, 26, 
-	26, 26, 26, 26, 26, 26, 26, 26, 
+	23, 23, 1, 24, 25, 25, 25, 25, 
+	25, 25, 25, 25, 25, 1, 26, 1, 
 	1, 27, 28, 28, 28, 28, 28, 28, 
-	28, 28, 28, 1, 29, 1, 30, 1, 
-	1, 31, 32, 32, 32, 32, 32, 32, 
-	32, 32, 32, 1, 33, 34, 34, 34, 
-	34, 34, 34, 34, 34, 34, 1, 29, 
-	1, 1, 1, 28, 28, 28, 28, 28, 
-	28, 28, 28, 28, 28, 1, 35, 35, 
-	35, 35, 35, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 35, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 36, 36, 36, 
-	36, 36, 36, 36, 36, 36, 36, 1, 
-	1, 1, 1, 37, 1, 1, 36, 36, 
-	36, 36, 36, 36, 1, 1, 1, 1, 
+	28, 28, 28, 1, 29, 30, 30, 30, 
+	30, 30, 30, 30, 30, 30, 1, 31, 
+	1, 32, 1, 1, 33, 34, 34, 34, 
+	34, 34, 34, 34, 34, 34, 1, 35, 
+	36, 36, 36, 36, 36, 36, 36, 36, 
+	36, 1, 31, 1, 1, 1, 30, 30, 
+	30, 30, 30, 30, 30, 30, 30, 30, 
+	1, 37, 37, 37, 37, 37, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 36, 36, 
-	36, 36, 36, 36, 1, 1, 1, 1, 
+	37, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 38, 1, 39, 39, 39, 39, 39, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 39, 1, 1, 1, 1, 1, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 1, 1, 1, 39, 40, 1, 
+	1, 38, 38, 38, 38, 38, 38, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	40, 1, 1, 1, 1, 1, 1, 1, 
+	1, 38, 38, 38, 38, 38, 38, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 41, 1, 42, 42, 
+	42, 42, 42, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 42, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 43, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 41, 1, 
-	1, 7, 7, 7, 7, 7, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 44, 1, 1, 7, 7, 7, 7, 
 	7, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 7, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 4, 1, 42, 
-	42, 42, 42, 42, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 42, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 43, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 44, 1, 1, 45, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 46, 1, 1, 1, 1, 
+	4, 1, 45, 45, 45, 45, 45, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 45, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 47, 1, 48, 48, 48, 48, 
-	48, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 48, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 46, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
@@ -190,207 +180,250 @@
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	40, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 47, 1, 45, 
+	45, 45, 45, 45, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 45, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 49, 
-	1, 11, 11, 11, 11, 11, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	11, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	8, 9, 9, 9, 9, 9, 9, 9, 
-	9, 9, 1, 1, 1, 1, 1, 1, 
-	1, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 1, 1, 1, 1, 1, 
-	1, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 10, 10, 10, 10, 10, 
-	10, 10, 10, 1, 42, 42, 42, 42, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 42, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 43, 1, 
-	1, 1, 1, 50, 50, 50, 50, 50, 
-	50, 50, 50, 50, 50, 1, 1, 1, 
-	44, 1, 1, 45, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 48, 48, 
+	48, 48, 48, 48, 48, 48, 48, 48, 
+	1, 1, 1, 1, 46, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	46, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 47, 
-	1, 51, 51, 51, 51, 51, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	51, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 52, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 47, 1, 49, 49, 49, 49, 
+	49, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 49, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 50, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	51, 1, 1, 52, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	53, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 54, 
+	1, 55, 55, 55, 55, 55, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	55, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 43, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 56, 1, 13, 13, 
+	13, 13, 13, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 13, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 10, 11, 11, 
+	11, 11, 11, 11, 11, 11, 11, 1, 
+	1, 1, 1, 1, 1, 1, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	1, 1, 1, 1, 1, 1, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	12, 12, 12, 12, 12, 12, 12, 12, 
+	1, 49, 49, 49, 49, 49, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	49, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 50, 1, 1, 1, 1, 
+	57, 57, 57, 57, 57, 57, 57, 57, 
+	57, 57, 1, 1, 1, 51, 1, 1, 
+	52, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 53, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 54, 1, 55, 55, 
-	55, 55, 55, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 54, 1, 58, 58, 
+	58, 58, 58, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 55, 1, 1, 
+	1, 1, 1, 1, 1, 58, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 59, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 60, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 61, 1, 62, 62, 62, 62, 62, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 62, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 56, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 63, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 57, 1, 55, 55, 55, 55, 55, 
+	1, 1, 1, 1, 1, 1, 64, 1, 
+	62, 62, 62, 62, 62, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 62, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 55, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 21, 21, 21, 21, 21, 21, 
-	21, 21, 21, 21, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 56, 
+	1, 1, 1, 1, 63, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 57, 1, 
-	51, 51, 51, 51, 51, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 51, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 52, 1, 1, 1, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 53, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 54, 1, 58, 58, 58, 
+	1, 1, 1, 64, 1, 58, 58, 58, 
 	58, 58, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 58, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 59, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 60, 1, 1, 1, 
+	59, 1, 1, 1, 18, 18, 18, 18, 
+	18, 18, 18, 18, 18, 18, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 61, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 60, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	62, 1, 63, 63, 63, 63, 63, 1, 
+	61, 1, 65, 65, 65, 65, 65, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 63, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 64, 1, 1, 1, 
+	1, 65, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 66, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 67, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 46, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 68, 1, 69, 
+	69, 69, 69, 69, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 69, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 70, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 65, 1, 
+	1, 1, 1, 71, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 66, 1, 63, 
-	63, 63, 63, 63, 1, 1, 1, 1, 
+	1, 1, 72, 1, 69, 69, 69, 69, 
+	69, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 63, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 64, 1, 1, 1, 1, 34, 34, 
-	34, 34, 34, 34, 34, 34, 34, 34, 
+	1, 1, 1, 69, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 70, 1, 
+	1, 1, 1, 36, 36, 36, 36, 36, 
+	36, 36, 36, 36, 36, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 65, 1, 1, 1, 1, 
+	71, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 72, 
+	1, 65, 65, 65, 65, 65, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	65, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 66, 1, 1, 1, 1, 
+	73, 73, 73, 73, 73, 73, 73, 73, 
+	73, 73, 1, 1, 1, 1, 1, 1, 
+	67, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 46, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 66, 1, 58, 58, 58, 58, 
-	58, 1, 1, 1, 1, 1, 1, 1, 
+	1, 1, 1, 1, 68, 1, 49, 49, 
+	49, 49, 49, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 58, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 59, 1, 
-	1, 1, 1, 67, 67, 67, 67, 67, 
-	67, 67, 67, 67, 67, 1, 1, 1, 
-	1, 1, 1, 60, 1, 1, 1, 1, 
+	1, 1, 1, 1, 1, 49, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	61, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 62, 
-	1, 42, 42, 42, 42, 42, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 43, 1, 68, 68, 1, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 1, 1, 1, 44, 1, 1, 
-	45, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 1, 1, 46, 1, 68, 
-	1, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 1, 47, 1, 0
+	50, 1, 74, 74, 1, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 1, 
+	1, 1, 51, 1, 1, 52, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	1, 1, 53, 1, 74, 1, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	74, 74, 74, 74, 74, 74, 74, 74, 
+	1, 54, 1, 0
 };
 
 static const char _deserialize_text_trans_targs[] = {
-	1, 0, 2, 6, 3, 4, 19, 5, 
-	23, 26, 35, 7, 9, 27, 30, 27, 
-	30, 11, 28, 29, 28, 29, 31, 34, 
-	14, 15, 18, 15, 18, 16, 17, 32, 
-	33, 32, 33, 20, 19, 21, 22, 20, 
-	21, 22, 24, 8, 12, 13, 21, 25, 
-	24, 25, 26, 24, 10, 21, 25, 24, 
-	21, 25, 24, 8, 13, 21, 25, 24, 
-	8, 21, 25, 34, 35
+	1, 0, 2, 7, 3, 4, 20, 5, 
+	24, 25, 26, 29, 38, 8, 10, 30, 
+	33, 30, 33, 12, 31, 32, 31, 32, 
+	34, 37, 15, 16, 19, 16, 19, 17, 
+	18, 35, 36, 35, 36, 21, 20, 6, 
+	22, 23, 21, 22, 23, 21, 22, 23, 
+	25, 27, 9, 13, 14, 22, 28, 27, 
+	28, 29, 27, 11, 22, 28, 27, 22, 
+	28, 27, 9, 14, 28, 27, 9, 22, 
+	28, 37, 38
 };
 
 static const char _deserialize_text_trans_actions[] = {
-	0, 0, 0, 0, 0, 0, 1, 0, 
-	1, 1, 1, 0, 2, 2, 2, 0, 
-	0, 2, 2, 2, 0, 0, 2, 2, 
-	2, 2, 2, 0, 0, 3, 2, 2, 
-	2, 0, 0, 4, 0, 4, 4, 0, 
-	0, 0, 5, 6, 6, 6, 5, 5, 
-	0, 0, 0, 7, 8, 7, 7, 9, 
-	9, 9, 10, 11, 11, 10, 10, 12, 
-	13, 12, 12, 0, 0
+	0, 0, 0, 0, 0, 1, 2, 0, 
+	2, 2, 3, 3, 3, 0, 2, 2, 
+	2, 0, 0, 2, 2, 2, 0, 0, 
+	2, 2, 2, 2, 2, 0, 0, 4, 
+	2, 2, 2, 0, 0, 5, 0, 6, 
+	5, 5, 0, 0, 0, 7, 7, 7, 
+	0, 8, 9, 9, 9, 8, 8, 0, 
+	0, 0, 10, 11, 10, 10, 12, 12, 
+	12, 7, 13, 13, 7, 14, 15, 14, 
+	14, 0, 0
 };
 
 static const char _deserialize_text_eof_actions[] = {
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 4, 0, 0, 0, 5, 
-	0, 0, 5, 7, 9, 9, 7, 10, 
-	12, 12, 10, 5
+	0, 0, 0, 0, 5, 0, 0, 0, 
+	7, 7, 8, 0, 0, 8, 10, 12, 
+	12, 10, 7, 14, 14, 7, 8
 };
 
 static const int deserialize_text_start = 1;
-static const int deserialize_text_first_final = 19;
+static const int deserialize_text_first_final = 20;
 static const int deserialize_text_error = 0;
 
 static const int deserialize_text_en_main = 1;
@@ -419,12 +452,12 @@
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 423 "hb-buffer-deserialize-text.hh"
+#line 456 "hb-buffer-deserialize-text.hh"
 	{
 	cs = deserialize_text_start;
 	}
 
-#line 428 "hb-buffer-deserialize-text.hh"
+#line 461 "hb-buffer-deserialize-text.hh"
 	{
 	int _slen;
 	int _trans;
@@ -449,13 +482,20 @@
 		goto _again;
 
 	switch ( _deserialize_text_trans_actions[_trans] ) {
+	case 1:
+#line 38 "hb-buffer-deserialize-text.rl"
+	{
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+	break;
 	case 2:
 #line 51 "hb-buffer-deserialize-text.rl"
 	{
 	tok = p;
 }
 	break;
-	case 6:
+	case 9:
 #line 55 "hb-buffer-deserialize-text.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
@@ -464,23 +504,27 @@
 	  return false;
 }
 	break;
-	case 11:
+	case 6:
+#line 62 "hb-buffer-deserialize-text.rl"
+	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
+	break;
+	case 13:
 #line 64 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 	break;
-	case 3:
+	case 4:
 #line 65 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 	break;
-	case 13:
+	case 15:
 #line 66 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 	break;
-	case 8:
+	case 11:
 #line 67 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 	break;
-	case 1:
+	case 3:
 #line 38 "hb-buffer-deserialize-text.rl"
 	{
 	memset (&info, 0, sizeof (info));
@@ -491,7 +535,7 @@
 	tok = p;
 }
 	break;
-	case 5:
+	case 8:
 #line 55 "hb-buffer-deserialize-text.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
@@ -508,7 +552,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 4:
+	case 5:
 #line 62 "hb-buffer-deserialize-text.rl"
 	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -520,7 +564,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 10:
+	case 7:
 #line 64 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -532,7 +576,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 12:
+	case 14:
 #line 66 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -544,7 +588,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 7:
+	case 10:
 #line 67 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -556,7 +600,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 9:
+	case 12:
 #line 68 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -568,7 +612,7 @@
 	*end_ptr = p;
 }
 	break;
-#line 572 "hb-buffer-deserialize-text.hh"
+#line 616 "hb-buffer-deserialize-text.hh"
 	}
 
 _again:
@@ -580,7 +624,7 @@
 	if ( p == eof )
 	{
 	switch ( _deserialize_text_eof_actions[cs] ) {
-	case 5:
+	case 8:
 #line 55 "hb-buffer-deserialize-text.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
@@ -597,7 +641,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 4:
+	case 5:
 #line 62 "hb-buffer-deserialize-text.rl"
 	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -609,7 +653,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 10:
+	case 7:
 #line 64 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -621,7 +665,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 12:
+	case 14:
 #line 66 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -633,7 +677,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 7:
+	case 10:
 #line 67 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -645,7 +689,7 @@
 	*end_ptr = p;
 }
 	break;
-	case 9:
+	case 12:
 #line 68 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
@@ -657,7 +701,7 @@
 	*end_ptr = p;
 }
 	break;
-#line 661 "hb-buffer-deserialize-text.hh"
+#line 705 "hb-buffer-deserialize-text.hh"
 	}
 	}
 
diff --git a/src/hb-buffer-deserialize-text.rl b/src/hb-buffer-deserialize-text.rl
index 3faa852..f01e2d3 100644
--- a/src/hb-buffer-deserialize-text.rl
+++ b/src/hb-buffer-deserialize-text.rl
@@ -79,7 +79,7 @@
 advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?;
 
 codepoint = xdigit+ >tok %parse_hexdigits;
-unicode_id = 'U' '+' codepoint >clear_item %add_item;
+unicode_id = 'U' '+'  >clear_item codepoint cluster? %add_item;
 
 item	=
 	(
diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc
index 8026b3f..bde7624 100644
--- a/src/hb-buffer-serialize.cc
+++ b/src/hb-buffer-serialize.cc
@@ -206,7 +206,8 @@
           unsigned int end,
           char *buf,
           unsigned int buf_size,
-          unsigned int *buf_consumed)
+          unsigned int *buf_consumed,
+          hb_buffer_serialize_flags_t flags)
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
 
@@ -215,13 +216,24 @@
   {
     char b[1024];
     char *p = b;
+
     if (i)
       *p++ = ',';
     else
       *p++ = '[';
 
+    *p++ = '{';
+
+    APPEND ("\"u\":");
+
     p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
 
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
+    }
+
+    *p++ = '}';
+
     if (i == end-1)
       *p++ = ']';
 
@@ -340,7 +352,8 @@
                                    unsigned int end,
                                    char *buf,
                                    unsigned int buf_size,
-                                   unsigned int *buf_consumed)
+                                   unsigned int *buf_consumed,
+                                   hb_buffer_serialize_flags_t flags)
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   *buf_consumed = 0;
@@ -356,6 +369,10 @@
 
     p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "U+%04X", info[i].codepoint));
 
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
+    }
+
     if (i == end-1)
       *p++ = '>';
 
@@ -508,18 +525,25 @@
  * The serialized codepoints will look something like:
  *
  * ```
- * <U+0651|U+0628>
+ * <U+0651=0|U+0628=1>
  * ```
  * - Glyphs are separated with `|`
  * - Unicode codepoints are expressed as zero-padded four (or more)
  *   digit hexadecimal numbers preceded by `U+`
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, the cluster
+ *   will be indicated with a `=` then #hb_glyph_info_t.cluster.
  *
  * ## json
  * A machine-readable, structured format.
- * The serialized codepoints will be a list of Unicode codepoints as
- * decimal integers. For example:
+ * The serialized codepoints will be a list of objects with the following
+ * properties:
+ * - `g`: the Unicode codepoint as a decimal integer
+ * - `cl`: #hb_glyph_info_t.cluster if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set.
+ *
+ * For example:
  * ```
- * [1617,1576]
+ * [{g:1617,cl:0},{g:1576,cl:1}]
  * ```
  *
  * Return value:
@@ -534,7 +558,8 @@
                              char *buf,
                              unsigned int buf_size,
                              unsigned int *buf_consumed,
-                             hb_buffer_serialize_format_t format)
+                             hb_buffer_serialize_format_t format,
+                             hb_buffer_serialize_flags_t flags)
 {
   assert (start <= end && end <= buffer->len);
 
@@ -555,11 +580,11 @@
   {
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
       return _hb_buffer_serialize_unicode_text (buffer, start, end,
-                                                buf, buf_size, buf_consumed);
+                                                buf, buf_size, buf_consumed, flags);
 
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
       return _hb_buffer_serialize_unicode_json (buffer, start, end,
-                                                buf, buf_size, buf_consumed);
+                                                buf, buf_size, buf_consumed, flags);
 
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
@@ -609,7 +634,7 @@
                                       buf_consumed, font, format, flags);
   else
     return hb_buffer_serialize_unicode(buffer, start, end, buf, buf_size,
-                                       buf_consumed, format);
+                                       buf_consumed, format, flags);
 }
 
 static bool
diff --git a/src/hb-buffer.h b/src/hb-buffer.h
index 8e0298c..e20c879 100644
--- a/src/hb-buffer.h
+++ b/src/hb-buffer.h
@@ -525,7 +525,8 @@
 					char *buf,
 					unsigned int buf_size,
 					unsigned int *buf_consumed,
-					hb_buffer_serialize_format_t format);
+					hb_buffer_serialize_format_t format,
+					hb_buffer_serialize_flags_t flags);
 
 HB_EXTERN unsigned int
 hb_buffer_serialize (hb_buffer_t *buffer,
diff --git a/test/api/test-buffer.c b/test/api/test-buffer.c
index bf8a45f..1418cf8 100644
--- a/test/api/test-buffer.c
+++ b/test/api/test-buffer.c
@@ -863,8 +863,8 @@
 } serialization_test_t;
 
 static const serialization_test_t serialization_tests[] = {
-  { "<U+0640|U+0635>", HB_BUFFER_SERIALIZE_FORMAT_TEXT, 2 },
-  { "[1600,1589]", HB_BUFFER_SERIALIZE_FORMAT_JSON, 2 },
+  { "<U+0640=0|U+0635=1>", HB_BUFFER_SERIALIZE_FORMAT_TEXT, 2 },
+  { "[{\"u\":1600,\"cl\":0},{\"u\":1589,\"cl\":1}]", HB_BUFFER_SERIALIZE_FORMAT_JSON, 2 },
 };
 
 static void
@@ -873,13 +873,14 @@
   hb_buffer_t *b;
   unsigned int i;
 
-  b = hb_buffer_create ();
-  hb_buffer_set_replacement_codepoint (b, (hb_codepoint_t) -1);
-
   for (i = 0; i < G_N_ELEMENTS (serialization_tests); i++)
   {
     unsigned int num_glyphs, consumed;
     char round_trip[1024];
+
+	  b = hb_buffer_create ();
+	  hb_buffer_set_replacement_codepoint (b, (hb_codepoint_t) -1);
+
     const serialization_test_t *test = &serialization_tests[i];
     g_test_message ("serialize test #%d", i);
 
@@ -889,11 +890,13 @@
     g_assert_cmpint (num_glyphs, ==, test->num_items);
 
     hb_buffer_serialize_unicode(b, 0, num_glyphs, round_trip,
-                                sizeof(round_trip), &consumed, test->format);
+                                sizeof(round_trip), &consumed, test->format,
+                                HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
     g_assert_cmpstr (round_trip, ==, test->contents);
-  }
 
-  hb_buffer_destroy (b);
+	  hb_buffer_destroy (b);
+
+  }
 }
 
 int