Remove wuffs_base__token__link_prev
diff --git a/doc/note/tokens.md b/doc/note/tokens.md
index 8a9bde0..5577f2d 100644
--- a/doc/note/tokens.md
+++ b/doc/note/tokens.md
@@ -36,25 +36,22 @@
 
 A token is just a `uint64_t`. The broad divisions are:
 
-- Bits 63 .. 18 (46 bits) is the value.
-- Bits 17 .. 16  (2 bits) is `LP` and `LN` (`link_prev` and `link_next`).
+- Bits 63 .. 17 (47 bits) is the value.
+- Bits 16 .. 16  (1 bit)  is the `continued` bit.
 - Bits 15 ..  0 (16 bits) is the length.
 
-The `LP` and `LN` bits denote tokens that are part of a multi-token chain:
-
-- `LP` means that this token is not the first (there is a previous token).
-- `LN` means that this token is not the last  (there is a next     token).
-
-A stand-alone token will have both link bits set to zero.
+The `continued` bit is whether that the token chain for this token also
+contains the next token. The final token in a token chain, including
+stand-alone tokens, will have the `continued` bit set to zero.
 
 ```
-+-----+-------------+-------+-------------+-----+-----+-----------+
-|  1  |      21     |   3   |      21     |  1  |  1  |     16    |
-+-----+-------------+-------+-------------+-----+-----+-----------+
-[..................value..................]  LP    LN     length
-[..1..|..........~value_extension.........]
-[..0..|.value_major.|.....value_minor.....]
-[..0..|......0......|..VBC..|.....VBD.....]
++-----+-------------+-------+---------------+-----+-----------+
+|  1  |      21     |   3   |       22      |  1  |     16    |
++-----+-------------+-------+---------------+-----+-----------+
+[...................value...................] con     length
+[..1..|...........~value_extension..........]
+[..0..|.value_major.|......value_minor......]
+[..0..|......0......|..VBC..|......VBD......]
 ```
 
 The value bits can be sub-divided in multiple ways. First, the high bit:
@@ -64,7 +61,7 @@
 
 ### Extended Tokens
 
-- Bits 62 .. 18 (45 bits) is the bitwise-not (~) of the `value_extension`.
+- Bits 62 .. 17 (46 bits) is the bitwise-not (~) of the `value_extension`.
 
 Extended tokens are typically part of a multi-token chain whose first token is
 a simple token that provides the semantics for each `value_extension`.
@@ -73,7 +70,7 @@
 ### Simple Tokens
 
 - Bits 62 .. 42 (21 bits) is the `value_major`.
-- Bits 41 .. 18 (24 bits) is the `value_minor`.
+- Bits 41 .. 17 (25 bits) is the `value_minor`.
 
 The `value_major` is a 21-bit [Base38](doc/note/base38-and-fourcc.md) number.
 For example, an HTML tokenizer might produce a combination of "base" tokens
@@ -90,13 +87,13 @@
 A zero `value_major` is reserved for Wuffs' built-in "base" package. The
 `value_minor` is further sub-divided:
 
- - Bits 41 .. 39  (3 bits) is the `VBC` (`value_base_category`).
- - Bits 38 .. 18 (21 bits) is the `VBD` (`value_base_detail`).
+- Bits 41 .. 38  (4 bits) is the `VBC` (`value_base_category`).
+- Bits 37 .. 17 (21 bits) is the `VBD` (`value_base_detail`).
 
-The high 46 bits (bits 63 .. 18) only have `VBC` and `VBD` semantics when the
+The high 47 bits (bits 63 .. 17) only have `VBC` and `VBD` semantics when the
 high 22 bits (the `extended` and `value_major` parts) are all zero. An
-equivalent test is that the high 25 bits (the notional `VBC`), as either an
-unsigned integer or a sign-extended integer, is in the range `0 ..= 7`.
+equivalent test is that the high 26 bits (the notional `VBC`), as either an
+unsigned integer or a sign-extended integer, is in the range `0 ..= 15`.
 
 These `VBC`s organize tokens into broad groups, generally applicable (as
 opposed to being e.g. HTML-specific or JSON-specific). For example, strings and
@@ -142,15 +139,17 @@
 ## Example Token Stream
 
 ```
-$ gcc script/print-json-token-debug-format.c && \
->   ./a.out -all-tokens -human-readable < test/data/json-things.formatted.json
-pos=0x00000000  len=0x0001  link=0b00  vbc=1:Structure........  vbd=0x004011
-pos=0x00000001  len=0x0005  link=0b00  vbc=0:Filler...........  vbd=0x000000
-pos=0x00000006  len=0x0001  link=0b01  vbc=2:String...........  vbd=0x000013
-pos=0x00000007  len=0x0002  link=0b11  vbc=2:String...........  vbd=0x000021
-pos=0x00000009  len=0x0001  link=0b10  vbc=2:String...........  vbd=0x000013
+$ gcc script/print-json-token-debug-format.c -o pjtdf
+$ ./pjtdf -all-tokens -human-readable < test/data/json-things.formatted.json
+pos=0x00000000  len=0x0001  con=0  vbc=1:Structure........  vbd=0x004011
+pos=0x00000001  len=0x0005  con=0  vbc=0:Filler...........  vbd=0x000000
+pos=0x00000006  len=0x0001  con=1  vbc=2:String...........  vbd=0x000013
+pos=0x00000007  len=0x0002  con=1  vbc=2:String...........  vbd=0x000021
+pos=0x00000009  len=0x0001  con=0  vbc=2:String...........  vbd=0x000013
 etc
-pos=0x00000094  len=0x0001  link=0b10  vbc=2:String...........  vbd=0x000013
-pos=0x00000095  len=0x0001  link=0b00  vbc=0:Filler...........  vbd=0x000000
-pos=0x00000096  len=0x0001  link=0b00  vbc=1:Structure........  vbd=0x001042
+pos=0x00000090  len=0x0002  con=1  vbc=3:UnicodeCodePoint.  vbd=0x00000A
+pos=0x00000092  len=0x0002  con=1  vbc=3:UnicodeCodePoint.  vbd=0x00000A
+pos=0x00000094  len=0x0001  con=0  vbc=2:String...........  vbd=0x000013
+pos=0x00000095  len=0x0001  con=0  vbc=0:Filler...........  vbd=0x000000
+pos=0x00000096  len=0x0001  con=0  vbc=1:Structure........  vbd=0x001042
 ```
diff --git a/example/jsonfindptrs/jsonfindptrs.cc b/example/jsonfindptrs/jsonfindptrs.cc
index 2bf74f9..5c5816f 100644
--- a/example/jsonfindptrs/jsonfindptrs.cc
+++ b/example/jsonfindptrs/jsonfindptrs.cc
@@ -674,7 +674,7 @@
         return Result("main: internal error: unexpected token");
     }
 
-    if (!tsr.token.link_next()) {
+    if (!tsr.token.continued()) {
       break;
     }
     tsr = ts.next();
diff --git a/example/jsonptr/jsonptr.cc b/example/jsonptr/jsonptr.cc
index e4aa8a7..7c3dc2c 100644
--- a/example/jsonptr/jsonptr.cc
+++ b/example/jsonptr/jsonptr.cc
@@ -979,15 +979,15 @@
           return "main: internal error: unexpected string-token conversion";
         }
 
-        if (t.link_next()) {
+        if (t.continued()) {
           return nullptr;
         }
         TRY(write_dst("\"", 1));
         goto after_value;
 
       case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT:
-        if (!t.link_next()) {
-          return "main: internal error: unexpected unlinked token";
+        if (!t.continued()) {
+          return "main: internal error: unexpected non-continued UCP token";
         }
         TRY(handle_unicode_code_point(vbd));
         g_query.incremental_match_code_point(vbd);
@@ -1049,12 +1049,12 @@
 
       // Skip filler tokens (e.g. whitespace).
       if (t.value() == 0) {
-        start_of_token_chain = !t.link_next();
+        start_of_token_chain = !t.continued();
         continue;
       }
 
       const char* z = handle_token(t, start_of_token_chain);
-      start_of_token_chain = !t.link_next();
+      start_of_token_chain = !t.continued();
       if (z == nullptr) {
         continue;
       } else if (z == g_eod) {
diff --git a/fuzz/c/std/json_fuzzer.c b/fuzz/c/std/json_fuzzer.c
index c3ae16e..916237c 100644
--- a/fuzz/c/std/json_fuzzer.c
+++ b/fuzz/c/std/json_fuzzer.c
@@ -196,7 +196,7 @@
 
   // After a complete JSON value, update the parity (even/odd count) of the
   // container.
-  if (!wuffs_base__token__link_next(&t) &&
+  if (!wuffs_base__token__continued(&t) &&
       (vbc != WUFFS_BASE__TOKEN__VBC__FILLER) &&
       ((vbc != WUFFS_BASE__TOKEN__VBC__STRUCTURE) ||
        (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP))) {
@@ -368,8 +368,8 @@
 
   if (depth != 0) {
     return "fuzz: internal error: decoded OK but final depth was not zero";
-  } else if (wuffs_base__token__link_next(&final_token)) {
-    return "fuzz: internal error: decoded OK but final token had link_next";
+  } else if (wuffs_base__token__continued(&final_token)) {
+    return "fuzz: internal error: decoded OK but final token was continued";
   }
   return NULL;
 }
diff --git a/internal/cgen/base/token-public.h b/internal/cgen/base/token-public.h
index aa37f13..eb05a76 100644
--- a/internal/cgen/base/token-public.h
+++ b/internal/cgen/base/token-public.h
@@ -29,8 +29,7 @@
   inline int64_t value_base_category() const;
   inline uint64_t value_minor() const;
   inline uint64_t value_base_detail() const;
-  inline bool link_prev() const;
-  inline bool link_next() const;
+  inline bool continued() const;
   inline uint64_t length() const;
 #endif  // __cplusplus
 
@@ -47,18 +46,15 @@
 
 #define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
 
-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 18
-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 18
+#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17
 #define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42
-#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 39
-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 18
-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 18
-#define WUFFS_BASE__TOKEN__LINK__SHIFT 16
+#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
+#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17
+#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16
 #define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0
 
-#define WUFFS_BASE__TOKEN__LINK_PREV 0x20000
-#define WUFFS_BASE__TOKEN__LINK_NEXT 0x10000
-
   // --------
 
 #define WUFFS_BASE__TOKEN__VBC__FILLER 0
@@ -179,7 +175,7 @@
 
 static inline uint64_t  //
 wuffs_base__token__value_minor(const wuffs_base__token* t) {
-  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0xFFFFFF;
+  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
 }
 
 static inline uint64_t  //
@@ -188,13 +184,8 @@
 }
 
 static inline bool  //
-wuffs_base__token__link_prev(const wuffs_base__token* t) {
-  return t->repr & WUFFS_BASE__TOKEN__LINK_PREV;
-}
-
-static inline bool  //
-wuffs_base__token__link_next(const wuffs_base__token* t) {
-  return t->repr & WUFFS_BASE__TOKEN__LINK_NEXT;
+wuffs_base__token__continued(const wuffs_base__token* t) {
+  return t->repr & 0x10000;
 }
 
 static inline uint64_t  //
@@ -235,13 +226,8 @@
 }
 
 inline bool  //
-wuffs_base__token::link_prev() const {
-  return wuffs_base__token__link_prev(this);
-}
-
-inline bool  //
-wuffs_base__token::link_next() const {
-  return wuffs_base__token__link_next(this);
+wuffs_base__token::continued() const {
+  return wuffs_base__token__continued(this);
 }
 
 inline uint64_t  //
diff --git a/internal/cgen/builtin.go b/internal/cgen/builtin.go
index 197c7f3..5eca912 100644
--- a/internal/cgen/builtin.go
+++ b/internal/cgen/builtin.go
@@ -350,7 +350,7 @@
 			if err := g.writeExpr(b, args[2].AsArg().Value(), depth); err != nil {
 				return err
 			}
-			b.writes(")) << WUFFS_BASE__TOKEN__LINK__SHIFT) | (((uint64_t)(")
+			b.writes(")) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | (((uint64_t)(")
 		}
 
 		if err := g.writeExpr(b, args[3].AsArg().Value(), depth); err != nil {
diff --git a/internal/cgen/data.go b/internal/cgen/data.go
index 7d5d0e6..82a3973 100644
--- a/internal/cgen/data.go
+++ b/internal/cgen/data.go
@@ -382,9 +382,9 @@
 	""
 
 const baseTokenPublicH = "" +
-	"// ---------------- Tokens\n\n// wuffs_base__token is an element of a byte stream's tokenization.\n//\n// See https://github.com/google/wuffs/blob/master/doc/note/tokens.md\ntypedef struct {\n  uint64_t repr;\n\n#ifdef __cplusplus\n  inline int64_t value() const;\n  inline int64_t value_extension() const;\n  inline int64_t value_major() const;\n  inline int64_t value_base_category() const;\n  inline uint64_t value_minor() const;\n  inline uint64_t value_base_detail() const;\n  inline bool link_prev() const;\n  inline bool link_next() const;\n  inline uint64_t length() const;\n#endif  // __cplusplus\n\n} wuffs_base__token;\n\nstatic inline wuffs_base__token  //\nwuffs_base__make_token(uint64_t repr) {\n  wuffs_base__token ret;\n  ret.repr = repr;\n  return ret;\n}\n\n  " +
+	"// ---------------- Tokens\n\n// wuffs_base__token is an element of a byte stream's tokenization.\n//\n// See https://github.com/google/wuffs/blob/master/doc/note/tokens.md\ntypedef struct {\n  uint64_t repr;\n\n#ifdef __cplusplus\n  inline int64_t value() const;\n  inline int64_t value_extension() const;\n  inline int64_t value_major() const;\n  inline int64_t value_base_category() const;\n  inline uint64_t value_minor() const;\n  inline uint64_t value_base_detail() const;\n  inline bool continued() const;\n  inline uint64_t length() const;\n#endif  // __cplusplus\n\n} wuffs_base__token;\n\nstatic inline wuffs_base__token  //\nwuffs_base__make_token(uint64_t repr) {\n  wuffs_base__token ret;\n  ret.repr = repr;\n  return ret;\n}\n\n  " +
 	"" +
-	"// --------\n\n#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF\n\n#define WUFFS_BASE__TOKEN__VALUE__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42\n#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 39\n#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 18\n#define WUFFS_BASE__TOKEN__LINK__SHIFT 16\n#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0\n\n#define WUFFS_BASE__TOKEN__LINK_PREV 0x20000\n#define WUFFS_BASE__TOKEN__LINK_NEXT 0x10000\n\n  " +
+	"// --------\n\n#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF\n\n#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17\n#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17\n#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42\n#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17\n#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38\n#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17\n#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16\n#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0\n\n  " +
 	"" +
 	"// --------\n\n#define WUFFS_BASE__TOKEN__VBC__FILLER 0\n#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1\n#define WUFFS_BASE__TOKEN__VBC__STRING 2\n#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3\n#define WUFFS_BASE__TOKEN__VBC__LITERAL 4\n#define WUFFS_BASE__TOKEN__VBC__NUMBER 5\n\n  " +
 	"" +
@@ -401,8 +401,8 @@
 	"ttle-endian or text. For binary formats, the\n// token length discriminates e.g. u16 little-endian vs u32 little-endian.\n#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100\n#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200\n#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400\n\n" +
 	"" +
 	"// --------\n\n// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A\n// negative value means an extended token, non-negative means a simple token.\nstatic inline int64_t  //\nwuffs_base__token__value(const wuffs_base__token* t) {\n  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT;\n}\n\n// wuffs_base__token__value_extension returns a negative value if the token was\n// not an extended token.\nstatic inline int64_t  //\nwuffs_base__token__value_extension(const wuffs_base__token* t) {\n  return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT;\n}\n\n// wuffs_base__token__value_major returns a negative value if the token was not\n// a simple token.\nstatic inline int64_t  //\nwuffs_base__token__value_major(const wuffs_base__token* t) {\n  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT;\n}\n\n// wuffs_base__token__value_base_category returns a negative value if the token\n// was not a simple token.\nstatic inline int64_t  //\nwuffs_base__token__value_base_cat" +
-	"egory(const wuffs_base__token* t) {\n  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__value_minor(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0xFFFFFF;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__value_base_detail(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;\n}\n\nstatic inline bool  //\nwuffs_base__token__link_prev(const wuffs_base__token* t) {\n  return t->repr & WUFFS_BASE__TOKEN__LINK_PREV;\n}\n\nstatic inline bool  //\nwuffs_base__token__link_next(const wuffs_base__token* t) {\n  return t->repr & WUFFS_BASE__TOKEN__LINK_NEXT;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__length(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;\n}\n\n#ifdef __cplusplus\n\ninline int64_t  //\nwuffs_base__token::value() const {\n  return wuffs_base__token__value(this);\n}\n\ninline int64_t  //\nwuffs_base_" +
-	"_token::value_extension() const {\n  return wuffs_base__token__value_extension(this);\n}\n\ninline int64_t  //\nwuffs_base__token::value_major() const {\n  return wuffs_base__token__value_major(this);\n}\n\ninline int64_t  //\nwuffs_base__token::value_base_category() const {\n  return wuffs_base__token__value_base_category(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::value_minor() const {\n  return wuffs_base__token__value_minor(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::value_base_detail() const {\n  return wuffs_base__token__value_base_detail(this);\n}\n\ninline bool  //\nwuffs_base__token::link_prev() const {\n  return wuffs_base__token__link_prev(this);\n}\n\ninline bool  //\nwuffs_base__token::link_next() const {\n  return wuffs_base__token__link_next(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::length() const {\n  return wuffs_base__token__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
+	"egory(const wuffs_base__token* t) {\n  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__value_minor(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__value_base_detail(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;\n}\n\nstatic inline bool  //\nwuffs_base__token__continued(const wuffs_base__token* t) {\n  return t->repr & 0x10000;\n}\n\nstatic inline uint64_t  //\nwuffs_base__token__length(const wuffs_base__token* t) {\n  return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;\n}\n\n#ifdef __cplusplus\n\ninline int64_t  //\nwuffs_base__token::value() const {\n  return wuffs_base__token__value(this);\n}\n\ninline int64_t  //\nwuffs_base__token::value_extension() const {\n  return wuffs_base__token__value_extension(this);\n}\n\ninline int64_t  //\nwuffs_base__token::value_major() const {\n  retu" +
+	"rn wuffs_base__token__value_major(this);\n}\n\ninline int64_t  //\nwuffs_base__token::value_base_category() const {\n  return wuffs_base__token__value_base_category(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::value_minor() const {\n  return wuffs_base__token__value_minor(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::value_base_detail() const {\n  return wuffs_base__token__value_base_detail(this);\n}\n\ninline bool  //\nwuffs_base__token::continued() const {\n  return wuffs_base__token__continued(this);\n}\n\ninline uint64_t  //\nwuffs_base__token::length() const {\n  return wuffs_base__token__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
 	"// --------\n\ntypedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token;\n\nstatic inline wuffs_base__slice_token  //\nwuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) {\n  wuffs_base__slice_token ret;\n  ret.ptr = ptr;\n  ret.len = len;\n  return ret;\n}\n\n" +
 	"" +
diff --git a/lang/builtin/builtin.go b/lang/builtin/builtin.go
index 1bd52cc..34ba6ec 100644
--- a/lang/builtin/builtin.go
+++ b/lang/builtin/builtin.go
@@ -332,8 +332,8 @@
 	// ---- token_writer
 
 	"token_writer.write_simple_token_fast!(" +
-		"value_major: u32[..= 0x1F_FFFF], value_minor: u32[..= 0xFF_FFFF]," +
-		"link: u32[..= 0x3], length: u32[..= 0xFFFF])",
+		"value_major: u32[..= 0x1F_FFFF], value_minor: u32[..= 0x1FF_FFFF]," +
+		"continued: u32[..= 0x1], length: u32[..= 0xFFFF])",
 
 	"token_writer.available() u64",
 
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 9b0b950..ed2198f 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -1888,8 +1888,7 @@
   inline int64_t value_base_category() const;
   inline uint64_t value_minor() const;
   inline uint64_t value_base_detail() const;
-  inline bool link_prev() const;
-  inline bool link_next() const;
+  inline bool continued() const;
   inline uint64_t length() const;
 #endif  // __cplusplus
 
@@ -1906,18 +1905,15 @@
 
 #define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
 
-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 18
-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 18
+#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17
 #define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42
-#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 39
-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 18
-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 18
-#define WUFFS_BASE__TOKEN__LINK__SHIFT 16
+#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
+#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17
+#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16
 #define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0
 
-#define WUFFS_BASE__TOKEN__LINK_PREV 0x20000
-#define WUFFS_BASE__TOKEN__LINK_NEXT 0x10000
-
   // --------
 
 #define WUFFS_BASE__TOKEN__VBC__FILLER 0
@@ -2038,7 +2034,7 @@
 
 static inline uint64_t  //
 wuffs_base__token__value_minor(const wuffs_base__token* t) {
-  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0xFFFFFF;
+  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
 }
 
 static inline uint64_t  //
@@ -2047,13 +2043,8 @@
 }
 
 static inline bool  //
-wuffs_base__token__link_prev(const wuffs_base__token* t) {
-  return t->repr & WUFFS_BASE__TOKEN__LINK_PREV;
-}
-
-static inline bool  //
-wuffs_base__token__link_next(const wuffs_base__token* t) {
-  return t->repr & WUFFS_BASE__TOKEN__LINK_NEXT;
+wuffs_base__token__continued(const wuffs_base__token* t) {
+  return t->repr & 0x10000;
 }
 
 static inline uint64_t  //
@@ -2094,13 +2085,8 @@
 }
 
 inline bool  //
-wuffs_base__token::link_prev() const {
-  return wuffs_base__token__link_prev(this);
-}
-
-inline bool  //
-wuffs_base__token::link_next() const {
-  return wuffs_base__token__link_next(this);
+wuffs_base__token::continued() const {
+  return wuffs_base__token__continued(this);
 }
 
 inline uint64_t  //
@@ -6135,9 +6121,6 @@
       uint32_t v_expect_after_value;
     } s_decode_tokens[1];
     struct {
-      uint32_t v_link_prev;
-    } s_decode_comment[1];
-    struct {
       uint32_t v_neg;
     } s_decode_inf_nan[1];
   } private_data;
@@ -21233,7 +21216,7 @@
         if (v_class == 1) {
           *iop_a_dst++ = wuffs_base__make_token(
               (((uint64_t)(4194323)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-              (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+              (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
               (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
           (iop_a_src += 1, wuffs_base__make_empty_struct());
         label__string_loop_outer__continue:;
@@ -21252,7 +21235,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194337))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(v_string_length))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   v_string_length = 0;
@@ -21281,7 +21264,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194337))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)((v_string_length + 4)))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   v_string_length = 0;
@@ -21298,7 +21281,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194337))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(65532))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   v_string_length = 0;
@@ -21311,7 +21294,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194337))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(v_string_length))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   v_string_length = 0;
@@ -21322,7 +21305,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194337))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(v_string_length))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   v_string_length = 0;
@@ -21352,7 +21335,7 @@
                       (((uint64_t)(
                            (6291456 | ((uint32_t)((v_backslash & 127))))))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   goto label__string_loop_outer__continue;
                 } else if (v_backslash != 0) {
@@ -21365,7 +21348,8 @@
                               ((uint32_t)(wuffs_json__lut_quirky_backslashes[(
                                   v_backslash & 7)])))))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
                   }
@@ -21411,7 +21395,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)((6291456 | v_uni4_value)))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(6)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
                   } else if (v_uni4_value >= 56320) {
@@ -21424,8 +21409,8 @@
                           *iop_a_dst++ = wuffs_base__make_token(
                               (((uint64_t)(6356989))
                                << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                              (((uint64_t)(3))
-                               << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                              (((uint64_t)(1))
+                               << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                               (((uint64_t)(6))
                                << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                           goto label__string_loop_outer__continue;
@@ -21481,7 +21466,8 @@
                           (((uint64_t)((6291456 | v_uni4_high_surrogate |
                                         v_uni4_value)))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)(12))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       goto label__string_loop_outer__continue;
@@ -21498,7 +21484,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(6356989))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(6)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
                   }
@@ -21562,7 +21549,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)((6291456 | (v_uni8_value & 2097151))))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(10)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
                   } else if (self->private_impl
@@ -21571,7 +21559,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(6356989))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(10)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
                   }
@@ -21619,7 +21608,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)(4194432))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(v_backslash_x_length))
                        << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   goto label__string_loop_outer__continue;
@@ -21633,7 +21622,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(4194337))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(v_string_length))
                          << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     v_string_length = 0;
@@ -21647,7 +21637,8 @@
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)(1))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       (iop_a_src += 1, wuffs_base__make_empty_struct());
@@ -21674,7 +21665,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(4194337))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)((v_string_length + 2)))
                          << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     v_string_length = 0;
@@ -21689,7 +21681,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(4194337))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(v_string_length))
                          << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     v_string_length = 0;
@@ -21703,7 +21696,8 @@
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)(1))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       (iop_a_src += 1, wuffs_base__make_empty_struct());
@@ -21734,7 +21728,8 @@
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(4194337))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)((v_string_length + 3)))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       v_string_length = 0;
@@ -21750,7 +21745,8 @@
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(4194337))
                          << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                        (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                        (((uint64_t)(1))
+                         << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(v_string_length))
                          << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     v_string_length = 0;
@@ -21764,7 +21760,8 @@
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)(1))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       (iop_a_src += 1, wuffs_base__make_empty_struct());
@@ -21795,7 +21792,8 @@
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(4194337))
                            << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                          (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                          (((uint64_t)(1))
+                           << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                           (((uint64_t)((v_string_length + 4)))
                            << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                       v_string_length = 0;
@@ -21810,7 +21808,7 @@
                 *iop_a_dst++ = wuffs_base__make_token(
                     (((uint64_t)(4194337))
                      << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                    (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                    (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                     (((uint64_t)(v_string_length))
                      << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                 v_string_length = 0;
@@ -21824,7 +21822,7 @@
                   *iop_a_dst++ = wuffs_base__make_token(
                       (((uint64_t)((6291456 | ((uint32_t)((v_char & 127))))))
                        << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                      (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                      (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                       (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                   (iop_a_src += 1, wuffs_base__make_empty_struct());
                   goto label__string_loop_outer__continue;
@@ -21837,7 +21835,7 @@
                 *iop_a_dst++ = wuffs_base__make_token(
                     (((uint64_t)(6356989))
                      << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                    (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                    (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                     (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                 (iop_a_src += 1, wuffs_base__make_empty_struct());
                 goto label__string_loop_outer__continue;
@@ -21869,7 +21867,6 @@
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(4194323))
                  << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
                 (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             goto label__2__break;
           }
@@ -22566,7 +22563,6 @@
 
   uint8_t v_c = 0;
   uint16_t v_c2 = 0;
-  uint32_t v_link_prev = 0;
   uint32_t v_length = 0;
 
   wuffs_base__token* iop_a_dst = NULL;
@@ -22594,9 +22590,6 @@
   }
 
   uint32_t coro_susp_point = self->private_impl.p_decode_comment[0];
-  if (coro_susp_point) {
-    v_link_prev = self->private_data.s_decode_comment[0].v_link_prev;
-  }
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
@@ -22633,10 +22626,8 @@
             if (v_length > 0) {
               *iop_a_dst++ = wuffs_base__make_token(
                   (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                  (((uint64_t)((1 | v_link_prev)))
-                   << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                  (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                   (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
-              v_link_prev = 2;
             }
             if (a_src && a_src->meta.closed) {
               status = wuffs_base__make_status(wuffs_json__error__bad_input);
@@ -22653,7 +22644,6 @@
             (iop_a_src += 2, wuffs_base__make_empty_struct());
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                (((uint64_t)(v_link_prev)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
                 (((uint64_t)((v_length + 2)))
                  << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             status = wuffs_base__make_status(NULL);
@@ -22663,12 +22653,10 @@
           if (v_length >= 65533) {
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                (((uint64_t)((1 | v_link_prev)))
-                 << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                 (((uint64_t)((v_length + 1)))
                  << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             v_length = 0;
-            v_link_prev = 2;
             goto label__comment_block__continue;
           }
           v_length += 1;
@@ -22691,10 +22679,8 @@
             if (v_length > 0) {
               *iop_a_dst++ = wuffs_base__make_token(
                   (((uint64_t)(1)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                  (((uint64_t)((1 | v_link_prev)))
-                   << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                  (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                   (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
-              v_link_prev = 2;
             }
             if (a_src && a_src->meta.closed) {
               status = wuffs_base__make_status(wuffs_json__error__bad_input);
@@ -22711,7 +22697,6 @@
             (iop_a_src += 1, wuffs_base__make_empty_struct());
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(1)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                (((uint64_t)(v_link_prev)) << WUFFS_BASE__TOKEN__LINK__SHIFT) |
                 (((uint64_t)((v_length + 1)))
                  << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             status = wuffs_base__make_status(NULL);
@@ -22721,12 +22706,10 @@
           if (v_length >= 65533) {
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(1)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
-                (((uint64_t)((1 | v_link_prev)))
-                 << WUFFS_BASE__TOKEN__LINK__SHIFT) |
+                (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                 (((uint64_t)((v_length + 1)))
                  << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             v_length = 0;
-            v_link_prev = 2;
             goto label__comment_line__continue;
           }
           v_length += 1;
@@ -22745,7 +22728,6 @@
 suspend:
   self->private_impl.p_decode_comment[0] =
       wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-  self->private_data.s_decode_comment[0].v_link_prev = v_link_prev;
 
   goto exit;
 exit:
diff --git a/script/print-json-token-debug-format.c b/script/print-json-token-debug-format.c
index 89877b9..e8a81bc 100644
--- a/script/print-json-token-debug-format.c
+++ b/script/print-json-token-debug-format.c
@@ -24,16 +24,15 @@
 // It prints 16 bytes (128 bits) per token, containing big-endian numbers:
 //
 // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
-// |               |       |   |   |   |      VALUE_EXTENSION      |
-// |      POS      |  LEN  | LP| LN|EXT|VALUE_MAJOR|  VALUE_MINOR  |
-// |               |       |   |   |   |     0     |VBC|    VBD    |
+// |               |       |       |   |      VALUE_EXTENSION      |
+// |      POS      |  LEN  |  CON  |EXT|VALUE_MAJOR|  VALUE_MINOR  |
+// |               |       |       |   |     0     |VBC|    VBD    |
 // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
 //
 //  - POS (4 bytes) is the position: the sum of all previous tokens' lengths,
 //                  including elided tokens.
 //  - LEN (2 bytes) is the length.
-//  - LP  (1 bytes) is the link_prev bit.
-//  - LN  (1 bytes) is the link_next bit
+//  - CON (2 bytes) is the continued bit
 //  - EXT (1 bytes) is 1 for extended and 0 for simple tokens.
 //
 // Extended tokens have a VALUE_EXTENSION (7 bytes).
@@ -54,8 +53,8 @@
 // If the input or output is larger than the program's buffers (64 MiB and
 // 131072 tokens by default), there may be multiple valid tokenizations of any
 // given input. For example, if a source string "abcde" straddles an I/O
-// boundary, it may be tokenized as single (no-link) 5-length string or as a
-// 3-length link_next'ed string followed by a 2-length link_prev'ed string.
+// boundary, it may be tokenized as single (not continued) 5-length string or
+// as a 3-length continued string followed by a 2-length string.
 //
 // A Wuffs token stream, in general, can support inputs more than 0xFFFF_FFFF
 // bytes long, but this program can not, as it tracks the tokens' cumulative
@@ -202,7 +201,7 @@
   return NULL;
 }
 
-const char* g_vbc_names[8] = {
+const char* g_vbc_names[16] = {
     "0:Filler..........",  //
     "1:Structure.......",  //
     "2:String..........",  //
@@ -211,6 +210,14 @@
     "5:Number..........",  //
     "6:Reserved........",  //
     "7:Reserved........",  //
+    "8:Reserved........",  //
+    "9:Reserved........",  //
+    "A:Reserved........",  //
+    "B:Reserved........",  //
+    "C:Reserved........",  //
+    "D:Reserved........",  //
+    "E:Reserved........",  //
+    "F:Reserved........",  //
 };
 
 const int g_base38_decode[38] = {
@@ -277,16 +284,15 @@
       uint16_t len = wuffs_base__token__length(t);
 
       if (g_flags.all_tokens || (wuffs_base__token__value(t) != 0)) {
-        uint8_t lp = wuffs_base__token__link_prev(t) ? 1 : 0;
-        uint8_t ln = wuffs_base__token__link_next(t) ? 1 : 0;
+        uint16_t con = wuffs_base__token__continued(t) ? 1 : 0;
         int32_t vmajor = wuffs_base__token__value_major(t);
         uint32_t vminor = wuffs_base__token__value_minor(t);
         uint8_t vbc = wuffs_base__token__value_base_category(t);
         uint32_t vbd = wuffs_base__token__value_base_detail(t);
 
         if (g_flags.human_readable) {
-          printf("pos=0x%08" PRIX32 "  len=0x%04" PRIX16 "  link=0b%d%d  ",
-                 (uint32_t)(pos), len, (int)(lp), (int)(ln));
+          printf("pos=0x%08" PRIX32 "  len=0x%04" PRIX16 "  con=%" PRId16 "  ",
+                 (uint32_t)(pos), len, con);
 
           if (vmajor > 0) {
             uint32_t m = vmajor;
@@ -302,7 +308,8 @@
                    vmajor, g_base38_decode[m0], g_base38_decode[m1],
                    g_base38_decode[m2], g_base38_decode[m3], vminor);
           } else if (vmajor == 0) {
-            printf("vbc=%s.  vbd=0x%06" PRIX32 "\n", g_vbc_names[vbc & 7], vbd);
+            printf("vbc=%s.  vbd=0x%06" PRIX32 "\n", g_vbc_names[vbc & 15],
+                   vbd);
           } else {
             printf("extended... vextension=0x%012" PRIX64 "\n",
                    wuffs_base__token__value_extension(t));
@@ -312,8 +319,7 @@
           uint8_t buf[16];
           wuffs_base__store_u32be__no_bounds_check(&buf[0x0], (uint32_t)(pos));
           wuffs_base__store_u16be__no_bounds_check(&buf[0x4], len);
-          wuffs_base__store_u8__no_bounds_check(&buf[0x0006], lp);
-          wuffs_base__store_u8__no_bounds_check(&buf[0x0007], ln);
+          wuffs_base__store_u16be__no_bounds_check(&buf[0x6], con);
           if (vmajor > 0) {
             wuffs_base__store_u32be__no_bounds_check(&buf[0x8], vmajor);
             wuffs_base__store_u32be__no_bounds_check(&buf[0xC], vminor);
diff --git a/std/json/decode_json.wuffs b/std/json/decode_json.wuffs
index c5169d3..44f78e0 100644
--- a/std/json/decode_json.wuffs
+++ b/std/json/decode_json.wuffs
@@ -188,7 +188,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0,
-						link: 0x0,
+						continued: 0,
 						length: whitespace_length)
 					whitespace_length = 0
 				}
@@ -211,7 +211,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0,
-					link: 0x0,
+					continued: 0,
 					length: 0xFFFF)
 				whitespace_length = 0
 				continue.outer
@@ -224,7 +224,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0,
-				link: 0x0,
+				continued: 0,
 				length: whitespace_length)
 			whitespace_length = 0
 			if args.dst.available() <= 0 {
@@ -250,7 +250,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0x40_0013,
-				link: 0x1,
+				continued: 1,
 				length: 1)
 			args.src.skip32_fast!(actual: 1, worst_case: 1)
 
@@ -269,7 +269,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0021,
-								link: 0x3,
+								continued: 1,
 								length: string_length)
 							string_length = 0
 						}
@@ -299,7 +299,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0021,
-								link: 0x3,
+								continued: 1,
 								length: string_length + 4)
 							string_length = 0
 							continue.string_loop_outer
@@ -316,7 +316,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0021,
-								link: 0x3,
+								continued: 1,
 								length: 0xFFFC)
 							string_length = 0
 							continue.string_loop_outer
@@ -329,7 +329,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0021,
-								link: 0x3,
+								continued: 1,
 								length: string_length)
 							string_length = 0
 						}
@@ -340,7 +340,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0021,
-								link: 0x3,
+								continued: 1,
 								length: string_length)
 							string_length = 0
 							if args.dst.available() <= 0 {
@@ -365,7 +365,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x60_0000 | ((backslash & 0x7F) as base.u32),
-								link: 0x3,
+								continued: 1,
 								length: 2)
 							continue.string_loop_outer
 
@@ -375,7 +375,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x60_0000 | (lut_quirky_backslashes[backslash & 7] as base.u32),
-									link: 0x3,
+									continued: 1,
 									length: 2)
 								continue.string_loop_outer
 							}
@@ -419,7 +419,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x60_0000 | uni4_value,
-									link: 0x3,
+									continued: 1,
 									length: 6)
 								continue.string_loop_outer
 
@@ -440,7 +440,7 @@
 											args.dst.write_simple_token_fast!(
 												value_major: 0,
 												value_minor: 0x60_FFFD,
-												link: 0x3,
+												continued: 1,
 												length: 6)
 											continue.string_loop_outer
 										}
@@ -491,7 +491,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x60_0000 | uni4_high_surrogate | uni4_value,
-										link: 0x3,
+										continued: 1,
 										length: 12)
 									continue.string_loop_outer
 								}
@@ -505,7 +505,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x60_FFFD,
-									link: 0x3,
+									continued: 1,
 									length: 6)
 								continue.string_loop_outer
 							}
@@ -563,7 +563,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x60_0000 | (uni8_value & 0x1F_FFFF),
-									link: 0x3,
+									continued: 1,
 									length: 10)
 								continue.string_loop_outer
 							} else if this.quirk_enabled_replace_invalid_unicode {
@@ -571,7 +571,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x60_FFFD,
-									link: 0x3,
+									continued: 1,
 									length: 10)
 								continue.string_loop_outer
 							}
@@ -618,7 +618,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x40_0080,
-								link: 0x3,
+								continued: 1,
 								length: backslash_x_length)
 							continue.string_loop_outer
 							// -------- END   backslash-x
@@ -632,7 +632,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x40_0021,
-									link: 0x3,
+									continued: 1,
 									length: string_length)
 								string_length = 0
 								if args.dst.available() <= 0 {
@@ -644,7 +644,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x60_FFFD,
-										link: 0x3,
+										continued: 1,
 										length: 1)
 									args.src.skip32_fast!(actual: 1, worst_case: 1)
 									continue.string_loop_outer
@@ -665,7 +665,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x40_0021,
-									link: 0x3,
+									continued: 1,
 									length: string_length + 2)
 								string_length = 0
 								continue.string_loop_outer
@@ -680,7 +680,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x40_0021,
-									link: 0x3,
+									continued: 1,
 									length: string_length)
 								string_length = 0
 								if args.dst.available() <= 0 {
@@ -692,7 +692,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x60_FFFD,
-										link: 0x3,
+										continued: 1,
 										length: 1)
 									args.src.skip32_fast!(actual: 1, worst_case: 1)
 									continue.string_loop_outer
@@ -717,7 +717,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x40_0021,
-										link: 0x3,
+										continued: 1,
 										length: string_length + 3)
 									string_length = 0
 									continue.string_loop_outer
@@ -733,7 +733,7 @@
 								args.dst.write_simple_token_fast!(
 									value_major: 0,
 									value_minor: 0x40_0021,
-									link: 0x3,
+									continued: 1,
 									length: string_length)
 								string_length = 0
 								if args.dst.available() <= 0 {
@@ -745,7 +745,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x60_FFFD,
-										link: 0x3,
+										continued: 1,
 										length: 1)
 									args.src.skip32_fast!(actual: 1, worst_case: 1)
 									continue.string_loop_outer
@@ -769,7 +769,7 @@
 									args.dst.write_simple_token_fast!(
 										value_major: 0,
 										value_minor: 0x40_0021,
-										link: 0x3,
+										continued: 1,
 										length: string_length + 4)
 									string_length = 0
 									continue.string_loop_outer
@@ -784,7 +784,7 @@
 						args.dst.write_simple_token_fast!(
 							value_major: 0,
 							value_minor: 0x40_0021,
-							link: 0x3,
+							continued: 1,
 							length: string_length)
 						string_length = 0
 						if args.dst.available() <= 0 {
@@ -796,7 +796,7 @@
 							args.dst.write_simple_token_fast!(
 								value_major: 0,
 								value_minor: 0x60_0000 | ((char & 0x7F) as base.u32),
-								link: 0x3,
+								continued: 1,
 								length: 1)
 							args.src.skip32_fast!(actual: 1, worst_case: 1)
 							continue.string_loop_outer
@@ -807,7 +807,7 @@
 						args.dst.write_simple_token_fast!(
 							value_major: 0,
 							value_minor: 0x60_FFFD,
-							link: 0x3,
+							continued: 1,
 							length: 1)
 						args.src.skip32_fast!(actual: 1, worst_case: 1)
 						continue.string_loop_outer
@@ -833,7 +833,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x40_0013,
-					link: 0x2,
+					continued: 0,
 					length: 1)
 				break
 			} endwhile
@@ -854,7 +854,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0,
-				link: 0x0,
+				continued: 0,
 				length: 1)
 			// What's valid after a comma depends on whether or not we're in an
 			// array or an object.
@@ -879,7 +879,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0,
-				link: 0x0,
+				continued: 0,
 				length: 1)
 			expect = 0x1EB2  // 0x1EB2 is EXPECT_VALUE.
 			continue.outer
@@ -900,7 +900,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: vminor,
-						link: 0x0,
+						continued: 0,
 						length: number_length)
 					break
 				}
@@ -955,7 +955,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: vminor,
-				link: 0x0,
+				continued: 0,
 				length: 1)
 			expect = 0x1042  // 0x1042 is (EXPECT_CLOSE_CURLY_BRACE | EXPECT_STRING).
 			expect_after_value = 0x1044  // 0x1044 is (EXPECT_CURLY_CLOSE_BRACE | EXPECT_COMMA).
@@ -967,7 +967,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_1042,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				break.outer
 			}
@@ -978,7 +978,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_2042,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				// 0x1104 is (EXPECT_SQUARE_CLOSE_BRACKET | EXPECT_COMMA).
 				expect = 0x1104
@@ -987,7 +987,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_4042,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				// 0x1044 is (EXPECT_CURLY_CLOSE_BRACE | EXPECT_COMMA).
 				expect = 0x1044
@@ -1016,7 +1016,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: vminor,
-				link: 0x0,
+				continued: 0,
 				length: 1)
 			expect = 0x1FB2  // 0x1FB2 is (EXPECT_CLOSE_SQUARE_BRACKET | EXPECT_VALUE).
 			expect_after_value = 0x1104  // 0x1104 is (EXPECT_CLOSE_SQUARE_BRACKET | EXPECT_COMMA).
@@ -1028,7 +1028,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_1022,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				break.outer
 			}
@@ -1039,7 +1039,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_2022,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				// 0x1104 is (EXPECT_CLOSE_SQUARE_BRACKET | EXPECT_COMMA).
 				expect = 0x1104
@@ -1048,7 +1048,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x20_4022,
-					link: 0x0,
+					continued: 0,
 					length: 1)
 				// 0x1044 is (EXPECT_CLOSE_CURLY_BRACE | EXPECT_COMMA).
 				expect = 0x1044
@@ -1062,7 +1062,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x80_0004,
-					link: 0x0,
+					continued: 0,
 					length: 5)
 				if args.src.available() < 5 {
 					return "#internal error: inconsistent I/O"
@@ -1080,7 +1080,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x80_0008,
-					link: 0x0,
+					continued: 0,
 					length: 4)
 				if args.src.available() < 4 {
 					return "#internal error: inconsistent I/O"
@@ -1098,7 +1098,7 @@
 				args.dst.write_simple_token_fast!(
 					value_major: 0,
 					value_minor: 0x80_0002,
-					link: 0x0,
+					continued: 0,
 					length: 4)
 				if args.src.available() < 4 {
 					return "#internal error: inconsistent I/O"
@@ -1339,7 +1339,7 @@
 			this.allow_leading_ars = false
 			args.src.skip32_fast!(actual: 1, worst_case: 1)
 			args.dst.write_simple_token_fast!(
-				value_major: 0, value_minor: 0, link: 0x0, length: 1)
+				value_major: 0, value_minor: 0, continued: 0, length: 1)
 			continue
 		} else if (c == 0xEF) and this.allow_leading_ubom {
 			if args.src.available() < 3 {
@@ -1354,7 +1354,7 @@
 				this.allow_leading_ubom = false
 				args.src.skip32_fast!(actual: 3, worst_case: 3)
 				args.dst.write_simple_token_fast!(
-					value_major: 0, value_minor: 0, link: 0x0, length: 3)
+					value_major: 0, value_minor: 0, continued: 0, length: 3)
 				continue
 			}
 		}
@@ -1363,10 +1363,9 @@
 }
 
 pri func decoder.decode_comment?(dst: base.token_writer, src: base.io_reader) {
-	var c         : base.u8
-	var c2        : base.u16
-	var link_prev : base.u32[..= 0x2]
-	var length    : base.u32[..= 0xFFFD]
+	var c      : base.u8
+	var c2     : base.u16
+	var length : base.u32[..= 0xFFFD]
 
 	while (args.dst.available() <= 0) or (args.src.available() <= 1),
 		post args.dst.available() > 0,
@@ -1402,9 +1401,8 @@
 						args.dst.write_simple_token_fast!(
 							value_major: 0,
 							value_minor: 0x2,
-							link: 0x1 | link_prev,
+							continued: 1,
 							length: length)
-						link_prev = 0x2
 					}
 					if args.src.is_closed() {
 						return "#bad input"
@@ -1420,7 +1418,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0x2,
-						link: link_prev,
+						continued: 0,
 						length: length + 2)
 					return ok
 				}
@@ -1430,10 +1428,9 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0x2,
-						link: 0x1 | link_prev,
+						continued: 1,
 						length: length + 1)
 					length = 0
-					link_prev = 0x2
 					continue.comment_block
 				}
 				length += 1
@@ -1459,9 +1456,8 @@
 						args.dst.write_simple_token_fast!(
 							value_major: 0,
 							value_minor: 0x1,
-							link: 0x1 | link_prev,
+							continued: 1,
 							length: length)
-						link_prev = 0x2
 					}
 					if args.src.is_closed() {
 						return "#bad input"
@@ -1477,7 +1473,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0x1,
-						link: link_prev,
+						continued: 0,
 						length: length + 1)
 					return ok
 				}
@@ -1487,10 +1483,9 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0x1,
-						link: 0x1 | link_prev,
+						continued: 1,
 						length: length + 1)
 					length = 0
-					link_prev = 0x2
 					continue.comment_line
 				}
 				length += 1
@@ -1527,7 +1522,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0xA0_0020,
-						link: 0x0,
+						continued: 0,
 						length: 8)
 					args.src.skip32_fast!(actual: 8, worst_case: 8)
 					return ok
@@ -1539,7 +1534,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0xA0_0020,
-				link: 0x0,
+				continued: 0,
 				length: 3)
 			args.src.skip32_fast!(actual: 3, worst_case: 3)
 			return ok
@@ -1548,7 +1543,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0xA0_0080,
-				link: 0x0,
+				continued: 0,
 				length: 3)
 			args.src.skip32_fast!(actual: 3, worst_case: 3)
 			return ok
@@ -1575,7 +1570,7 @@
 					args.dst.write_simple_token_fast!(
 						value_major: 0,
 						value_minor: 0xA0_0000 | ((0x20 as base.u32) >> neg),
-						link: 0x0,
+						continued: 0,
 						length: 9)
 					args.src.skip32_fast!(actual: 9, worst_case: 9)
 					return ok
@@ -1587,7 +1582,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0xA0_0000 | ((0x20 as base.u32) >> neg),
-				link: 0x0,
+				continued: 0,
 				length: 4)
 			args.src.skip32_fast!(actual: 4, worst_case: 4)
 			return ok
@@ -1596,7 +1591,7 @@
 			args.dst.write_simple_token_fast!(
 				value_major: 0,
 				value_minor: 0xA0_0000 | ((0x80 as base.u32) >> neg),
-				link: 0x0,
+				continued: 0,
 				length: 4)
 			args.src.skip32_fast!(actual: 4, worst_case: 4)
 			return ok
@@ -1623,7 +1618,7 @@
 			if args.src.available() <= 0 {
 				if whitespace_length > 0 {
 					args.dst.write_simple_token_fast!(
-						value_major: 0, value_minor: 0, link: 0x0, length: whitespace_length)
+						value_major: 0, value_minor: 0, continued: 0, length: whitespace_length)
 					whitespace_length = 0
 				}
 				if args.src.is_closed() {
@@ -1638,7 +1633,7 @@
 			if lut_classes[c] <> 0x00 {  // 0x00 is CLASS_WHITESPACE.
 				if whitespace_length > 0 {
 					args.dst.write_simple_token_fast!(
-						value_major: 0, value_minor: 0, link: 0x0, length: whitespace_length)
+						value_major: 0, value_minor: 0, continued: 0, length: whitespace_length)
 					whitespace_length = 0
 				}
 				return "#bad input"
@@ -1647,7 +1642,7 @@
 			args.src.skip32_fast!(actual: 1, worst_case: 1)
 			if (whitespace_length >= 0xFFFE) or (c == '\n') {
 				args.dst.write_simple_token_fast!(
-					value_major: 0, value_minor: 0, link: 0x0, length: whitespace_length + 1)
+					value_major: 0, value_minor: 0, continued: 0, length: whitespace_length + 1)
 				whitespace_length = 0
 				if c == '\n' {
 					break.outer
diff --git a/test/c/testlib/testlib.c b/test/c/testlib/testlib.c
index 8b82fb9..657e44a 100644
--- a/test/c/testlib/testlib.c
+++ b/test/c/testlib/testlib.c
@@ -1136,8 +1136,7 @@
     uint16_t len = wuffs_base__token__length(t);
 
     if (wuffs_base__token__value(t) != 0) {
-      uint8_t lp = wuffs_base__token__link_prev(t) ? 1 : 0;
-      uint8_t ln = wuffs_base__token__link_next(t) ? 1 : 0;
+      uint16_t con = wuffs_base__token__continued(t) ? 1 : 0;
       int32_t vmajor = wuffs_base__token__value_major(t);
 
       if ((have.data.len - have.meta.wi) < 16) {
@@ -1149,8 +1148,7 @@
 
       wuffs_base__store_u32be__no_bounds_check(ptr + 0x0, (uint32_t)(pos));
       wuffs_base__store_u16be__no_bounds_check(ptr + 0x4, len);
-      wuffs_base__store_u8__no_bounds_check(ptr + 0x0006, lp);
-      wuffs_base__store_u8__no_bounds_check(ptr + 0x0007, ln);
+      wuffs_base__store_u16be__no_bounds_check(ptr + 0x6, con);
       if (vmajor > 0) {
         wuffs_base__store_u32be__no_bounds_check(ptr + 0x8, vmajor);
         uint32_t vminor = wuffs_base__token__value_minor(t);
diff --git a/test/data/australian-abc-local-stations.tokens b/test/data/australian-abc-local-stations.tokens
index 4274df8..1750ef5 100644
--- a/test/data/australian-abc-local-stations.tokens
+++ b/test/data/australian-abc-local-stations.tokens
Binary files differ
diff --git a/test/data/json-quirks.tokens b/test/data/json-quirks.tokens
index d8feab9..d2518f2 100644
--- a/test/data/json-quirks.tokens
+++ b/test/data/json-quirks.tokens
Binary files differ
diff --git a/test/data/json-things.unformatted.tokens b/test/data/json-things.unformatted.tokens
index 8fa0137..7bab270 100644
--- a/test/data/json-things.unformatted.tokens
+++ b/test/data/json-things.unformatted.tokens
Binary files differ