#ifdef UTF2000
   Lisp_Object table;
+  Lisp_Object default_value;
 #else
   Lisp_Object ascii[NUM_ASCII_CHARS];
 
 INLINE_HEADER Lisp_Object
 CHAR_TABLE_VALUE_UNSAFE (Lisp_Char_Table *ct, Emchar ch)
 {
-  return get_byte_table (get_byte_table
-                        (get_byte_table
-                         (get_byte_table
-                          (ct->table,
-                           (unsigned char)(ch >> 24)),
-                          (unsigned char) (ch >> 16)),
-                         (unsigned char)  (ch >> 8)),
-                        (unsigned char)    ch);
+  Lisp_Object val = get_byte_table (get_byte_table
+                                   (get_byte_table
+                                    (get_byte_table
+                                     (ct->table,
+                                      (unsigned char)(ch >> 24)),
+                                     (unsigned char) (ch >> 16)),
+                                    (unsigned char)  (ch >> 8)),
+                                   (unsigned char)    ch);
+  if (UNBOUNDP (val))
+    return ct->default_value;
+  else
+    return val;
 }
 
 #elif defined(MULE)
 enum chartab_range_type
 {
   CHARTAB_RANGE_ALL,
+#ifdef UTF2000
+  CHARTAB_RANGE_DEFAULT,
+#endif
 #ifdef MULE
   CHARTAB_RANGE_CHARSET,
   CHARTAB_RANGE_ROW,